WooCommerce Google Analytics Integration - Version 1.4.1

Version Description

  • 01/05/2017 =

  • Add - Filters for GA snippet (woocommerce_ga_snippet_head, woocommerce_ga_snippet_create, woocommerce_ga_snippet_require, woocommerce_ga_snippet_output)

  • Add - Option to toggle on/off Enhanced Link Attribution

  • Fix - JavaScript break by wrapping it in quotes

  • Fix - Use ID and SKU data in a consistent way so that all products are correctly tracked.

  • Fix - Updates for WooCommerce 3.0 compatibility.

  • Add - Settings link to the plugin in the Plugins screen

  • Fix - Fatal error on shortcode usage for empty product

Download this release

Release Info

Developer bor0
Plugin Icon 128x128 WooCommerce Google Analytics Integration
Version 1.4.1
Comparing to
See all releases

Code changes from version 1.4.0 to 1.4.1

README.md DELETED
@@ -1,5 +0,0 @@
1
- # WooCommerce Google Analytics Integration
2
-
3
- WordPress plugin: Provides the integration between WooCommerce and Google Analytics.
4
-
5
- Will be required for WooCommerce shops using the integration from WooCommerce 2.1 and up.
includes/class-wc-google-analytics-js.php CHANGED
@@ -91,9 +91,9 @@ class WC_Google_Analytics_JS {
91
if ( 'yes' === self::get( 'ga_anonymize_enabled' ) ) {
92
$anonymize_enabled = "['_gat._anonymizeIp'],";
93
}
94
-
95
$domainname = self::get( 'ga_set_domain_name' );
96
-
97
if ( ! empty( $domainname ) ) {
98
$set_domain_name = "['_setDomainName', '" . esc_js( self::get( 'ga_set_domain_name' ) ) . "'],";
99
} else {
@@ -108,7 +108,7 @@ class WC_Google_Analytics_JS {
108
['_trackPageview']";
109
110
if ( false !== $order ) {
111
- $code .= ",['_set', 'currencyCode', '" . esc_js( $order->get_order_currency() ) . "']";
112
}
113
114
$code .= ");";
@@ -128,11 +128,11 @@ class WC_Google_Analytics_JS {
128
129
wc_enqueue_js( "
130
" . self::tracker_var() . "( 'ec:addImpression', {
131
- 'id': '" . esc_js( $product->id ) . "',
132
'name': '" . esc_js( $product->get_title() ) . "',
133
'category': " . self::product_get_category_line( $product ) . "
134
'list': '" . esc_js( $list ) . "',
135
- 'position': " . esc_js( $position ) . "
136
} );
137
" );
138
}
@@ -150,16 +150,16 @@ class WC_Google_Analytics_JS {
150
echo( "
151
<script>
152
(function($) {
153
- $( '.products .post-" . esc_js( $product->id ) . " a' ).click( function() {
154
if ( true === $(this).hasClass( 'add_to_cart_button' ) ) {
155
return;
156
}
157
158
" . self::tracker_var() . "( 'ec:addProduct', {
159
- 'id': '" . esc_js( $product->id ) . "',
160
'name': '" . esc_js( $product->get_title() ) . "',
161
'category': " . self::product_get_category_line( $product ) . "
162
- 'position': " . esc_js( $position ) . "
163
});
164
165
" . self::tracker_var() . "( 'ec:setAction', 'click', { list: '" . esc_js( $list ) . "' });
@@ -202,9 +202,9 @@ class WC_Google_Analytics_JS {
202
* @return string Universal Analytics Code
203
*/
204
public static function load_analytics_universal( $logged_in ) {
205
-
206
$domainname = self::get( 'ga_set_domain_name' );
207
-
208
if ( ! empty( $domainname ) ) {
209
$set_domain_name = esc_js( self::get( 'ga_set_domain_name' ) );
210
} else {
@@ -216,27 +216,42 @@ class WC_Google_Analytics_JS {
216
$support_display_advertising = "" . self::tracker_var() . "( 'require', 'displayfeatures' );";
217
}
218
219
$anonymize_enabled = '';
220
if ( 'yes' === self::get( 'ga_anonymize_enabled' ) ) {
221
$anonymize_enabled = "" . self::tracker_var() . "( 'set', 'anonymizeIp', true );";
222
}
223
224
- $code = "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
225
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
226
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
227
- })(window,document,'script','//www.google-analytics.com/analytics.js','" . self::tracker_var() . "');
228
229
- " . self::tracker_var() . "( 'create', '" . esc_js( self::get( 'ga_id' ) ) . "', '" . $set_domain_name . "' );" .
230
$support_display_advertising .
231
$anonymize_enabled . "
232
" . self::tracker_var() . "( 'set', 'dimension1', '" . $logged_in . "' );\n";
233
234
if ( 'yes' === self::get( 'ga_enhanced_ecommerce_tracking_enabled' ) ) {
235
- $code .= "" . self::tracker_var() . "( 'require', 'ec' );";
236
} else {
237
- $code .= "" . self::tracker_var() . "( 'require', 'ecommerce', 'ecommerce.js');";
238
}
239
240
return $code;
241
}
242
@@ -269,9 +284,9 @@ class WC_Google_Analytics_JS {
269
'" . esc_js( $order->get_total() ) . "', // total - required
270
'" . esc_js( $order->get_total_tax() ) . "', // tax
271
'" . esc_js( $order->get_total_shipping() ) . "', // shipping
272
- '" . esc_js( $order->billing_city ) . "', // city
273
- '" . esc_js( $order->billing_state ) . "', // state or province
274
- '" . esc_js( $order->billing_country ) . "' // country
275
]);";
276
277
// Order items
@@ -297,7 +312,7 @@ class WC_Google_Analytics_JS {
297
'revenue': '" . esc_js( $order->get_total() ) . "', // Grand Total
298
'shipping': '" . esc_js( $order->get_total_shipping() ) . "', // Shipping
299
'tax': '" . esc_js( $order->get_total_tax() ) . "', // Tax
300
- 'currency': '" . esc_js( $order->get_order_currency() ) . "' // Currency
301
});";
302
303
// Order items
@@ -315,7 +330,7 @@ class WC_Google_Analytics_JS {
315
* Enhanced Ecommerce Universal Analytics transaction tracking
316
*/
317
function add_transaction_enhanced( $order ) {
318
- $code = "" . self::tracker_var() . "( 'set', '&cu', '" . esc_js( $order->get_order_currency() ) . "' );";
319
320
// Order items
321
if ( $order->get_items() ) {
@@ -345,7 +360,7 @@ class WC_Google_Analytics_JS {
345
346
$code = "_gaq.push(['_addItem',";
347
$code .= "'" . esc_js( $order->get_order_number() ) . "',";
348
- $code .= "'" . esc_js( $_product->get_sku() ? $_product->get_sku() : $_product->id ) . "',";
349
$code .= "'" . esc_js( $item['name'] ) . "',";
350
$code .= self::product_get_category_line( $_product );
351
$code .= "'" . esc_js( $order->get_item_total( $item ) ) . "',";
@@ -366,7 +381,7 @@ class WC_Google_Analytics_JS {
366
$code = "" . self::tracker_var() . "('ecommerce:addItem', {";
367
$code .= "'id': '" . esc_js( $order->get_order_number() ) . "',";
368
$code .= "'name': '" . esc_js( $item['name'] ) . "',";
369
- $code .= "'sku': '" . esc_js( $_product->get_sku() ? $_product->get_sku() : $_product->id ) . "',";
370
$code .= "'category': " . self::product_get_category_line( $_product );
371
$code .= "'price': '" . esc_js( $order->get_item_total( $item ) ) . "',";
372
$code .= "'quantity': '" . esc_js( $item['qty'] ) . "'";
@@ -384,7 +399,7 @@ class WC_Google_Analytics_JS {
384
$_product = $order->get_product_from_item( $item );
385
386
$code = "" . self::tracker_var() . "( 'ec:addProduct', {";
387
- $code .= "'id': '" . esc_js( $_product->get_sku() ? $_product->get_sku() : $_product->id ) . "',";
388
$code .= "'name': '" . esc_js( $item['name'] ) . "',";
389
$code .= "'category': " . self::product_get_category_line( $_product );
390
$code .= "'price': '" . esc_js( $order->get_item_total( $item ) ) . "',";
@@ -400,11 +415,12 @@ class WC_Google_Analytics_JS {
400
* @return string Line of JSON
401
*/
402
private static function product_get_category_line( $_product ) {
403
- if ( is_array( $_product->variation_data ) && ! empty( $_product->variation_data ) ) {
404
- $code = "'" . esc_js( woocommerce_get_formatted_variation( $_product->variation_data, true ) ) . "',";
405
} else {
406
$out = array();
407
- $categories = get_the_terms( $_product->id, 'product_cat' );
408
if ( $categories ) {
409
foreach ( $categories as $category ) {
410
$out[] = $category->name;
@@ -425,7 +441,7 @@ class WC_Google_Analytics_JS {
425
(function($) {
426
$( '.remove' ).click( function() {
427
" . self::tracker_var() . "( 'ec:addProduct', {
428
- 'id': ($(this).data('product_sku')) ? ('SKU: ' + $(this).data('product_sku')) : ('#' + $(this).data('product_id')),
429
'quantity': $(this).parent().parent().find( '.qty' ).val() ? $(this).parent().parent().find( '.qty' ).val() : '1',
430
} );
431
" . self::tracker_var() . "( 'ec:setAction', 'remove' );
@@ -440,9 +456,13 @@ class WC_Google_Analytics_JS {
440
* Tracks a product detail view
441
*/
442
function product_detail( $product ) {
443
wc_enqueue_js( "
444
" . self::tracker_var() . "( 'ec:addProduct', {
445
- 'id': '" . esc_js( $product->get_sku() ? $product->get_sku() : $product->id ) . "',
446
'name': '" . esc_js( $product->get_title() ) . "',
447
'category': " . self::product_get_category_line( $product ) . "
448
'price': '" . esc_js( $product->get_price() ) . "',
@@ -460,7 +480,7 @@ class WC_Google_Analytics_JS {
460
foreach ( $cart as $cart_item_key => $cart_item ) {
461
$product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
462
$code .= "" . self::tracker_var() . "( 'ec:addProduct', {
463
- 'id': '" . esc_js( $product->get_sku() ? $product->get_sku() : $product->id ) . "',
464
'name': '" . esc_js( $product->get_title() ) . "',
465
'category': " . self::product_get_category_line( $product ) . "
466
'price': '" . esc_js( $product->get_price() ) . "',
91
if ( 'yes' === self::get( 'ga_anonymize_enabled' ) ) {
92
$anonymize_enabled = "['_gat._anonymizeIp'],";
93
}
94
+
95
$domainname = self::get( 'ga_set_domain_name' );
96
+
97
if ( ! empty( $domainname ) ) {
98
$set_domain_name = "['_setDomainName', '" . esc_js( self::get( 'ga_set_domain_name' ) ) . "'],";
99
} else {
108
['_trackPageview']";
109
110
if ( false !== $order ) {
111
+ $code .= ",['_set', 'currencyCode', '" . esc_js( version_compare( WC_VERSION, '3.0', '<' ) ? $order->get_order_currency() : $order->get_currency() ) . "']";
112
}
113
114
$code .= ");";
128
129
wc_enqueue_js( "
130
" . self::tracker_var() . "( 'ec:addImpression', {
131
+ 'id': '" . esc_js( $product->get_id() ) . "',
132
'name': '" . esc_js( $product->get_title() ) . "',
133
'category': " . self::product_get_category_line( $product ) . "
134
'list': '" . esc_js( $list ) . "',
135
+ 'position': '" . esc_js( $position ) . "'
136
} );
137
" );
138
}
150
echo( "
151
<script>
152
(function($) {
153
+ $( '.products .post-" . esc_js( $product->get_id() ) . " a' ).click( function() {
154
if ( true === $(this).hasClass( 'add_to_cart_button' ) ) {
155
return;
156
}
157
158
" . self::tracker_var() . "( 'ec:addProduct', {
159
+ 'id': '" . esc_js( $product->get_id() ) . "',
160
'name': '" . esc_js( $product->get_title() ) . "',
161
'category': " . self::product_get_category_line( $product ) . "
162
+ 'position': '" . esc_js( $position ) . "'
163
});
164
165
" . self::tracker_var() . "( 'ec:setAction', 'click', { list: '" . esc_js( $list ) . "' });
202
* @return string Universal Analytics Code
203
*/
204
public static function load_analytics_universal( $logged_in ) {
205
+
206
$domainname = self::get( 'ga_set_domain_name' );
207
+
208
if ( ! empty( $domainname ) ) {
209
$set_domain_name = esc_js( self::get( 'ga_set_domain_name' ) );
210
} else {
216
$support_display_advertising = "" . self::tracker_var() . "( 'require', 'displayfeatures' );";
217
}
218
219
+ $support_enhanced_link_attribution = '';
220
+ if ( 'yes' === self::get( 'ga_support_enhanced_link_attribution' ) ) {
221
+ $support_enhanced_link_attribution = "" . self::tracker_var() . "( 'require', 'linkid' );";
222
+ }
223
+
224
$anonymize_enabled = '';
225
if ( 'yes' === self::get( 'ga_anonymize_enabled' ) ) {
226
$anonymize_enabled = "" . self::tracker_var() . "( 'set', 'anonymizeIp', true );";
227
}
228
229
+ $ga_snippet_head = "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
230
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
231
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
232
+ })(window,document,'script','//www.google-analytics.com/analytics.js','" . self::tracker_var() . "');";
233
234
+ $ga_snippet_create = self::tracker_var() . "( 'create', '" . esc_js( $ga_id ) . "', '" . $set_domain_name . "' );";
235
+
236
+ $ga_snippet_require =
237
$support_display_advertising .
238
+ $support_enhanced_link_attribution .
239
$anonymize_enabled . "
240
" . self::tracker_var() . "( 'set', 'dimension1', '" . $logged_in . "' );\n";
241
242
if ( 'yes' === self::get( 'ga_enhanced_ecommerce_tracking_enabled' ) ) {
243
+ $ga_snippet_require .= "" . self::tracker_var() . "( 'require', 'ec' );";
244
} else {
245
+ $ga_snippet_require .= "" . self::tracker_var() . "( 'require', 'ecommerce', 'ecommerce.js');";
246
}
247
248
+ $ga_snippet_head = apply_filters( 'woocommerce_ga_snippet_head' , $ga_snippet_head );
249
+ $ga_snippet_create = apply_filters( 'woocommerce_ga_snippet_create' , $ga_snippet_create, $ga_id );
250
+ $ga_snippet_require = apply_filters( 'woocommerce_ga_snippet_require' , $ga_snippet_require );
251
+
252
+ $code = $ga_snippet_head . $ga_snippet_create . $ga_snippet_require;
253
+ $code = apply_filters( 'woocommerce_ga_snippet_output', $code );
254
+
255
return $code;
256
}
257
284
'" . esc_js( $order->get_total() ) . "', // total - required
285
'" . esc_js( $order->get_total_tax() ) . "', // tax
286
'" . esc_js( $order->get_total_shipping() ) . "', // shipping
287
+ '" . esc_js( version_compare( WC_VERSION, '3.0', '<' ) ? $order->billing_city : $order->get_billing_city() ) . "', // city
288
+ '" . esc_js( version_compare( WC_VERSION, '3.0', '<' ) ? $order->billing_state : $order->get_billing_state() ) . "', // state or province
289
+ '" . esc_js( version_compare( WC_VERSION, '3.0', '<' ) ? $order->billing_country : $order->get_billing_country() ) . "' // country
290
]);";
291
292
// Order items
312
'revenue': '" . esc_js( $order->get_total() ) . "', // Grand Total
313
'shipping': '" . esc_js( $order->get_total_shipping() ) . "', // Shipping
314
'tax': '" . esc_js( $order->get_total_tax() ) . "', // Tax
315
+ 'currency': '" . esc_js( version_compare( WC_VERSION, '3.0', '<' ) ? $order->get_order_currency() : $order->get_currency() ) . "' // Currency
316
});";
317
318
// Order items
330
* Enhanced Ecommerce Universal Analytics transaction tracking
331
*/
332
function add_transaction_enhanced( $order ) {
333
+ $code = "" . self::tracker_var() . "( 'set', '&cu', '" . esc_js( version_compare( WC_VERSION, '3.0', '<' ) ? $order->get_order_currency() : $order->get_currency() ) . "' );";
334
335
// Order items
336
if ( $order->get_items() ) {
360
361
$code = "_gaq.push(['_addItem',";
362
$code .= "'" . esc_js( $order->get_order_number() ) . "',";
363
+ $code .= "'" . esc_js( $_product->get_sku() ? $_product->get_sku() : $_product->get_id() ) . "',";
364
$code .= "'" . esc_js( $item['name'] ) . "',";
365
$code .= self::product_get_category_line( $_product );
366
$code .= "'" . esc_js( $order->get_item_total( $item ) ) . "',";
381
$code = "" . self::tracker_var() . "('ecommerce:addItem', {";
382
$code .= "'id': '" . esc_js( $order->get_order_number() ) . "',";
383
$code .= "'name': '" . esc_js( $item['name'] ) . "',";
384
+ $code .= "'sku': '" . esc_js( $_product->get_sku() ? $_product->get_sku() : $_product->get_id() ) . "',";
385
$code .= "'category': " . self::product_get_category_line( $_product );
386
$code .= "'price': '" . esc_js( $order->get_item_total( $item ) ) . "',";
387
$code .= "'quantity': '" . esc_js( $item['qty'] ) . "'";
399
$_product = $order->get_product_from_item( $item );
400
401
$code = "" . self::tracker_var() . "( 'ec:addProduct', {";
402
+ $code .= "'id': '" . esc_js( $_product->get_sku() ? $_product->get_sku() : $_product->get_id() ) . "',";
403
$code .= "'name': '" . esc_js( $item['name'] ) . "',";
404
$code .= "'category': " . self::product_get_category_line( $_product );
405
$code .= "'price': '" . esc_js( $order->get_item_total( $item ) ) . "',";
415
* @return string Line of JSON
416
*/
417
private static function product_get_category_line( $_product ) {
418
+ $variation_data = version_compare( WC_VERSION, '3.0', '<' ) ? $_product->variation_data : ( $_product->is_type( 'variation' ) ? wc_get_product_variation_attributes( $_product->get_id() ) : '' );
419
+ if ( is_array( $variation_data ) && ! empty( $variation_data ) ) {
420
+ $code = "'" . esc_js( wc_get_formatted_variation( $_product->variation_data, true ) ) . "',";
421
} else {
422
$out = array();
423
+ $categories = get_the_terms( $_product->get_id(), 'product_cat' );
424
if ( $categories ) {
425
foreach ( $categories as $category ) {
426
$out[] = $category->name;
441
(function($) {
442
$( '.remove' ).click( function() {
443
" . self::tracker_var() . "( 'ec:addProduct', {
444
+ 'id': ($(this).data('product_sku')) ? ($(this).data('product_sku')) : ('#' + $(this).data('product_id')),
445
'quantity': $(this).parent().parent().find( '.qty' ).val() ? $(this).parent().parent().find( '.qty' ).val() : '1',
446
} );
447
" . self::tracker_var() . "( 'ec:setAction', 'remove' );
456
* Tracks a product detail view
457
*/
458
function product_detail( $product ) {
459
+ if ( empty( $product ) ) {
460
+ return;
461
+ }
462
+
463
wc_enqueue_js( "
464
" . self::tracker_var() . "( 'ec:addProduct', {
465
+ 'id': '" . esc_js( $product->get_sku() ? $product->get_sku() : ( '#' . $product->get_id() ) ) . "',
466
'name': '" . esc_js( $product->get_title() ) . "',
467
'category': " . self::product_get_category_line( $product ) . "
468
'price': '" . esc_js( $product->get_price() ) . "',
480
foreach ( $cart as $cart_item_key => $cart_item ) {
481
$product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
482
$code .= "" . self::tracker_var() . "( 'ec:addProduct', {
483
+ 'id': '" . esc_js( $product->get_sku() ? $product->get_sku() : ( '#' . $product->get_id() ) ) . "',
484
'name': '" . esc_js( $product->get_title() ) . "',
485
'category': " . self::product_get_category_line( $product ) . "
486
'price': '" . esc_js( $product->get_price() ) . "',
includes/class-wc-google-analytics.php CHANGED
@@ -73,6 +73,7 @@ class WC_Google_Analytics extends WC_Integration {
73
'ga_set_domain_name',
74
'ga_standard_tracking_enabled',
75
'ga_support_display_advertising',
76
'ga_use_universal_analytics',
77
'ga_anonymize_enabled',
78
'ga_ecommerce_tracking_enabled',
@@ -126,6 +127,13 @@ class WC_Google_Analytics extends WC_Integration {
126
'checkboxgroup' => '',
127
'default' => get_option( 'woocommerce_ga_support_display_advertising' ) ? get_option( 'woocommerce_ga_support_display_advertising' ) : 'no' // Backwards compat
128
),
129
'ga_use_universal_analytics' => array(
130
'label' => __( 'Enable Universal Analytics', 'woocommerce-google-analytics-integration' ),
131
'description' => sprintf( __( 'Uses Universal Analytics instead of Classic Google Analytics. If you have <strong>not</strong> previously used Google Analytics on this site, check this box. Otherwise, %sfollow step 1 of the Universal Analytics upgrade guide.%s Enabling this setting will take care of step 2. %sRead more about Universal Analytics%s. Universal Analytics must be enabled to enable enhanced eCommerce.', 'woocommerce-google-analytics-integration' ), '<a href="https://developers.google.com/analytics/devguides/collection/upgrade/guide" target="_blank">', '</a>', '<a href="https://support.google.com/analytics/answer/2790010?hl=en" target="_blank">', '</a>' ),
@@ -225,12 +233,13 @@ class WC_Google_Analytics extends WC_Integration {
225
*/
226
function track_options( $data ) {
227
$data['wc-google-analytics'] = array(
228
- 'standard_tracking_enabled' => $this->ga_standard_tracking_enabled,
229
- 'support_display_advertising' => $this->ga_support_display_advertising,
230
- 'use_universal_analytics' => $this->ga_use_universal_analytics,
231
- 'anonymize_enabled' => $this->ga_anonymize_enabled,
232
- 'ecommerce_tracking_enabled' => $this->ga_ecommerce_tracking_enabled,
233
- 'event_tracking_enabled' => $this->ga_event_tracking_enabled
234
);
235
return $data;
236
}
@@ -351,11 +360,12 @@ class WC_Google_Analytics extends WC_Integration {
351
$parameters = array();
352
$parameters['category'] = "'" . __( 'Products', 'woocommerce-google-analytics-integration' ) . "'";
353
$parameters['action'] = "'" . __( 'Add to Cart', 'woocommerce-google-analytics-integration' ) . "'";
354
- $parameters['label'] = "'" . esc_js( $product->get_sku() ? __( 'SKU:', 'woocommerce-google-analytics-integration' ) . ' ' . $product->get_sku() : "#" . $product->id ) . "'";
355
356
if ( ! $this->disable_tracking( $this->ga_enhanced_ecommerce_tracking_enabled ) ) {
357
$code = "" . WC_Google_Analytics_JS::get_instance()->tracker_var() . "( 'ec:addProduct', {";
358
- $code .= "'id': '" . esc_js( $product->get_sku() ? $product->get_sku() : $product->id ) . "',";
359
$code .= "'quantity': $( 'input.qty' ).val() ? $( 'input.qty' ).val() : '1'";
360
$code .= "} );";
361
$parameters['enhanced'] = $code;
@@ -393,7 +403,7 @@ class WC_Google_Analytics extends WC_Integration {
393
394
$item = WC()->cart->get_cart_item( $key );
395
$product = $item['data'];
396
- $url = str_replace( 'href=', 'data-product_id="' . esc_attr( $product->id ) . '" data-product_sku="' . esc_attr( $product->get_sku() ) . '" href=', $url );
397
return $url;
398
}
399
@@ -411,11 +421,11 @@ class WC_Google_Analytics extends WC_Integration {
411
$parameters = array();
412
$parameters['category'] = "'" . __( 'Products', 'woocommerce-google-analytics-integration' ) . "'";
413
$parameters['action'] = "'" . __( 'Add to Cart', 'woocommerce-google-analytics-integration' ) . "'";
414
- $parameters['label'] = "($(this).data('product_sku')) ? ('SKU: ' + $(this).data('product_sku')) : ('#' + $(this).data('product_id'))"; // Product SKU or ID
415
416
if ( ! $this->disable_tracking( $this->ga_enhanced_ecommerce_tracking_enabled ) ) {
417
$code = "" . WC_Google_Analytics_JS::get_instance()->tracker_var() . "( 'ec:addProduct', {";
418
- $code .= "'id': ($(this).data('product_sku')) ? ('SKU: ' + $(this).data('product_sku')) : ('#' + $(this).data('product_id')),";
419
$code .= "'quantity': $(this).data('quantity')";
420
$code .= "} );";
421
$parameters['enhanced'] = $code;
73
'ga_set_domain_name',
74
'ga_standard_tracking_enabled',
75
'ga_support_display_advertising',
76
+ 'ga_support_enhanced_link_attribution',
77
'ga_use_universal_analytics',
78
'ga_anonymize_enabled',
79
'ga_ecommerce_tracking_enabled',
127
'checkboxgroup' => '',
128
'default' => get_option( 'woocommerce_ga_support_display_advertising' ) ? get_option( 'woocommerce_ga_support_display_advertising' ) : 'no' // Backwards compat
129
),
130
+ 'ga_support_enhanced_link_attribution' => array(
131
+ 'label' => __( 'Use Enhanced Link Attribution', 'woocommerce-google-analytics-integration' ),
132
+ 'description' => sprintf( __( 'Set the Google Analytics code to support Enhanced Link Attribution. %sRead more about Enhanced Link Attribution%s.', 'woocommerce-google-analytics-integration' ), '<a href="https://support.google.com/analytics/answer/2558867?hl=en" target="_blank">', '</a>' ),
133
+ 'type' => 'checkbox',
134
+ 'checkboxgroup' => '',
135
+ 'default' => get_option( 'woocommerce_ga_support_enhanced_link_attribution' ) ? get_option( 'woocommerce_ga_support_enhanced_link_attribution' ) : 'no' // Backwards compat
136
+ ),
137
'ga_use_universal_analytics' => array(
138
'label' => __( 'Enable Universal Analytics', 'woocommerce-google-analytics-integration' ),
139
'description' => sprintf( __( 'Uses Universal Analytics instead of Classic Google Analytics. If you have <strong>not</strong> previously used Google Analytics on this site, check this box. Otherwise, %sfollow step 1 of the Universal Analytics upgrade guide.%s Enabling this setting will take care of step 2. %sRead more about Universal Analytics%s. Universal Analytics must be enabled to enable enhanced eCommerce.', 'woocommerce-google-analytics-integration' ), '<a href="https://developers.google.com/analytics/devguides/collection/upgrade/guide" target="_blank">', '</a>', '<a href="https://support.google.com/analytics/answer/2790010?hl=en" target="_blank">', '</a>' ),
233
*/
234
function track_options( $data ) {
235
$data['wc-google-analytics'] = array(
236
+ 'standard_tracking_enabled' => $this->ga_standard_tracking_enabled,
237
+ 'support_display_advertising' => $this->ga_support_display_advertising,
238
+ 'support_enhanced_link_attribution' => $this->ga_support_enhanced_link_attribution,
239
+ 'use_universal_analytics' => $this->ga_use_universal_analytics,
240
+ 'anonymize_enabled' => $this->ga_anonymize_enabled,
241
+ 'ecommerce_tracking_enabled' => $this->ga_ecommerce_tracking_enabled,
242
+ 'event_tracking_enabled' => $this->ga_event_tracking_enabled
243
);
244
return $data;
245
}
360
$parameters = array();
361
$parameters['category'] = "'" . __( 'Products', 'woocommerce-google-analytics-integration' ) . "'";
362
$parameters['action'] = "'" . __( 'Add to Cart', 'woocommerce-google-analytics-integration' ) . "'";
363
+ $parameters['label'] = "'" . esc_js( $product->get_sku() ? __( 'ID:', 'woocommerce-google-analytics-integration' ) . ' ' . $product->get_sku() : "#" . $product->get_id() ) . "'";
364
365
if ( ! $this->disable_tracking( $this->ga_enhanced_ecommerce_tracking_enabled ) ) {
366
$code = "" . WC_Google_Analytics_JS::get_instance()->tracker_var() . "( 'ec:addProduct', {";
367
+ $code .= "'id': '" . esc_js( $product->get_sku() ? $product->get_sku() : ( '#' . $product->get_id() ) ) . "',";
368
+ $code .= "'name': '" . esc_js( $product->get_title() ) . "',";
369
$code .= "'quantity': $( 'input.qty' ).val() ? $( 'input.qty' ).val() : '1'";
370
$code .= "} );";
371
$parameters['enhanced'] = $code;
403
404
$item = WC()->cart->get_cart_item( $key );
405
$product = $item['data'];
406
+ $url = str_replace( 'href=', 'data-product_id="' . esc_attr( $product->get_id() ) . '" data-product_sku="' . esc_attr( $product->get_sku() ) . '" href=', $url );
407
return $url;
408
}
409
421
$parameters = array();
422
$parameters['category'] = "'" . __( 'Products', 'woocommerce-google-analytics-integration' ) . "'";
423
$parameters['action'] = "'" . __( 'Add to Cart', 'woocommerce-google-analytics-integration' ) . "'";
424
+ $parameters['label'] = "($(this).data('product_sku')) ? ($(this).data('product_sku')) : ('#' + $(this).data('product_id'))"; // Product SKU or ID
425
426
if ( ! $this->disable_tracking( $this->ga_enhanced_ecommerce_tracking_enabled ) ) {
427
$code = "" . WC_Google_Analytics_JS::get_instance()->tracker_var() . "( 'ec:addProduct', {";
428
+ $code .= "'id': ($(this).data('product_sku')) ? ($(this).data('product_sku')) : ('#' + $(this).data('product_id')),";
429
$code .= "'quantity': $(this).data('quantity')";
430
$code .= "} );";
431
$parameters['enhanced'] = $code;
package.json CHANGED
@@ -1,7 +1,7 @@
1
{
2
"name": "woocommerce-google-analytics-integration",
3
"title": "WooCommerce Google Analytics Integration",
4
- "version": "1.4.0",
5
"homepage": "https://wordpress.org/plugins/woocommerce-google-analytics-integration/",
6
"repository": {
7
"type": "git",
1
{
2
"name": "woocommerce-google-analytics-integration",
3
"title": "WooCommerce Google Analytics Integration",
4
+ "version": "1.4.1",
5
"homepage": "https://wordpress.org/plugins/woocommerce-google-analytics-integration/",
6
"repository": {
7
"type": "git",
readme.txt CHANGED
@@ -1,9 +1,9 @@
1
=== WooCommerce Google Analytics Integration ===
2
- Contributors: woothemes, claudiosanches
3
Tags: woocommerce, google analytics
4
Requires at least: 3.8
5
Tested up to: 4.5.2
6
- Stable tag: 1.4.0
7
License: GPLv3
8
License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
@@ -64,7 +64,18 @@ Exact wording depends on the national data privacy laws and should be adjusted.
64
65
== Changelog ==
66
67
- = 1.4.0 - 20-11-2015
68
* Feature - Support for enhanced eCommerce (tracking full store process from view to order)
69
* Tweak - Setting up the plugin is now clearer with some helpful links and clearer language
70
* Tweak - New filter on the ga global variable
@@ -103,3 +114,8 @@ Exact wording depends on the national data privacy laws and should be adjusted.
103
= 1.0 - 22/11/2013 =
104
105
* Initial release
1
=== WooCommerce Google Analytics Integration ===
2
+ Contributors: woothemes, claudiosanches, bor0
3
Tags: woocommerce, google analytics
4
Requires at least: 3.8
5
Tested up to: 4.5.2
6
+ Stable tag: 1.4.1
7
License: GPLv3
8
License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
64
65
== Changelog ==
66
67
+ = 1.4.1 - 01/05/2017 =
68
+
69
+ * Add - Filters for GA snippet (woocommerce_ga_snippet_head, woocommerce_ga_snippet_create, woocommerce_ga_snippet_require, woocommerce_ga_snippet_output)
70
+ * Add - Option to toggle on/off Enhanced Link Attribution
71
+ * Fix - JavaScript break by wrapping it in quotes
72
+ * Fix - Use ID and SKU data in a consistent way so that all products are correctly tracked.
73
+ * Fix - Updates for WooCommerce 3.0 compatibility.
74
+ * Add - Settings link to the plugin in the Plugins screen
75
+ * Fix - Fatal error on shortcode usage for empty product
76
+
77
+ = 1.4.0 - 20/11/2015 =
78
+
79
* Feature - Support for enhanced eCommerce (tracking full store process from view to order)
80
* Tweak - Setting up the plugin is now clearer with some helpful links and clearer language
81
* Tweak - New filter on the ga global variable
114
= 1.0 - 22/11/2013 =
115
116
* Initial release
117
+
118
+
119
+ == Upgrade Notice ==
120
+ = 1.4.0 =
121
+ Adds support for enhanced eCommerce (tracking full store process from view to order)
woocommerce-google-analytics-integration.php CHANGED
@@ -3,9 +3,9 @@
3
* Plugin Name: WooCommerce Google Analytics Integration
4
* Plugin URI: http://wordpress.org/plugins/woocommerce-google-analytics-integration/
5
* Description: Allows Google Analytics tracking code to be inserted into WooCommerce store pages.
6
- * Author: WooThemes
7
- * Author URI: http://woothemes.com
8
- * Version: 1.4.0
9
* License: GPLv2 or later
10
* Text Domain: woocommerce-google-analytics-integration
11
* Domain Path: languages/
@@ -27,7 +27,7 @@ class WC_Google_Analytics_Integration {
27
*
28
* @var string
29
*/
30
- const VERSION = '1.4.0';
31
32
/**
33
* Instance of this class.
@@ -52,6 +52,25 @@ class WC_Google_Analytics_Integration {
52
} else {
53
add_action( 'admin_notices', array( $this, 'woocommerce_missing_notice' ) );
54
}
55
}
56
57
/**
3
* Plugin Name: WooCommerce Google Analytics Integration
4
* Plugin URI: http://wordpress.org/plugins/woocommerce-google-analytics-integration/
5
* Description: Allows Google Analytics tracking code to be inserted into WooCommerce store pages.
6
+ * Author: WooCommerce
7
+ * Author URI: https://woocommerce.com
8
+ * Version: 1.4.1
9
* License: GPLv2 or later
10
* Text Domain: woocommerce-google-analytics-integration
11
* Domain Path: languages/
27
*
28
* @var string
29
*/
30
+ const VERSION = '1.4.1';
31
32
/**
33
* Instance of this class.
52
} else {
53
add_action( 'admin_notices', array( $this, 'woocommerce_missing_notice' ) );
54
}
55
+
56
+ add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( $this, 'plugin_links' ) );
57
+ }
58
+
59
+ public function plugin_links( $links ) {
60
+ $settings_url = add_query_arg(
61
+ array(
62
+ 'page' => 'wc-settings',
63
+ 'tab' => 'integration',
64
+ ),
65
+ admin_url( 'admin.php' )
66
+ );
67
+
68
+ $plugin_links = array(
69
+ '<a href="' . esc_url( $settings_url ) . '">' . __( 'Settings', 'woocommerce-google-analytics-integration' ) . '</a>',
70
+ '<a href="https://wordpress.org/support/plugin/woocommerce-google-analytics-integration">' . __( 'Support', 'woocommerce-google-analytics-integration' ) . '</a>',
71
+ );
72
+
73
+ return array_merge( $plugin_links, $links );
74
}
75
76
/**