Drupal Commerce AdWords-module: verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Regel 387: Regel 387:
  
 
* http://drupal.stackexchange.com/questions/71743/how-can-i-get-the-order-id-from-commerce-using-rules
 
* http://drupal.stackexchange.com/questions/71743/how-can-i-get-the-order-id-from-commerce-using-rules
 +
 +
''' Order uitlezen » hook_entity_insert & hook_entity_update '''
 +
 +
* http://drupal.stackexchange.com/questions/91637/what-is-the-hook-when-a-commerce-order-is-updated

Versie van 3 dec 2016 10:57

In 2013/2014 is module uc_adword geímplementeerd: Dynamische conversion-tracking voor Übercart 2/Drupal 6. Dit is geen 'complete' module en bevat zelfs geen grafische interface, maar hij doet precies waar-ie voor bedoeld is. De module is vrijgegeven onder de GPL V2.

Eind 2016 was er geen ontkomen meer aan: De module moest omgezet worden naar Drupal 7/Drupal Commerce 1.x, onder de naam commerce_adwords.

uc_adwords: Hoe het werkt

De module declareert twee functies die dankzij de juiste hooks rondom de dankjewel-pagina hun ding doen. Je hoeft dus geen code in te voegen in blocks of pagina's. In de code kun parameter PRODUCTS_ONLY gebruiken om te bepalen dat het orderbedrag in- of exclusief vervoerskosten overgenomen moet worden. Iets meer in detail:

  • uc_adwords_order() detecteert nieuwe orders, en slaat de order-id op in een custom sessie-variablee
  • uc_adwords_footer() detecteert de dankjewel-pagina. Haalt de sessie-variabele op, roept de tag-functie aan, en output de tag naar de footer
  • add_adwords_js() Genereer en retourneer AdWords-tag.

Welk bedrag precies?

Orderbedrag minus vrachtkosten minus BTW:

20151009-01.png
20151009-02.png

Drupal 7: Overzicht bestaande modules

Ik geloof niet dat er een module bestaat die dit dynamisch doet:


Event-debugging

Gebruik drush fn-hook om een overzicht te krijgen van geregistreerde hooks. Bv.:

drush fn-hook commerce_checkout_complete

Enter the number of the hook implementation you wish to view.
 [0]  :  Cancel           
 [1]  :  commerce_adwords 
 [2]  :  commerce_cart

1

// file: /var/www/kbo215.dvb/sites/all/modules/commerce_adwords/commerce_adwords.module, lines 7-10
function commerce_adwords_commerce_checkout_complete($order)
{
	print phpinfo();
}

Tag invoegen - hook_init

Dit werkt:

<?php

/////////////////////////////////////////////
// hook - commerce_checkout_complete($order)
/////////////////////////////////////////////
//
// Werkt niet. Zie http://wiki.devliegendebrigade.nl/Drupal_Commerce_AdWords-module
//
// function commerce_adwords_commerce_checkout_complete($order)
// {
//	print phpinfo();
// }	

/////////////////////////////////////////////
// hook_init()
/////////////////////////////////////////////
//
// Dit is de basis
// 
// * hook_init() is run on every page load except for cached pages, 
//   so depending on your use case that might be an option.
// * (http://drupal.stackexchange.com/questions/33789/how-to-run-check-on-each-page-load)
//
// function commerce_adwords_init()
// {
// 	print "commerce_adwords_init";
// }	

/////////////////////////////////////////////
// commerce_adwords_init()
/////////////////////////////////////////////
//
function commerce_adwords_init()
{
	if (arg(0)=='checkout' && arg(2)=='complete')
	{
		print phpinfo();
	}
}

Nieuwe order & hook

Geen eigen Drupal Commerce-hook?

Diverse bronnen geven aan dat Drupal Commerce geen eigen hook heeft rondom updaten van orders, en dat je daar de generieke hook_entity_insert of hook_entity_update() voor kunt gebruiken.

hook_commerce_checkout_complete

Het gaat om dit event
  • Een nieuwe order is een feit op het moment dat de order-email wordt verstuurd. Dat is waarschijnlijk het moment van checkout_completion, niet het moment waarop een order definitief is, want soms moet er nog betaald worden (bv. bij bankoverschrijving) → Dat hoeft niet het moment te zijn dat een nieuwe order daadwerkelijk is gegenereerd
  • Alternatief event: URL detecteren → Dat hoeft niet het moment te zijn dat een nieuwe order daadwerkelijk is gegenereerd.

