You are here

facebook_pixel.module in Facebook Pixel 7

Same filename and directory in other branches
  1. 8 facebook_pixel.module

Drupal Module: Facebook Pixel.

File

facebook_pixel.module
View source
<?php

/**
 * @file
 * Drupal Module: Facebook Pixel.
 */

/**
 * Implements hook_permission().
 */
function facebook_pixel_permission() {
  return array(
    'administer facebook pixel' => array(
      'title' => t('Administer Facebook Pixel'),
      'description' => t('Perform maintenance tasks for Facebook Pixel.'),
    ),
  );
}

/**
 * Implements hook_menu().
 */
function facebook_pixel_menu() {
  $items = array();
  $items['admin/config/system/facebook_pixel'] = array(
    'title' => 'Facebook Pixel',
    'description' => 'Configure Facebook Pixel tracking behavior.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'facebook_pixel_admin_settings_form',
    ),
    'access arguments' => array(
      'administer facebook pixel',
    ),
    'type' => MENU_NORMAL_ITEM,
    'file' => 'facebook_pixel.admin.inc',
  );
  return $items;
}

/**
 * Implements hook_user_insert().
 */
function facebook_pixel_user_insert(&$edit, $account, $category) {
  facebook_pixel_add_event('CompleteRegistration:' . $account->uid);
}

/**
 * Implements hook_node_view().
 *
 * Tracks key page views (ex: product page, landing page, article).
 */
function facebook_pixel_node_view($node, $view_mode, $langcode) {
  if ($view_mode == 'full' && node_is_page($node)) {
    facebook_pixel_add_event('ViewContent:' . $node->nid);
  }
}

/**
 * Implements hook_ctools_render_alter().
 *
 * Tracks key page views (ex: product page, landing page, article),
 * when configured to display from within Panels.
 */
function facebook_pixel_ctools_render_alter(&$info, &$page, &$context) {
  if ($page && !empty($context['handler']->task) && $context['handler']->task == 'node_view') {
    $nid = reset($context['args']);
    facebook_pixel_add_event('ViewContent:' . $nid);
  }
}

/**
 * Implements hook_commerce_cart_product_add().
 *
 * Tracks when items are added to a shopping cart
 * (ex: click, landing page on Add to Cart button).
 */
function facebook_pixel_commerce_cart_product_add($order, $product, $quantity, $line_item) {
  facebook_pixel_add_event('AddToCart:' . $order->order_id);
}

/**
 * Implements hook_commerce_checkout_router().
 *
 * Tracks when people enter the checkout flow
 * (ex: click, landing page on checkout button).
 */
function facebook_pixel_commerce_checkout_router($order, $checkout_page) {
  if ($checkout_page['page_id'] == 'checkout') {
    facebook_pixel_add_event('InitiateCheckout:' . $order->order_id);
  }
}

/**
 * Implements hook_commerce_checkout_complete().
 *
 * Tracks purchases or checkout flow completions
 * (ex: Landing on "Thank You" or confirmation page).
 */
function facebook_pixel_commerce_checkout_complete($order) {
  facebook_pixel_add_event('Purchase:' . $order->order_id);
}

/**
 * Adds Facebook Pixel event to the user session to be added to the page code.
 *
 * @param string $event
 *   A Facebook Pixel event to be added to the page code.
 *
 * @see facebook_pixel_page_alter()
 */
function facebook_pixel_add_event($event) {

  // Add variable to session only if module is configured.
  if (variable_get('facebook_pixel_id')) {
    if (!isset($_SESSION['facebook_pixel'])) {
      $_SESSION['facebook_pixel'] = array();
    }

    // Use event name for array key as well, so that we don't send
    // the same event multiple times.
    $_SESSION['facebook_pixel'][$event] = $event;
  }
}

/**
 * Implements hook_preprocess_page().
 *
 * @see facebook_pixel_add_event()
 */
