-
Notifications
You must be signed in to change notification settings - Fork 1
[Simple Analytics] Add Data Layer & Form Event Tracking #204
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: feature/analytics-admin-page
Are you sure you want to change the base?
Changes from 1 commit
32e9d80
fd8d824
fd10548
af36860
c9e70bf
db85ff8
d502e39
2910bf8
7e0cb95
b912629
b7a201d
dfa1f5d
2275cc9
8d5d146
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,218 @@ | ||
| <?php | ||
| /** | ||
| * Class responsible for form analytics data storage and retrieval. | ||
| * | ||
| * @package Mailchimp | ||
| */ | ||
|
|
||
| // Exit if accessed directly. | ||
| if ( ! defined( 'ABSPATH' ) ) { | ||
| exit; | ||
| } | ||
|
|
||
| /** | ||
| * Class Mailchimp_Analytics_Data | ||
| */ | ||
| class Mailchimp_Analytics_Data { | ||
|
|
||
| /** | ||
| * Database version for the analytics table. | ||
| * | ||
| * @var string | ||
| */ | ||
| const DB_VERSION = '1.0'; | ||
alaca marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| /** | ||
| * Initialize the class. | ||
| */ | ||
| public function init() { | ||
| add_action( 'wp_ajax_mailchimp_sf_track_form_view', array( $this, 'handle_form_view' ) ); | ||
| add_action( 'wp_ajax_nopriv_mailchimp_sf_track_form_view', array( $this, 'handle_form_view' ) ); | ||
| add_action( 'mailchimp_sf_form_submission_success', array( $this, 'track_submission' ) ); | ||
| } | ||
|
Comment on lines
+28
to
+33
|
||
|
|
||
| /** | ||
| * Get the analytics table name. | ||
| * | ||
| * @return string | ||
| */ | ||
| public static function get_table_name() { | ||
| global $wpdb; | ||
| return $wpdb->prefix . 'mailchimp_sf_form_analytics'; | ||
| } | ||
|
|
||
| /** | ||
| * Create the analytics table. | ||
| */ | ||
| public static function create_table() { | ||
| global $wpdb; | ||
|
|
||
| $table_name = self::get_table_name(); | ||
| $charset_collate = $wpdb->get_charset_collate(); | ||
|
|
||
| $sql = "CREATE TABLE {$table_name} ( | ||
| id bigint(20) unsigned NOT NULL AUTO_INCREMENT, | ||
| list_id varchar(20) NOT NULL, | ||
| form_id varchar(50) NOT NULL DEFAULT '', | ||
| event_date date NOT NULL, | ||
| views bigint(20) unsigned NOT NULL DEFAULT 0, | ||
| submissions bigint(20) unsigned NOT NULL DEFAULT 0, | ||
| PRIMARY KEY (id), | ||
| UNIQUE KEY list_form_date (list_id, form_id, event_date) | ||
| ) {$charset_collate};"; | ||
|
|
||
| require_once ABSPATH . 'wp-admin/includes/upgrade.php'; | ||
| dbDelta( $sql ); | ||
|
|
||
| update_option( 'mailchimp_sf_analytics_db_version', self::DB_VERSION ); | ||
| } | ||
|
|
||
| /** | ||
| * Increment the view count for a list on today's date. | ||
| * | ||
| * @param string $list_id The list ID. | ||
| * @param string $form_id The form ID. | ||
| */ | ||
| public function increment_views( $list_id, $form_id = '' ) { | ||
| global $wpdb; | ||
|
|
||
| $table_name = self::get_table_name(); | ||
|
|
||
| // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared | ||
| $wpdb->query( | ||
| $wpdb->prepare( | ||
| "INSERT INTO {$table_name} (list_id, form_id, event_date, views, submissions) | ||
| VALUES (%s, %s, %s, 1, 0) | ||
| ON DUPLICATE KEY UPDATE views = views + 1", | ||
| $list_id, | ||
| $form_id, | ||
| current_time( 'Y-m-d' ) | ||
| ) | ||
| ); | ||
alaca marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared | ||
| } | ||
|
|
||
| /** | ||
| * Increment the submission count for a list on today's date. | ||
| * | ||
| * @param string $list_id The list ID. | ||
| * @param string $form_id The form ID. | ||
| */ | ||
| public function increment_submissions( $list_id, $form_id = '' ) { | ||
| global $wpdb; | ||
|
|
||
| $table_name = self::get_table_name(); | ||
|
|
||
| // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared | ||
| $wpdb->query( | ||
| $wpdb->prepare( | ||
| "INSERT INTO {$table_name} (list_id, form_id, event_date, views, submissions) | ||
| VALUES (%s, %s, %s, 0, 1) | ||
| ON DUPLICATE KEY UPDATE submissions = submissions + 1", | ||
| $list_id, | ||
| $form_id, | ||
| current_time( 'Y-m-d' ) | ||
| ) | ||
| ); | ||
alaca marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared | ||
| } | ||
|
|
||
| /** | ||
| * Get analytics data for a list within a date range. | ||
| * | ||
| * @param string $list_id The list ID. | ||
| * @param string $start_date Start date (Y-m-d). | ||
| * @param string $end_date End date (Y-m-d). | ||
| * @return array Array of daily analytics rows. | ||
| */ | ||
| public function get_analytics_data( $list_id, $start_date, $end_date ) { | ||
| global $wpdb; | ||
|
|
||
| $table_name = self::get_table_name(); | ||
|
|
||
| // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared | ||
| $results = $wpdb->get_results( | ||
| $wpdb->prepare( | ||
| "SELECT event_date, SUM(views) AS views, SUM(submissions) AS submissions | ||
| FROM {$table_name} | ||
| WHERE list_id = %s AND event_date BETWEEN %s AND %s | ||
| GROUP BY event_date | ||
| ORDER BY event_date ASC", | ||
| $list_id, | ||
| $start_date, | ||
| $end_date | ||
| ), | ||
| ARRAY_A | ||
| ); | ||
| // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared | ||
|
|
||
| return $results; | ||
| } | ||
|
|
||
| /** | ||
| * Get totals for a list within a date range. | ||
| * | ||
| * @param string $list_id The list ID. | ||
| * @param string $start_date Start date (Y-m-d). | ||
| * @param string $end_date End date (Y-m-d). | ||
| * @return array Associative array with total views and submissions. | ||
| */ | ||
| public function get_totals( $list_id, $start_date, $end_date ) { | ||
| global $wpdb; | ||
|
|
||
| $table_name = self::get_table_name(); | ||
|
|
||
| // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared | ||
| $result = $wpdb->get_row( | ||
| $wpdb->prepare( | ||
| "SELECT COALESCE(SUM(views), 0) AS total_views, COALESCE(SUM(submissions), 0) AS total_submissions | ||
| FROM {$table_name} | ||
| WHERE list_id = %s AND event_date BETWEEN %s AND %s", | ||
| $list_id, | ||
| $start_date, | ||
| $end_date | ||
| ), | ||
| ARRAY_A | ||
| ); | ||
| // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared | ||
|
|
||
| if ( ! $result ) { | ||
| return array( | ||
| 'total_views' => 0, | ||
| 'total_submissions' => 0, | ||
| ); | ||
| } | ||
|
|
||
| return $result; | ||
| } | ||
|
|
||
| /** | ||
| * Handle the AJAX form view tracking request. | ||
| */ | ||
| public function handle_form_view() { | ||
| // Verify nonce. | ||
| if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['nonce'] ), 'mailchimp_sf_analytics_nonce' ) ) { | ||
| wp_send_json_error( 'Invalid nonce.', 403 ); | ||
| } | ||
|
|
||
| $list_id = isset( $_POST['list_id'] ) ? sanitize_text_field( wp_unslash( $_POST['list_id'] ) ) : ''; | ||
|
|
||
| if ( empty( $list_id ) ) { | ||
| wp_send_json_error( 'Missing list_id.', 400 ); | ||
| } | ||
|
|
||
| $this->increment_views( $list_id ); | ||
| wp_send_json_success(); | ||
| } | ||
|
|
||
| /** | ||
alaca marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| * Track a successful form submission. | ||
| * | ||
| * @param string $list_id The list ID. | ||
| */ | ||
| public function track_submission( $list_id ) { | ||
| if ( ! empty( $list_id ) ) { | ||
| $this->increment_submissions( $list_id ); | ||
| } | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -97,6 +97,5 @@ public function enqueue_scripts( $hook_suffix ) { | |
| MCSF_VER, | ||
| true | ||
| ); | ||
|
|
||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -26,6 +26,12 @@ function mailchimp_version_check() { | |
| mailchimp_update_1_7_0(); | ||
| } | ||
|
|
||
| // Create analytics table if it doesn't exist. | ||
| $analytics_db_version = get_option( 'mailchimp_sf_analytics_db_version' ); | ||
| if ( false === $analytics_db_version || version_compare( Mailchimp_Analytics_Data::DB_VERSION, $analytics_db_version, '>' ) ) { | ||
| Mailchimp_Analytics_Data::create_table(); | ||
| } | ||
|
Comment on lines
+29
to
+33
|
||
|
|
||
| update_option( 'mc_version', MCSF_VER ); | ||
| } | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.