Dit zijn de eerste regels van de code-export van het checkout_completetion_email_send-event. Deze lijkt hook commerce_checkout_complete te suggereren:

{ "commerce_checkout_order_email" : 
   {
      "LABEL" : "Send an order notification e-mail",
      "PLUGIN" : "reaction rule",
      "WEIGHT" : "4",
      "OWNER" : "rules",
      "TAGS" : [ "Commerce Checkout" ],
      "REQUIRES" : [ "rules", "commerce_checkout" ],
      "ON" : { "commerce_checkout_complete" : [] },
...

Lang verhaal kort: Dit werkt niet. Zie de bronnen voor details.

Appendix: Broncode uc_adwords

uc_adwords.info

name = uc_adwords
description = Implements dynamic conversion tracking for adwords in ubercart
version = 6.x-0.1
core = 6.x
package = Custom
files[] = uc_adwords.module

uc_adwords.install

Er is geen installatie-procedure:

<?php

uc_adwords.module - 2014

<?php

define('PRODUCTS_ONLY', FALSE); // If set to TRUE google_conversion_value will be products only (without shipping costs)

function uc_adwords_footer () {
  // Check to see if we are at the order completion page.
  if (arg(0) == 'cart' && arg(1) == 'checkout' && arg(2) == 'complete') {
    // If we can load the order...
    if ($order = uc_order_load($_SESSION['uc_adwords_order_id'])) {
      $output = add_adwords_js($order);
    }
    // Clean out the session variable.
    unset($_SESSION['uc_adwords_order_id']);
  }
  return $output;
}

/**
 * Implementation of hook_order().
 */
function uc_adwords_order($op, &$arg1, $arg2) {
  switch ($op) {
    case 'new':
      // Store the order ID for later use.
      $_SESSION['uc_adwords_order_id'] = $arg1->order_id;
      break;
  }
}

function add_adwords_js ($order) {
	//global $_google_adwords_footer_script;

	$script = '';

	// google adwords parameters
        //
	$google_conversion_id = 986212345;
	$google_conversion_language = "en";
	$google_conversion_format = "2";
	$google_conversion_color = "ffffff";
	$google_conversion_label = "FM3zCM-12345qc2m1gM";
	$google_remarketing_only = false;

	// conversion value
	// ================
	//
	// Value PRODUCTS_ONLY (boolean)
	//
	// true : Only value of products incorporated, ex. transportation cost
	// false: Complete order amount incorporated
	//
	$PRODUCTS_ONLY = True;

	if (PRODUCTS_ONLY)
		$google_conversion_value = uc_order_get_total($order, TRUE);
	else {
		$google_conversion_value = $order->order_total;
	}
	$google_conversion_value = uc_currency_format($google_conversion_value, FALSE, TRUE, '.');

	// google adwords script
  $script = '';    
  $script .= "\n" . '<!-- Google Code for Order Complete scherm Conversion Page -->' . "\n";
  $script .= '<script type="text/javascript">' . "\n";
  //$script .= '<!--' . "\n";
  $script .= ' /* <![CDATA[ */' . "\n";
  $script .= '    var google_conversion_id = '. $google_conversion_id .';' . "\n";
  $script .= '    var google_conversion_language = "'. $google_conversion_language .'";' . "\n";
  $script .= '    var google_conversion_format = "'. $google_conversion_format .'";' . "\n";
  $script .= '    var google_conversion_color = "'. $google_conversion_color .'";' . "\n";
  $script .= '    var google_conversion_label = "'. $google_conversion_label .'";' . "\n";
  $script .= '    var google_conversion_value = "'. $google_conversion_value .'";' . "\n";
  $script .= '    var google_remarketing_only = "'. $google_remarketing_only .'";' . "\n";
  $script .= ' /* ]]> */ ' . "\n";
  $script .= '</script>' . "\n";
  $script .= '<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion.js">' . "\n";
  $script .= '</script>' . "\n";
  $script .= '<noscript>' . "\n";
  $script .= '<div style="display:inline;">' . "\n";
  $script .= '<img height="1" width="1" border="0" src="https://www.googleadservices.com/pagead/conversion/' . $google_conversion_id . '?value='. $google_conversion_value .'&label='. $google_conversion_label .'&guid=ON&script=0" alt=""/>' . "\n";
  $script .= '</div>' . "\n";
  $script .= '</noscript>' . "\n";

	return $script;  
}

uc_adwords.module - 2015

Wijzigingen:

  • Google Tag Assistant suggereerde dat geldbedragen numerieke waardes dienen te zijn, en geen strings
  • Voorzien van commentaar
<?php

define('PRODUCTS_ONLY', FALSE); // If set to TRUE google_conversion_value will be products only (without shipping costs)

/////////////////////////////////////////////////////////////////////////
// uc_adwords_footer() 
/////////////////////////////////////////////////////////////////////////
//
// Output the AdWords Conversion-tag at the checkout completion page
//
// * The hook is 'footer'
// * Additionally, check that we're on the checkout completion page
// * Additionally, check that we can load the current order
// * Call function add_adwords_js($order)
//
function uc_adwords_footer () 
{
   if (arg(0) == 'cart' && arg(1) == 'checkout' && arg(2) == 'complete') 
   {
      // If we can load the order...
      if ($order = uc_order_load($_SESSION['uc_adwords_order_id'])) 
      {
         $output = add_adwords_js($order);
       }
       // Clean out the session variable.
       unset($_SESSION['uc_adwords_order_id']);
   }
   return $output;
}

/////////////////////////////////
// uc_adwords_order()
/////////////////////////////////
//
// Intercept any new order and store order-ID in a custom session variable
//
// * Hook = "order": http://www.ubercart.nl/docs/api/hook_order
// * $op:   De action that is being performed
// * $arg1: Order-object
// * $arg2: Eventueel additioneel argument bij $arg1

function uc_adwords_order($op, &$arg1, $arg2) 
{
   switch ($op) 
   {
      case 'new':

         // Store the order ID in a session variable for later use
         //
         $_SESSION['uc_adwords_order_id'] = $arg1->order_id;
         break;
   }
}

/////////////////////////////////
// add_adwords_js()
/////////////////////////////////
//
// Generate tag
//
function add_adwords_js ($order) 
{
   //global $_google_adwords_footer_script;

   $script = '';

   // google adwords parameters
   //
   $google_conversion_id = 986212345;
   $google_conversion_language = "en";
   $google_conversion_format = "2";
   $google_conversion_color = "ffffff";
   $google_conversion_label = "FM3zCM-12345qc2m1gM";
   $google_remarketing_only = false;

   // conversion value
   // ================
   //
   // Value PRODUCTS_ONLY (boolean)
   //
   // true : Only value of products incorporated, ex. transportation cost
   // false: Complete order amount incorporated
   //
   $PRODUCTS_ONLY = True;

   if (PRODUCTS_ONLY)
      $google_conversion_value = uc_order_get_total($order, TRUE);
   else 
   {
      $google_conversion_value = $order->order_total;
   }

   $google_conversion_value = uc_currency_format($google_conversion_value, FALSE, TRUE, '.');

   // Assemble Adwords tag
   // ====================
   //
   $script = '';    
   $script .= "\n" . '<!-- Google Code for Order Complete scherm Conversion Page -->' . "\n";
   $script .= '<script type="text/javascript">' . "\n";
   //$script .= '<!--' . "\n";
   $script .= ' /* <![CDATA[ */' . "\n";
   $script .= '    var google_conversion_id = '. $google_conversion_id .';' . "\n";
   $script .= '    var google_conversion_language = "'. $google_conversion_language .'";' . "\n";
   $script .= '    var google_conversion_format = "'. $google_conversion_format .'";' . "\n";
   $script .= '    var google_conversion_color = "'. $google_conversion_color .'";' . "\n";
   $script .= '    var google_conversion_label = "'. $google_conversion_label .'";' . "\n";
   $script .= '    var google_conversion_value = '. $google_conversion_value .';' . "\n";
   $script .= '    var google_remarketing_only = "'. $google_remarketing_only .'";' . "\n";
   $script .= ' /* ]]> */ ' . "\n";
   $script .= '</script>' . "\n";
   $script .= '<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion.js">' . "\n";
   $script .= '</script>' . "\n";
   $script .= '<noscript>' . "\n";
   $script .= '<div style="display:inline;">' . "\n";
   $script .= '<img height="1" width="1" border="0" src="https://www.googleadservices.com/pagead/conversion/' . $google_conversion_id . '?value='. $google_conversion_value .'&label='. $google_conversion_label .'&guid=ON&script=0" alt=""/>' . "\n";
   $script .= '</div>' . "\n";
   $script .= '</noscript>' . "\n";

   return $script;  
}

Bronnen

hook_commerce_checkout_complete

Order uitlezen

Order uitlezen » hook_entity_insert & hook_entity_update