get_order_currency() : $order->get_currency() ) . "']"; } $code .= ");"; $code = ""; return apply_filters( 'woocommerce_ga_classic_snippet_output', $code ); } /** * Enqueues JavaScript to build the addImpression object * * @param WC_Product $product * @param int $position */ public static function listing_impression( $product, $position ) { if ( isset( $_GET['s'] ) ) { $list = "Search Results"; } else { $list = "Product List"; } wc_enqueue_js( " " . self::tracker_var() . "( 'ec:addImpression', { 'id': '" . esc_js( $product->get_id() ) . "', 'name': '" . esc_js( $product->get_title() ) . "', 'category': " . self::product_get_category_line( $product ) . " 'list': '" . esc_js( $list ) . "', 'position': '" . esc_js( $position ) . "' } ); " ); } /** * Enqueues JavaScript to build an addProduct and click object * * @param WC_Product $product * @param int $position */ public static function listing_click( $product, $position ) { if ( isset( $_GET['s'] ) ) { $list = "Search Results"; } else { $list = "Product List"; } wc_enqueue_js( " $( '.products .post-" . esc_js( $product->get_id() ) . " a' ).on( 'click', function() { if ( true === $(this).hasClass( 'add_to_cart_button' ) ) { return; } " . self::tracker_var() . "( 'ec:addProduct', { 'id': '" . esc_js( $product->get_id() ) . "', 'name': '" . esc_js( $product->get_title() ) . "', 'category': " . self::product_get_category_line( $product ) . " 'position': '" . esc_js( $position ) . "' }); " . self::tracker_var() . "( 'ec:setAction', 'click', { list: '" . esc_js( $list ) . "' }); " . self::tracker_var() . "( 'send', 'event', 'UX', 'click', ' " . esc_js( $list ) . "' ); }); " ); } /** * Loads in the footer * @see wp_footer */ public static function classic_analytics_footer() { if ( 'yes' === self::get( 'ga_support_display_advertising' ) ) { $ga_url = "('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'"; } else { $ga_url = "('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'"; } echo ""; } /** * Enqueues JavaScript to send the pageview last thing (needed for things like addImpression) */ public static function universal_analytics_footer() { if ( apply_filters( 'wc_google_analytics_send_pageview', true ) ) { wc_enqueue_js( "" . self::tracker_var() . "( 'send', 'pageview' ); " ); } } /** * This was created to fix public facing api typo in a filter name * and inform about the deprecation. * * @param boolean $send_pageview */ public static function universal_analytics_footer_filter( $send_pageview ) { return apply_filters_deprecated( 'wc_goole_analytics_send_pageview', array( $send_pageview ), '1.4.20', 'wc_google_analytics_send_pageview' ); } /** * Loads the universal analytics code * * @param string $logged_in 'yes' if the user is logged in, no if not (this is a string so we can pass it to GA) * @return string Universal Analytics Code */ protected static function load_analytics_universal( $logged_in ) { $domainname = self::get( 'ga_set_domain_name' ); if ( ! empty( $domainname ) ) { $set_domain_name = esc_js( self::get( 'ga_set_domain_name' ) ); } else { $set_domain_name = 'auto'; } $support_display_advertising = ''; if ( 'yes' === self::get( 'ga_support_display_advertising' ) ) { $support_display_advertising = "" . self::tracker_var() . "( 'require', 'displayfeatures' );"; } $support_enhanced_link_attribution = ''; if ( 'yes' === self::get( 'ga_support_enhanced_link_attribution' ) ) { $support_enhanced_link_attribution = "" . self::tracker_var() . "( 'require', 'linkid' );"; } $anonymize_enabled = ''; if ( 'yes' === self::get( 'ga_anonymize_enabled' ) ) { $anonymize_enabled = "" . self::tracker_var() . "( 'set', 'anonymizeIp', true );"; } $track_404_enabled = ''; if ( 'yes' === self::get( 'ga_404_tracking_enabled' ) && is_404() ) { // See https://developers.google.com/analytics/devguides/collection/analyticsjs/events for reference $track_404_enabled = "" . self::tracker_var() . "( 'send', 'event', 'Error', '404 Not Found', 'page: ' + document.location.pathname + document.location.search + ' referrer: ' + document.referrer );"; } $src = apply_filters('woocommerce_google_analytics_script_src', '//www.google-analytics.com/analytics.js'); $ga_snippet_head = "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script', '{$src}','" . self::tracker_var() . "');"; $ga_id = self::get( 'ga_id' ); if ( 'yes' === self::get( 'ga_linker_allow_incoming_enabled' ) ) { $ga_snippet_create = self::tracker_var() . "( 'create', '" . esc_js( $ga_id ) . "', '" . $set_domain_name . "', { allowLinker: true });"; } else { $ga_snippet_create = self::tracker_var() . "( 'create', '" . esc_js( $ga_id ) . "', '" . $set_domain_name . "' );"; } if ( ! empty( self::DEVELOPER_ID ) ) { $ga_snippet_developer_id = "(window.gaDevIds=window.gaDevIds||[]).push('" . self::DEVELOPER_ID . "');"; } else { $ga_snippet_developer_id = ''; } $ga_snippet_require = $support_display_advertising . $support_enhanced_link_attribution . $anonymize_enabled . $track_404_enabled . " " . self::tracker_var() . "( 'set', 'dimension1', '" . $logged_in . "' );\n"; if ( 'yes' === self::get( 'ga_enhanced_ecommerce_tracking_enabled' ) ) { $ga_snippet_require .= "" . self::tracker_var() . "( 'require', 'ec' );"; } else { $ga_snippet_require .= "" . self::tracker_var() . "( 'require', 'ecommerce', 'ecommerce.js');"; } $ga_cross_domains = ! empty( self::get( 'ga_linker_cross_domains' ) ) ? array_map( 'esc_js', explode( ',', self::get( 'ga_linker_cross_domains' ) ) ) : false; if ( $ga_cross_domains ) { $ga_snippet_require .= '' . self::tracker_var() . "( 'require', 'linker' );"; $ga_snippet_require .= '' . self::tracker_var() . "( 'linker:autoLink', " . wp_json_encode( $ga_cross_domains ) . ');'; } $ga_snippet_head = apply_filters( 'woocommerce_ga_snippet_head', $ga_snippet_head ); $ga_snippet_create = apply_filters( 'woocommerce_ga_snippet_create', $ga_snippet_create, $ga_id ); $ga_snippet_developer_id = apply_filters( 'woocommerce_ga_snippet_developer_id', $ga_snippet_developer_id ); $ga_snippet_require = apply_filters( 'woocommerce_ga_snippet_require', $ga_snippet_require ); $code = ""; $code = apply_filters( 'woocommerce_ga_snippet_output', $code ); return $code; } /** * Generate code used to pass transaction data to Google Analytics. * * @param WC_Order $order WC_Order Object. * @return string Add Transaction code. */ public function add_transaction( $order ) { if ( 'yes' === self::get( 'ga_use_universal_analytics' ) ) { if ( 'yes' === self::get( 'ga_enhanced_ecommerce_tracking_enabled' ) ) { $transaction_code = self::add_transaction_enhanced( $order ); } else { $transaction_code = self::add_transaction_universal( $order ); } } else { $transaction_code = self::add_transaction_classic( $order ); } // Check localStorage to avoid duplicate transactions if page is reloaded without hitting server. $code = " var ga_orders = []; try { ga_orders = localStorage.getItem( 'ga_orders' ); ga_orders = ga_orders ? JSON.parse( ga_orders ) : []; } catch {} if ( -1 === ga_orders.indexOf( '" . esc_js( $order->get_order_number() ) . "' ) ) { " . $transaction_code . " try { ga_orders.push( '" . esc_js( $order->get_order_number() ) . "' ); localStorage.setItem( 'ga_orders', JSON.stringify( ga_orders ) ); } catch {} }"; return $code; } /** * ga.js (classic) transaction tracking * @param WC_Order $order WC_Order Object * @return string Add Transaction Code */ protected function add_transaction_classic( $order ) { $code = "_gaq.push(['_addTrans', '" . esc_js( $order->get_order_number() ) . "', // order ID - required '" . esc_js( get_bloginfo( 'name' ) ) . "', // affiliation or store name '" . esc_js( $order->get_total() ) . "', // total - required '" . esc_js( $order->get_total_tax() ) . "', // tax '" . esc_js( $order->get_total_shipping() ) . "', // shipping '" . esc_js( version_compare( WC_VERSION, '3.0', '<' ) ? $order->billing_city : $order->get_billing_city() ) . "', // city '" . esc_js( version_compare( WC_VERSION, '3.0', '<' ) ? $order->billing_state : $order->get_billing_state() ) . "', // state or province '" . esc_js( version_compare( WC_VERSION, '3.0', '<' ) ? $order->billing_country : $order->get_billing_country() ) . "' // country ]);"; // Order items if ( $order->get_items() ) { foreach ( $order->get_items() as $item ) { $code .= self::add_item_classic( $order, $item ); } } $code .= "_gaq.push(['_trackTrans']);"; return $code; } /** * Generate Universal Analytics Enhanced Ecommerce transaction tracking code * * @param WC_Order $order * @return string */ protected function add_transaction_enhanced( $order ) { $code = "" . self::tracker_var() . "( 'set', '&cu', '" . esc_js( version_compare( WC_VERSION, '3.0', '<' ) ? $order->get_order_currency() : $order->get_currency() ) . "' );"; // Order items if ( $order->get_items() ) { foreach ( $order->get_items() as $item ) { $code .= self::add_item_enhanced( $order, $item ); } } $code .= "" . self::tracker_var() . "( 'ec:setAction', 'purchase', { 'id': '" . esc_js( $order->get_order_number() ) . "', 'affiliation': '" . esc_js( get_bloginfo( 'name' ) ) . "', 'revenue': '" . esc_js( $order->get_total() ) . "', 'tax': '" . esc_js( $order->get_total_tax() ) . "', 'shipping': '" . esc_js( $order->get_total_shipping() ) . "' } );"; return $code; } /** * Add Item (Classic) * * @param WC_Order $order WC_Order Object * @param array $item The item to add to a transaction/order * @return string */ protected function add_item_classic( $order, $item ) { $_product = version_compare( WC_VERSION, '3.0', '<' ) ? $order->get_product_from_item( $item ) : $item->get_product(); $code = "_gaq.push(['_addItem',"; $code .= "'" . esc_js( $order->get_order_number() ) . "',"; $code .= "'" . esc_js( $_product->get_sku() ? $_product->get_sku() : $_product->get_id() ) . "',"; $code .= "'" . esc_js( $item['name'] ) . "',"; $code .= self::product_get_category_line( $_product ); $code .= "'" . esc_js( $order->get_item_total( $item ) ) . "',"; $code .= "'" . esc_js( $item['qty'] ) . "'"; $code .= "]);"; return $code; } /** * Add Item (Enhanced, Universal) * * @param WC_Order $order WC_Order Object * @param WC_Order_Item $item The item to add to a transaction/order * @return string */ protected function add_item_enhanced( $order, $item ) { $_product = version_compare( WC_VERSION, '3.0', '<' ) ? $order->get_product_from_item( $item ) : $item->get_product(); $variant = self::product_get_variant_line( $_product ); $code = "" . self::tracker_var() . "( 'ec:addProduct', {"; $code .= "'id': '" . esc_js( $_product->get_sku() ? $_product->get_sku() : $_product->get_id() ) . "',"; $code .= "'name': '" . esc_js( $item['name'] ) . "',"; $code .= "'category': " . self::product_get_category_line( $_product ); if ( '' !== $variant ) { $code .= "'variant': " . $variant; } $code .= "'price': '" . esc_js( $order->get_item_total( $item ) ) . "',"; $code .= "'quantity': '" . esc_js( $item['qty'] ) . "'"; $code .= "});"; return $code; } /** * Output JavaScript to track an enhanced ecommerce remove from cart action */ public function remove_from_cart() { echo( " " ); } /** * Enqueue JavaScript to track a product detail view * * @param WC_Product $product */ public function product_detail( $product ) { if ( empty( $product ) ) { return; } wc_enqueue_js( " " . self::tracker_var() . "( 'ec:addProduct', { 'id': '" . esc_js( $product->get_sku() ? $product->get_sku() : ( '#' . $product->get_id() ) ) . "', 'name': '" . esc_js( $product->get_title() ) . "', 'category': " . self::product_get_category_line( $product ) . " 'price': '" . esc_js( $product->get_price() ) . "', } ); " . self::tracker_var() . "( 'ec:setAction', 'detail' );" ); } /** * Enqueue JS to track when the checkout process is started * * @param array $cart items/contents of the cart */ public function checkout_process( $cart ) { $code = ""; foreach ( $cart as $cart_item_key => $cart_item ) { $product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key ); $variant = self::product_get_variant_line( $product ); $code .= "" . self::tracker_var() . "( 'ec:addProduct', { 'id': '" . esc_js( $product->get_sku() ? $product->get_sku() : ( '#' . $product->get_id() ) ) . "', 'name': '" . esc_js( $product->get_title() ) . "', 'category': " . self::product_get_category_line( $product ); if ( '' !== $variant ) { $code .= "'variant': " . $variant; } $code .= "'price': '" . esc_js( $product->get_price() ) . "', 'quantity': '" . esc_js( $cart_item['quantity'] ) . "' } );"; } $code .= "" . self::tracker_var() . "( 'ec:setAction','checkout' );"; wc_enqueue_js( $code ); } /** * Enqueue JavaScript for Add to cart tracking * * @param array $parameters associative array of _trackEvent parameters * @param string $selector jQuery selector for binding click event */ public function event_tracking_code( $parameters, $selector ) { $parameters = apply_filters( 'woocommerce_ga_event_tracking_parameters', $parameters ); if ( 'yes' === self::get( 'ga_use_universal_analytics' ) ) { if ( 'yes' === self::get( 'ga_enhanced_ecommerce_tracking_enabled' ) ) { wc_enqueue_js( " $( '" . $selector . "' ).on( 'click', function() { " . $parameters['enhanced'] . " " . self::tracker_var() . "( 'ec:setAction', 'add' ); " . self::tracker_var() . "( 'send', 'event', 'UX', 'click', 'add to cart' ); }); " ); return; } else { $track_event = "" . self::tracker_var() . "('send', 'event', %s, %s, %s);"; } } else { $track_event = "_gaq.push(['_trackEvent', %s, %s, %s]);"; } wc_enqueue_js( " $( '" . $selector . "' ).on( 'click', function() { " . sprintf( $track_event, $parameters['category'], $parameters['action'], $parameters['label'] ) . " }); " ); } }