function facebook_pixel_preprocess_page(&$variables) {
  global $user;
  if (variable_get('facebook_pixel_exclude_admin_paths', 1) && path_is_admin(current_path()) || !facebook_pixel_user_visibility($user)) {
    return;
  }
  if ($pixel_id = variable_get('facebook_pixel_id')) {
    $script = "\n<!-- Facebook Pixel Code -->\n<script>\n!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?\nn.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;\nn.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;\nt.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,\ndocument,'script','//connect.facebook.net/en_US/fbevents.js');\n\nfbq('init', '{$pixel_id}');\nfbq('track', 'PageView');\n";
    if (isset($_SESSION['facebook_pixel']) && is_array($_SESSION['facebook_pixel'])) {
      foreach ($_SESSION['facebook_pixel'] as $event) {
        if (strpos($event, ':') !== FALSE) {
          list($event, $entity_id) = explode(':', $event);
        }
        if (!empty($entity_id) && function_exists('facebook_pixel_data_' . $event)) {
          $data = call_user_func('facebook_pixel_data_' . $event, $entity_id);

          // Allow to alter data.
          drupal_alter('facebook_pixel_data_' . $event, $data, $entity_id);
          $script .= "fbq('track', '{$event}', " . drupal_json_encode($data) . ");\n";
        }
        else {
          $script .= "fbq('track', '{$event}');\n";
        }
      }
      unset($_SESSION['facebook_pixel']);
    }
    $script .= "</script>\n<noscript><img height='1' width='1' style='display:none' src='https://www.facebook.com/tr?id={$pixel_id}&ev=PageView&noscript=1' /></noscript>\n<!-- End Facebook Pixel Code -->\n";
    $element = array(
      '#type' => 'markup',
      '#markup' => $script,
      '#weight' => 1000,
    );
    drupal_add_html_head($element, 'facebook_pixel');
  }
}

/**
 * Provides additional details for the Facebook Pixel Purchase tag.
 *
 * @param int $order_id
 *   ID of the order to return additional Purchase tag details for.
 *
 * @return string
 *   JSON string containing additional Purchase tag details.
 *
 * @see facebook_pixel_commerce_checkout_complete()
 */
function facebook_pixel_data_Purchase($order_id) {
  $order_wrapper = entity_metadata_wrapper('commerce_order', $order_id);
  $order_total = $order_wrapper->commerce_order_total
    ->value();
  $data = array(
    'value' => number_format(commerce_currency_amount_to_decimal($order_total['amount'], $order_total['currency_code']), 2, '.', ''),
    'currency' => $order_total['currency_code'],
  );
  return $data;
}

/**
 * Provides additional details for the Facebook Pixel ViewContent tag.
 *
 * @param int $nid
 *   ID of the viewed Node.
 *
 * @return string
 *   JSON string containing additional ViewContent tag details.
 *
 * @see facebook_pixel_node_view()
 * @see facebook_pixel_ctools_render_alter()
 */
function facebook_pixel_data_ViewContent($nid) {
  $data = array(
    'content_type' => 'product',
    'content_ids' => $nid,
  );
  return $data;
}

/**
 * Utility function to perform tracking visibility check for a user.
 *
 * @param object $user
 *   a user object containing an array of roles to check.
 * @return boolean
 *   whether or not the current user should be served the pixel.
 */
function facebook_pixel_user_visibility($user) {
  $visible = TRUE;
  $roles = variable_get('facebook_pixel_roles', array());
  if (array_sum($roles) > 0) {

    // One or more roles are selected for tracking.
    foreach (array_keys($user->roles) as $rid) {

      // Is the current user a member of a role selected in settings?
      if (isset($roles[$rid]) && $rid == $roles[$rid]) {

        // Current user is a member of a role that is selected in settings.
        $visible = FALSE;
        break;
      }
    }
  }
  return $visible;
}

Functions

Namesort descending Description
facebook_pixel_add_event Adds Facebook Pixel event to the user session to be added to the page code.
facebook_pixel_commerce_cart_product_add Implements hook_commerce_cart_product_add().
facebook_pixel_commerce_checkout_complete Implements hook_commerce_checkout_complete().
facebook_pixel_commerce_checkout_router Implements hook_commerce_checkout_router().
facebook_pixel_ctools_render_alter Implements hook_ctools_render_alter().
facebook_pixel_data_Purchase Provides additional details for the Facebook Pixel Purchase tag.
facebook_pixel_data_ViewContent Provides additional details for the Facebook Pixel ViewContent tag.
facebook_pixel_menu Implements hook_menu().
facebook_pixel_node_view Implements hook_node_view().
facebook_pixel_permission Implements hook_permission().
facebook_pixel_preprocess_page Implements hook_preprocess_page().
facebook_pixel_user_insert Implements hook_user_insert().
facebook_pixel_user_visibility Utility function to perform tracking visibility check for a user.