2012-04-30 19:50:35 +00:00
< ? php
/**
* Google Analytics Integration
*
* Allows tracking code to be inserted into store pages .
*
* @ class WC_Google_Analytics
* @ package WooCommerce
* @ category Integrations
* @ author WooThemes
*/
class WC_Google_Analytics extends WC_Integration {
public function __construct () {
$this -> id = 'google_analytics' ;
$this -> method_title = __ ( 'Google Analytics' , 'woocommerce' );
$this -> method_description = __ ( 'Google Analytics is a free service offered by Google that generates detailed statistics about the visitors to a website.' , 'woocommerce' );
// Load the form fields.
$this -> init_form_fields ();
// Load the settings.
$this -> init_settings ();
// Define user set variables
$this -> ga_id = $this -> settings [ 'ga_id' ];
$this -> ga_standard_tracking_enabled = $this -> settings [ 'ga_standard_tracking_enabled' ];
$this -> ga_ecommerce_tracking_enabled = $this -> settings [ 'ga_ecommerce_tracking_enabled' ];
2012-07-29 20:39:28 +00:00
$this -> ga_event_tracking_enabled = $this -> settings [ 'ga_event_tracking_enabled' ];
2012-04-30 19:50:35 +00:00
// Actions
add_action ( 'woocommerce_update_options_integration_google_analytics' , array ( & $this , 'process_admin_options' ) );
// Tracking code
add_action ( 'wp_footer' , array ( & $this , 'google_tracking_code' ) );
add_action ( 'woocommerce_thankyou' , array ( & $this , 'ecommerce_tracking_code' ) );
2012-07-29 20:39:28 +00:00
// Event tracking code
add_action ( 'woocommerce_after_add_to_cart_button' , array ( & $this , 'add_to_cart' ) );
2012-07-30 15:01:33 +00:00
add_action ( 'woocommerce_after_shop_loop' , array ( & $this , 'loop_add_to_cart' ) );
2012-04-30 19:50:35 +00:00
}
/**
* Initialise Settings Form Fields
*/
function init_form_fields () {
$this -> form_fields = array (
'ga_id' => array (
'title' => __ ( 'Google Analytics ID' , 'woocommerce' ),
'description' => __ ( 'Log into your google analytics account to find your ID. e.g. <code>UA-XXXXX-X</code>' , 'woocommerce' ),
'type' => 'text' ,
2012-05-11 20:41:18 +00:00
'default' => get_option ( 'woocommerce_ga_id' ) // Backwards compat
2012-04-30 19:50:35 +00:00
),
'ga_standard_tracking_enabled' => array (
'title' => __ ( 'Tracking code' , 'woocommerce' ),
'label' => __ ( 'Add tracking code to your site\'s footer. You don\'t need to enable this if using a 3rd party analytics plugin.' , 'woocommerce' ),
'type' => 'checkbox' ,
'checkboxgroup' => 'start' ,
2012-05-11 20:41:18 +00:00
'default' => get_option ( 'woocommerce_ga_standard_tracking_enabled' ) ? get_option ( 'woocommerce_ga_standard_tracking_enabled' ) : 'no' // Backwards compat
2012-04-30 19:50:35 +00:00
),
'ga_ecommerce_tracking_enabled' => array (
'label' => __ ( 'Add eCommerce tracking code to the thankyou page' , 'woocommerce' ),
'type' => 'checkbox' ,
2012-07-29 20:39:28 +00:00
'checkboxgroup' => '' ,
2012-05-11 20:41:18 +00:00
'default' => get_option ( 'woocommerce_ga_ecommerce_tracking_enabled' ) ? get_option ( 'woocommerce_ga_ecommerce_tracking_enabled' ) : 'no' // Backwards compat
2012-07-29 20:39:28 +00:00
),
'ga_event_tracking_enabled' => array (
'label' => __ ( 'Add event tracking code for add to cart actions' , 'woocommerce' ),
'type' => 'checkbox' ,
'checkboxgroup' => 'end' ,
'default' => 'no'
2012-04-30 19:50:35 +00:00
)
);
2012-05-03 15:56:08 +00:00
} // End init_form_fields()
/**
* Google Analytics standard tracking
**/
function google_tracking_code () {
global $woocommerce ;
2012-05-11 20:41:18 +00:00
if ( is_admin () || current_user_can ( 'manage_options' ) || $this -> ga_standard_tracking_enabled == " no " ) return ;
2012-05-03 15:56:08 +00:00
2012-05-11 20:41:18 +00:00
$tracking_id = $this -> ga_id ;
2012-05-03 15:56:08 +00:00
if ( ! $tracking_id ) return ;
$loggedin = ( is_user_logged_in () ) ? 'yes' : 'no' ;
if ( is_user_logged_in () ) {
$user_id = get_current_user_id ();
$current_user = get_user_by ( 'id' , $user_id );
$username = $current_user -> user_login ;
} else {
$user_id = '' ;
$username = __ ( 'Guest' , 'woocommerce' );
2012-04-30 19:50:35 +00:00
}
2012-07-30 15:01:33 +00:00
$woocommerce -> add_inline_js ( "
2012-04-30 19:50:35 +00:00
2012-05-03 15:56:08 +00:00
var _gaq = _gaq || [];
_gaq . push (
2012-07-30 15:01:33 +00:00
[ '_setAccount' , '" . $tracking_id . "' ],
[ '_setCustomVar' , 1 , 'logged-in' , '" . $loggedin . "' , 1 ],
[ '_setCustomVar' , 2 , 'user-id' , '" . $user_id . "' , 1 ],
[ '_setCustomVar' , 3 , 'username' , '" . $username . "' , 1 ],
2012-05-03 15:56:08 +00:00
[ '_trackPageview' ]
);
2012-04-30 19:50:35 +00:00
2012-05-03 15:56:08 +00:00
( function () {
var ga = document . createElement ( 'script' ); ga . type = 'text/javascript' ; ga . async = true ;
ga . src = ( 'https:' == document . location . protocol ? 'https://ssl' : 'http://www' ) + '.google-analytics.com/ga.js' ;
var s = document . getElementsByTagName ( 'script' )[ 0 ]; s . parentNode . insertBefore ( ga , s );
})();
2012-07-30 15:01:33 +00:00
" );
2012-05-03 15:56:08 +00:00
}
/**
* Google Analytics eCommerce tracking
**/
function ecommerce_tracking_code ( $order_id ) {
global $woocommerce ;
2012-05-11 20:41:18 +00:00
if ( is_admin () || current_user_can ( 'manage_options' ) || $this -> ga_ecommerce_tracking_enabled == " no " ) return ;
2012-05-03 15:56:08 +00:00
2012-05-11 20:41:18 +00:00
$tracking_id = $this -> ga_id ;
2012-05-03 15:56:08 +00:00
if ( ! $tracking_id ) return ;
// Doing eCommerce tracking so unhook standard tracking from the footer
2012-05-03 16:48:42 +00:00
remove_action ( 'wp_footer' , array ( & $this , 'google_tracking_code' ) );
2012-05-03 15:56:08 +00:00
// Get the order and output tracking code
$order = new WC_Order ( $order_id );
$loggedin = ( is_user_logged_in ()) ? 'yes' : 'no' ;
if ( is_user_logged_in ()) {
$user_id = get_current_user_id ();
$current_user = get_user_by ( 'id' , $user_id );
$username = $current_user -> user_login ;
} else {
$user_id = '' ;
$username = __ ( 'Guest' , 'woocommerce' );
}
2012-07-30 15:01:33 +00:00
$code = "
2012-05-03 15:56:08 +00:00
var _gaq = _gaq || [];
2012-04-30 19:50:35 +00:00
2012-05-03 15:56:08 +00:00
_gaq . push (
2012-07-30 15:01:33 +00:00
[ '_setAccount' , '" . $tracking_id . "' ],
[ '_setCustomVar' , 1 , 'logged-in' , '" . $loggedin . "' , 1 ],
[ '_setCustomVar' , 2 , 'user-id' , '" . $user_id . "' , 1 ],
[ '_setCustomVar' , 3 , 'username' , '" . $username . "' , 1 ],
2012-05-03 15:56:08 +00:00
[ '_trackPageview' ]
);
2012-04-30 19:50:35 +00:00
2012-05-03 15:56:08 +00:00
_gaq . push ([ '_addTrans' ,
2012-07-30 15:01:33 +00:00
'" . $order_id . "' , // order ID - required
'" . get_bloginfo( ' name ' ) . "' , // affiliation or store name
'" . $order->order_total . "' , // total - required
'" . $order->get_total_tax() . "' , // tax
'" . $order->get_shipping() . "' , // shipping
'" . $order->billing_city . "' , // city
'" . $order->billing_state . "' , // state or province
'" . $order->billing_country . "' // country
2012-05-03 15:56:08 +00:00
]);
2012-07-30 15:01:33 +00:00
" ;
2012-04-30 19:50:35 +00:00
2012-07-30 15:01:33 +00:00
// Order items
if ( $order -> get_items () ) {
foreach ( $order -> get_items () as $item ) {
$_product = $order -> get_product_from_item ( $item );
$code .= " _gaq.push(['_addItem', " ;
$code .= " ' " . $order_id . " ', " ;
$code .= " ' " . ( ( ! empty ( $_product -> sku ) ) ? __ ( 'SKU:' , 'woocommerce' ) . ' ' . $_product -> sku : $_product -> id ) . " ', " ;
$code .= " ' " . $item [ 'name' ] . " ', " ;
if ( isset ( $_product -> variation_data ) ) {
$code .= " ' " . woocommerce_get_formatted_variation ( $_product -> variation_data , true ) . " ', " ;
} else {
$out = array ();
$categories = get_the_terms ( $_product -> id , 'product_cat' );
if ( $categories ) {
foreach ( $categories as $category ){
$out [] = $category -> name ;
}
}
$code .= " ' " . join ( " / " , $out ) . " ', " ;
}
$code .= " ' " . ( $item [ 'line_total' ] / $item [ 'qty' ] ) . " ', " ;
$code .= " ' " . $item [ 'qty' ] . " ' " ;
$code .= " ]); " ;
}
}
$code .= "
2012-05-03 15:56:08 +00:00
_gaq . push ([ '_trackTrans' ]); // submits transaction to the Analytics servers
2012-04-30 19:50:35 +00:00
2012-05-03 15:56:08 +00:00
( function () {
var ga = document . createElement ( 'script' ); ga . type = 'text/javascript' ; ga . async = true ;
ga . src = ( 'https:' == document . location . protocol ? 'https://ssl' : 'http://www' ) + '.google-analytics.com/ga.js' ;
var s = document . getElementsByTagName ( 'script' )[ 0 ]; s . parentNode . insertBefore ( ga , s );
})();
2012-07-30 15:01:33 +00:00
" ;
$woocommerce -> add_inline_js ( $code );
2012-05-03 15:56:08 +00:00
}
2012-07-30 15:01:33 +00:00
2012-07-29 20:39:28 +00:00
/**
* Google Analytics event tracking for single product add to cart
*
**/
function add_to_cart () {
2012-07-30 15:01:33 +00:00
if ( $this -> disable_tracking ( $this -> ga_event_tracking_enabled ) ) return ;
if ( ! is_single () ) return ;
2012-07-29 20:39:28 +00:00
global $product ;
$parameters = array ();
// Add single quotes to allow jQuery to be substituted into _trackEvent parameters
$parameters [ 'category' ] = " ' " . __ ( 'Products' , 'woocommerce' ) . " ' " ;
$parameters [ 'action' ] = " ' " . __ ( 'Add to Cart' , 'woocommerce' ) . " ' " ;
2012-07-30 15:01:33 +00:00
$parameters [ 'label' ] = " '# " . esc_js ( $product -> id ) . " ' " ;
2012-07-29 20:39:28 +00:00
2012-07-30 15:01:33 +00:00
$this -> event_tracking_code ( $parameters , '.single_add_to_cart_button' );
2012-07-29 20:39:28 +00:00
}
/**
* Google Analytics event tracking for loop add to cart
*
**/
function loop_add_to_cart () {
2012-07-30 15:01:33 +00:00
if ( $this -> disable_tracking ( $this -> ga_event_tracking_enabled ) ) return ;
2012-07-29 20:39:28 +00:00
$parameters = array ();
// Add single quotes to allow jQuery to be substituted into _trackEvent parameters
$parameters [ 'category' ] = " ' " . __ ( 'Products' , 'woocommerce' ) . " ' " ;
2012-07-30 15:01:33 +00:00
$parameters [ 'action' ] = " ' " . __ ( 'Add to Cart' , 'woocommerce' ) . " ' " ;
$parameters [ 'label' ] = " '#' + $ (this).attr('data-product_id') " ; // Product ID
2012-07-29 20:39:28 +00:00
2012-07-30 15:01:33 +00:00
$this -> event_tracking_code ( $parameters , '.add_to_cart_button' );
2012-07-29 20:39:28 +00:00
}
/**
* Google Analytics event tracking for loop add to cart
*
* @ param array $parameters - associative array of _trackEvent parameters
* @ param string $selector - jQuery selector for binding click event
**/
private function event_tracking_code ( $parameters , $selector ) {
2012-07-30 15:01:33 +00:00
global $woocommerce ;
2012-07-29 20:39:28 +00:00
$parameters = apply_filters ( 'woocommerce_ga_event_tracking_parameters' , $parameters );
2012-07-30 15:01:33 +00:00
$woocommerce -> add_inline_js ( "
$ ( '" . $selector . "' ) . click ( function () {
" . sprintf( " _gaq . push ([ '_trackEvent' , % s , % s , % s ]); " , $parameters['category'] , $parameters['action'] , $parameters['label'] ) . "
2012-07-29 20:39:28 +00:00
});
2012-07-30 15:01:33 +00:00
" );
2012-07-29 20:39:28 +00:00
}
private function disable_tracking ( $type ) {
if ( is_admin () || current_user_can ( 'manage_options' ) || ( ! $this -> ga_id ) || 'no' == $type ) return true ;
}
2012-04-30 19:50:35 +00:00
}
/**
* Add the integration to WooCommerce
**/
function add_google_analytics_integration ( $integrations ) {
$integrations [] = 'WC_Google_Analytics' ; return $integrations ;
}
add_filter ( 'woocommerce_integrations' , 'add_google_analytics_integration' );