diff --git a/includes/class-wc-google-gtag-js.php b/includes/class-wc-google-gtag-js.php index fc4606de..e8ce7f5e 100644 --- a/includes/class-wc-google-gtag-js.php +++ b/includes/class-wc-google-gtag-js.php @@ -199,36 +199,30 @@ public static function listing_impression( $product ) { * @param WC_Product $product */ public static function listing_click( $product ) { - $item = array( - 'id' => self::get_product_identifier( $product ), - 'name' => $product->get_title(), - 'category' => self::product_get_category_line( $product ), - 'quantity' => 1, - ); - - $select_content_event_code = self::get_event_code( - 'select_content', - array( - 'items' => array( $item ), - ) - ); - - $add_to_cart_event_code = self::get_event_code( - 'add_to_cart', - array( - 'items' => array( $item ), - ) - ); + $event_data = [ + 'items' => [ + [ + 'id' => self::get_product_identifier( $product ), + 'name' => $product->get_title(), + 'category' => self::product_get_category_line( $product ), + 'quantity' => 1, + ], + ], + ]; wc_enqueue_js( - " - $( '.product.post-" . esc_js( $product->get_id() ) . ' a , .product.post-' . esc_js( $product->get_id() ) . " button' ).on('click', function() { - if ( false === $(this).hasClass( 'product_type_variable' ) && false === $(this).hasClass( 'product_type_grouped' ) ) { - $add_to_cart_event_code - } else { - $select_content_event_code - } - });" + sprintf( + "$( '.product.post-%s a , .product.post-%1\$s button' ).on('click', function() { + if ( false === $(this).hasClass( 'product_type_variable' ) && false === $(this).hasClass( 'product_type_grouped' ) ) { + %s + } else { + %s + } + });", + esc_js( $product->get_id() ), + self::get_event_code( 'add_to_cart', $event_data ), + self::get_event_code( 'select_content', $event_data ), + ) ); } @@ -286,23 +280,26 @@ public static function load_analytics( $order = false ) { $track_404_enabled = ''; if ( 'yes' === self::get( 'ga_404_tracking_enabled' ) && is_404() ) { // See https://developers.google.com/analytics/devguides/collection/gtagjs/events for reference - $track_404_enabled = self::tracker_var() . "( 'event', '404_not_found', { 'event_category':'error', 'event_label':'page: ' + document.location.pathname + document.location.search + ' referrer: ' + document.referrer });"; + $track_404_enabled = "gtag( 'event', '404_not_found', { 'event_category':'error', 'event_label':'page: ' + document.location.pathname + document.location.search + ' referrer: ' + document.referrer });"; } $gtag_developer_id = ''; if ( ! empty( self::DEVELOPER_ID ) ) { - $gtag_developer_id = self::tracker_var() . "('set', 'developer_id." . self::DEVELOPER_ID . "', true);"; + $gtag_developer_id = "gtag('set', 'developer_id." . self::DEVELOPER_ID . "', true);"; } + $gtag_name = self::tracker_var(); $gtag_id = self::get( 'ga_id' ); $gtag_cross_domains = ! empty( self::get( 'ga_linker_cross_domains' ) ) ? array_map( 'esc_js', explode( ',', self::get( 'ga_linker_cross_domains' ) ) ) : array(); - $gtag_snippet = ' + + $gtag_snippet = "(()=>{ window.dataLayer = window.dataLayer || []; - function ' . self::tracker_var() . '(){dataLayer.push(arguments);} - ' . self::tracker_var() . "('js', new Date()); + // Publish gtag under custom name to the global scope. + // Preserve the custom `arguments.callee.name`, for backward compatibility (not sure if even needed). + const gtag = window.$gtag_name = function $gtag_name(){dataLayer.push(arguments);} + gtag('js', new Date()); $gtag_developer_id - - " . self::tracker_var() . "('config', '" . esc_js( $gtag_id ) . "', { + gtag('config', '" . esc_js( $gtag_id ) . "', { 'allow_google_signals': " . ( 'yes' === self::get( 'ga_support_display_advertising' ) ? 'true' : 'false' ) . ", 'link_attribution': " . ( 'yes' === self::get( 'ga_support_enhanced_link_attribution' ) ? 'true' : 'false' ) . ", 'anonymize_ip': " . ( 'yes' === self::get( 'ga_anonymize_enabled' ) ? 'true' : 'false' ) . ", @@ -317,7 +314,7 @@ function ' . self::tracker_var() . '(){dataLayer.push(arguments);} } ); $track_404_enabled - "; + })();"; wp_register_script( 'google-tag-manager', 'https://www.googletagmanager.com/gtag/js?id=' . esc_js( $gtag_id ), array( 'google-analytics-opt-out' ), null, false ); wp_add_inline_script( 'google-tag-manager', apply_filters( 'woocommerce_gtag_snippet', $gtag_snippet ) ); @@ -481,29 +478,25 @@ public function event_tracking_code( $parameters, $selector ) { $parameters = apply_filters( 'woocommerce_gtag_event_tracking_parameters', $parameters ); + $items = ''; if ( 'yes' === self::get( 'ga_enhanced_ecommerce_tracking_enabled' ) ) { - $track_event = sprintf( - self::tracker_var() . "( 'event', %s, { 'event_category': %s, 'event_label': %s, 'items': [ %s ] } );", - $parameters['action'], - $parameters['category'], - $parameters['label'], + $items = sprintf( + ", 'items': [ %s ]", $parameters['item'] ); - } else { - $track_event = sprintf( - self::tracker_var() . "( 'event', %s, { 'event_category': %s, 'event_label': %s } );", - $parameters['action'], - $parameters['category'], - $parameters['label'] - ); } - wc_enqueue_js( - " - $( '" . $selector . "' ).on( 'click', function() { - " . $track_event . ' - }); - ' + sprintf( + "$( %s ).on( 'click', function() { + %s( 'event', %s, { 'event_category': %s, 'event_label': %s%s } ); + });", + $selector, + self::tracker_var(), + $parameters['action'], + $parameters['category'], + $parameters['label'], + $items, + ) ); }