settings ); } /** * Constructor * Init and hook in the integration. */ public function __construct() { $this->id = 'google_analytics'; $this->method_title = __( 'Google Analytics', 'woocommerce-google-analytics-integration' ); $this->method_description = __( 'Google Analytics is a free service offered by Google that generates detailed statistics about the visitors to a website.', 'woocommerce-google-analytics-integration' ); // Load the settings $this->init_form_fields(); $this->init_settings(); add_action( 'admin_notices', array( $this, 'universal_analytics_upgrade_notice' ) ); include_once 'class-wc-abstract-google-analytics-js.php'; include_once 'class-wc-google-gtag-js.php'; if ( ! $this->disable_tracking( 'all' ) ) { $this->get_tracking_instance(); } // Display a task on "Things to do next section" add_action( 'init', array( $this, 'add_wc_setup_task' ), 20 ); // Admin Options add_filter( 'woocommerce_tracker_data', array( $this, 'track_settings' ) ); add_action( 'woocommerce_update_options_integration_google_analytics', array( $this, 'process_admin_options' ) ); add_action( 'woocommerce_update_options_integration_google_analytics', array( $this, 'show_options_info' ) ); add_action( 'admin_init', array( $this, 'privacy_policy' ) ); // utm_nooverride parameter for Google AdWords add_filter( 'woocommerce_get_return_url', array( $this, 'utm_nooverride' ) ); // Dequeue the WooCommerce Blocks Google Analytics integration, // not to let it register its `gtag` function so that we could provide a more detailed configuration. add_action( 'wp_enqueue_scripts', function () { wp_dequeue_script( 'wc-blocks-google-analytics' ); } ); } /** * Conditionally display an error notice to the merchant if the stored property ID starts with "UA" * * @return void */ public function universal_analytics_upgrade_notice() { if ( 'ua' === substr( strtolower( $this->get_option( 'ga_id' ) ), 0, 2 ) ) { printf( '

%2$s

', 'notice notice-error', sprintf( /* translators: 1) URL for Google documentation on upgrading from UA to GA4 2) URL to WooCommerce Google Analytics settings page */ esc_html__( 'Your website is configured to use Universal Analytics which Google retired in July of 2023. Update your account using the %1$ssetup assistant%2$s and then update your %3$sWooCommerce settings%4$s.', 'woocommerce-google-analytics-integration' ), '', '', '', '' ) ); } } /** * Tells WooCommerce which settings to display under the "integration" tab */ public function init_form_fields() { $this->form_fields = array( 'ga_product_identifier' => array( 'title' => __( 'Product Identification', 'woocommerce-google-analytics-integration' ), 'description' => __( 'Specify how your products will be identified to Google Analytics. Changing this setting may cause issues with historical data if a product was previously identified using a different structure.', 'woocommerce-google-analytics-integration' ), 'type' => 'select', 'options' => array( 'product_id' => __( 'Product ID', 'woocommerce-google-analytics-integration' ), 'product_sku' => __( 'Product SKU with prefixed (#) ID as fallback', 'woocommerce-google-analytics-integration' ), ), // If the option is not set then the product SKU is used as default for existing installations 'default' => 'product_sku', ), 'ga_id' => array( 'title' => __( 'Google Analytics Tracking ID', 'woocommerce-google-analytics-integration' ), 'description' => __( 'Log into your Google Analytics account to find your ID. e.g. GT-XXXXX or G-XXXXX', 'woocommerce-google-analytics-integration' ), 'type' => 'text', 'placeholder' => 'GT-XXXXX', 'default' => get_option( 'woocommerce_ga_id' ), // Backwards compat ), 'ga_support_display_advertising' => array( 'label' => __( '"Display Advertising" Support', 'woocommerce-google-analytics-integration' ), /* translators: Read more link */ 'description' => sprintf( __( 'Set the Google Analytics code to support Display Advertising. %1$sRead more about Display Advertising%2$s.', 'woocommerce-google-analytics-integration' ), '', '' ), 'type' => 'checkbox', 'checkboxgroup' => '', 'default' => get_option( 'woocommerce_ga_support_display_advertising' ) ? get_option( 'woocommerce_ga_support_display_advertising' ) : 'yes', // Backwards compat ), 'ga_404_tracking_enabled' => array( 'label' => __( 'Track 404 (Not found) Errors', 'woocommerce-google-analytics-integration' ), /* translators: Read more link */ 'description' => sprintf( __( 'Enable this to find broken or dead links. An "Event" with category "Error" and action "404 Not Found" will be created in Google Analytics for each incoming pageview to a non-existing page. By setting up a "Custom Goal" for these events within Google Analytics you can find out where broken links originated from (the referrer). %1$sRead how to set up a goal%2$s.', 'woocommerce-google-analytics-integration' ), '', '' ), 'type' => 'checkbox', 'checkboxgroup' => '', 'default' => 'yes', ), 'ga_linker_allow_incoming_enabled' => array( 'label' => __( 'Accept Incoming Linker Parameters', 'woocommerce-google-analytics-integration' ), 'description' => __( 'Enabling this option will allow incoming linker parameters from other websites.', 'woocommerce-google-analytics-integration' ), 'type' => 'checkbox', 'checkboxgroup' => '', 'default' => 'no', ), 'ga_ecommerce_tracking_enabled' => array( 'title' => __( 'Event Tracking', 'woocommerce-google-analytics-integration' ), 'label' => __( 'Purchase Transactions', 'woocommerce-google-analytics-integration' ), 'description' => __( 'This requires a payment gateway that redirects to the thank you/order received page after payment. Orders paid with gateways which do not do this will not be tracked.', 'woocommerce-google-analytics-integration' ), 'type' => 'checkbox', 'checkboxgroup' => 'start', 'default' => get_option( 'woocommerce_ga_ecommerce_tracking_enabled' ) ? get_option( 'woocommerce_ga_ecommerce_tracking_enabled' ) : 'yes', // Backwards compat ), 'ga_event_tracking_enabled' => array( 'label' => __( 'Add to Cart Events', 'woocommerce-google-analytics-integration' ), 'type' => 'checkbox', 'checkboxgroup' => '', 'default' => 'yes', ), 'ga_enhanced_remove_from_cart_enabled' => array( 'label' => __( 'Remove from Cart Events', 'woocommerce-google-analytics-integration' ), 'type' => 'checkbox', 'checkboxgroup' => '', 'default' => 'yes', ), 'ga_enhanced_product_impression_enabled' => array( 'label' => __( 'Product Impressions from Listing Pages', 'woocommerce-google-analytics-integration' ), 'type' => 'checkbox', 'checkboxgroup' => '', 'default' => 'yes', ), 'ga_enhanced_product_click_enabled' => array( 'label' => __( 'Product Clicks from Listing Pages', 'woocommerce-google-analytics-integration' ), 'type' => 'checkbox', 'checkboxgroup' => '', 'default' => 'yes', ), 'ga_enhanced_product_detail_view_enabled' => array( 'label' => __( 'Product Detail Views', 'woocommerce-google-analytics-integration' ), 'type' => 'checkbox', 'checkboxgroup' => '', 'default' => 'yes', ), 'ga_enhanced_checkout_process_enabled' => array( 'label' => __( 'Checkout Process Initiated', 'woocommerce-google-analytics-integration' ), 'type' => 'checkbox', 'checkboxgroup' => '', 'default' => 'yes', ), 'ga_linker_cross_domains' => array( 'title' => __( 'Cross Domain Tracking', 'woocommerce-google-analytics-integration' ), /* translators: Read more link */ 'description' => sprintf( __( 'Add a comma separated list of domains for automatic linking. %1$sRead more about Cross Domain Measurement%2$s', 'woocommerce-google-analytics-integration' ), '', '' ), 'type' => 'text', 'placeholder' => 'example.com, example.net', 'default' => '', ), ); } /** * Shows some additional help text after saving the Google Analytics settings */ public function show_options_info() { $this->method_description .= "

" . __( 'Please allow Google Analytics 24 hours to start displaying results.', 'woocommerce-google-analytics-integration' ) . '

'; // phpcs:disable WordPress.Security.NonceVerification.Recommended if ( isset( $_REQUEST['woocommerce_google_analytics_ga_ecommerce_tracking_enabled'] ) && true === (bool) $_REQUEST['woocommerce_google_analytics_ga_ecommerce_tracking_enabled'] ) { $this->method_description .= "

" . __( 'Please note, for transaction tracking to work properly, you will need to use a payment gateway that redirects the customer back to a WooCommerce order received/thank you page.', 'woocommerce-google-analytics-integration' ) . '

'; } } /** * Hooks into woocommerce_tracker_data and tracks some of the analytic settings (just enabled|disabled status) * only if you have opted into WooCommerce tracking * https://woo.com/usage-tracking/ * * @param array $data Current WC tracker data. * @return array Updated WC Tracker data. */ public function track_settings( $data ) { $settings = $this->settings; $data['wc-google-analytics'] = array( 'support_display_advertising' => $settings['ga_support_display_advertising'], 'ga_404_tracking_enabled' => $settings['ga_404_tracking_enabled'], 'ecommerce_tracking_enabled' => $settings['ga_ecommerce_tracking_enabled'], 'event_tracking_enabled' => $settings['ga_event_tracking_enabled'], 'plugin_version' => WC_GOOGLE_ANALYTICS_INTEGRATION_VERSION, 'linker_allow_incoming_enabled' => empty( $settings['ga_linker_allow_incoming_enabled'] ) ? 'no' : 'yes', 'linker_cross_domains' => $settings['ga_linker_cross_domains'], ); // ID prefix, blank, or X for unknown $prefix = strstr( strtoupper( $settings['ga_id'] ), '-', true ); if ( in_array( $prefix, array( 'UA', 'G', 'GT' ), true ) || empty( $prefix ) ) { $data['wc-google-analytics']['ga_id'] = $prefix; } else { $data['wc-google-analytics']['ga_id'] = 'X'; } return $data; } /** * Add suggested privacy policy content * * @return void */ public function privacy_policy() { $policy_text = sprintf( /* translators: 1) HTML anchor open tag 2) HTML anchor closing tag */ esc_html__( 'By using this extension, you may be storing personal data or sharing data with an external service. %1$sLearn more about what data is collected by Google and what you may want to include in your privacy policy%2$s.', 'woocommerce-google-analytics-integration' ), '', '' ); // As the extension doesn't offer suggested privacy policy text, the button to copy it is hidden. $content = '

' . $policy_text . '

'; wp_add_privacy_policy_content( 'Google Analytics for WooCommerce', wpautop( $content, false ) ); } /** * Check if tracking is disabled * * @param string $type The setting to check * @return bool True if tracking for a certain setting is disabled */ private function disable_tracking( $type ) { return is_admin() || current_user_can( 'manage_options' ) || empty( $this->settings['ga_id'] ) || 'no' === $type || apply_filters( 'woocommerce_ga_disable_tracking', false, $type ); } /** * Add the utm_nooverride parameter to any return urls. This makes sure Google Adwords doesn't mistake the offsite gateway as the referrer. * * @param string $return_url WooCommerce Return URL * @return string URL */ public function utm_nooverride( $return_url ) { // We don't know if the URL already has the parameter so we should remove it just in case $return_url = remove_query_arg( 'utm_nooverride', $return_url ); // Now add the utm_nooverride query arg to the URL $return_url = add_query_arg( 'utm_nooverride', '1', $return_url ); return esc_url( $return_url, null, 'db' ); } /** * Check if the Google Analytics Tracking ID has been set up. * * @since 1.5.17 * * @return bool Whether the Google Analytics setup is completed. */ public function is_setup_complete() { return (bool) $this->get_option( 'ga_id' ); } /** * Adds the setup task to the Tasklists. * * @since 1.5.17 */ public function add_wc_setup_task() { require_once 'class-wc-google-analytics-task.php'; TaskLists::add_task( 'extended', new WC_Google_Analytics_Task( TaskLists::get_list( 'extended' ) ) ); } }