You are here

function uc_googleanalytics_ecommerce_js in Ubercart 7.3

Same name and namespace in other branches
  1. 8.4 uc_googleanalytics/uc_googleanalytics.module \uc_googleanalytics_ecommerce_js()
  2. 6.2 uc_googleanalytics/uc_googleanalytics.module \uc_googleanalytics_ecommerce_js()

Build the e-commerce JS passed to Google Analytics for order tracking.

Parameters

$order: The fully loaded order object to convert into GA JS.

Return value

string The JS that should be added to the page footer.

1 call to uc_googleanalytics_ecommerce_js()
uc_googleanalytics_page_alter in uc_googleanalytics/uc_googleanalytics.module
Implements hook_page_alter().

File

uc_googleanalytics/uc_googleanalytics.module, line 100
Adds Google Analytics Javascript to the checkout completion page.

Code

function uc_googleanalytics_ecommerce_js($order) {
  $analytics_version = variable_get('uc_googleanalytics_version', 'ga.js');
  if ($analytics_version == 'analytics.js') {
    $script = 'ga("require", "ecommerce", "ecommerce.js");';
  }
  else {
    $script = '';
  }

  // Lookup the name of the country or default to the ID if it can't be found
  // for some reason.
  if ($country_data = uc_get_country_data(array(
    'country_id' => $order->billing_country,
  ))) {
    $order->billing_country_name = $country_data[0]['country_name'];
  }
  else {
    $order->billing_country_name = $order->billing_country;
  }

  // Lookup the name of the zone.
  $order->billing_zone_name = uc_zone_get_by_id($order->billing_zone);

  // Calculate order tax and shipping totals.
  $order->tax_total = 0;
  $order->shipping_total = 0;
  foreach ($order->line_items as $line_item) {
    if ($line_item['type'] == 'tax') {
      $order->tax_total += $line_item['amount'];
    }
    elseif ($line_item['type'] == 'shipping') {
      $order->shipping_total += $line_item['amount'];
    }
  }

  // Build the transaction arguments.
  $trans = array(
    'order_id' => $order->order_id,
    'store' => uc_store_name(),
    'total' => $order->order_total,
    'tax' => $order->tax_total,
    'shipping' => $order->shipping_total,
    'city' => $order->billing_city,
    'state' => $order->billing_zone_name,
    'country' => $order->billing_country_name,
  );

  // Allow modules to alter the transaction arguments.
  drupal_alter('ucga_trans', $trans, $order);

  // Create GA-friendly associative array.
  $script_args = array(
    'id' => $trans['order_id'],
    'affiliation' => $trans['store'],
    'revenue' => $trans['total'],
    'tax' => $trans['tax'],
    'shipping' => $trans['shipping'],
    'city' => $trans['city'],
    'region' => $trans['state'],
    'country' => $trans['country'],
  );

  // Add the transaction line to the JS.
  if ($analytics_version == 'analytics.js') {
    $script .= 'ga("ecommerce:addTransaction", ' . drupal_json_encode($script_args) . ');';
  }
  else {
    foreach ($script_args as &$arg) {
      $arg = drupal_json_encode($arg);
    }
    $script .= '_gaq.push(["_addTrans", ' . implode(', ', $script_args) . ']);';
  }

  // Loop through the products on the order.
  foreach ($order->products as $product) {
    $product->category = '';

    // Try to find a category (term) for the product. Since products most often
    // only have one category, the first one returned (in the
    // $node->taxonomy_catalog) is chosen.
    if (module_exists('taxonomy')) {
      $node = node_load($product->nid);
      if (isset($node->taxonomy_catalog[LANGUAGE_NONE][0]['tid'])) {
        $term = taxonomy_term_load($node->taxonomy_catalog[LANGUAGE_NONE][0]['tid']);
        $product->category = $term->name;
      }
    }
    if (empty($product->category)) {
      $product->category = t('No category');
    }

    // Build the item arguments.
    $item = array(
      'order_id' => $order->order_id,
      'sku' => $product->model,
      'name' => $product->title,
      'category' => $product->category,
      'price' => $product->price,
      'qty' => $product->qty,
    );

    // Allow modules to alter the item arguments.
    drupal_alter('ucga_item', $item, $product, $trans, $order);

    // Create GA-friendly associative array.
    $script_args = array(
      'id' => $item['order_id'],
      'sku' => $item['sku'],
      'name' => $item['name'],
      'category' => (string) $item['category'],
      'price' => $item['price'],
      'quantity' => $item['qty'],
    );

    // Add the item line to the JS.
    if ($analytics_version == 'analytics.js') {
      $script .= 'ga("ecommerce:addItem", ' . drupal_json_encode($script_args) . ');';
    }
    else {
      foreach ($script_args as &$arg) {
        $arg = drupal_json_encode($arg);
      }
      $script .= '_gaq.push(["_addItem", ' . implode(', ', $script_args) . ']);';
    }
  }

  // Add the function to submit the transaction to GA.
  if ($analytics_version == 'analytics.js') {
    $script .= 'ga("ecommerce:send");';
  }
  else {
    $script .= '_gaq.push(["_trackTrans"]);';
  }
  return $script;
}