Régler le problème de tracking des objectifs Google Analytics via le module Prestashop

Lier Prestashop aux objectifs e-commerce de Google Analytics

L’e-commerce présente de nombreux avantages et inconvénients par rapport au commerce dit traditionnel. L’un des avantages les plus évident du commerce en ligne est de pouvoir mesurer de nombreux paramètres (sans devoir réaliser de lourdes et couteuses études). Mais toutes les valeurs collectées (provenance de vos visiteurs, prix du panier moyen, …) n’ont de sens que si elles sont interconnectées et vous permettent de tirer des conclusions pertinentes afin d’augmenter vos ventes. Pour cela, il vous suffit de créer gratuitement des objectifs Google Analytics et d’ainsi savoir : quelles sources de trafic vous rapportent le plus, quelles pages font fuir vos visiteurs ou quelles annonces AdWords convertissent réellement vers de l’achat (en liant Analytics et AdWords), par exemple.

Malheureusement le module GA (prestashop/modules/ganalytics) présent par défaut avec chaque boutique Prestashop est capricieux et n’envoie pas toutes les informations nécessaires aux mesures ; je pense notamment au fait que la page confirmation d’achat n’apparaisse pas dans le tunnel de conversion (Funnel Visualization/Schéma de l’entonnoir de conversion).

Le problème est connu mais la communauté Prestashop (pourtant fort active) n’y apporte aucune réponse. Si vous êtes devant la même difficulté, ce qui suit devrait vous intéresser.

Solution

Il y a 2 soucis principaux :

  • Par défaut, le module est greffé sur le hook ‘$HOOK_ORDER_CONFIRMATION’ mais ce dernier ne s’exécute pas alors qu’il est bien appelé.
    • Solution : Créer un nouveau hook (par exemple : ‘$HOOK_CONFIRMATION_PAGE’) qui, lorsqu’il est appelé et que le module GA est greffé dessus, exécute ce que devrait faire le hook problématique. Si vous ne savez pas comment créer un hook, voici la marche à suivre :
      • Ouvrez votre base de données et recherchez la table ps_hook (ps est à remplacer par votre préfixe). Cliquez sur SQL et copiez-collez le code suivant :
        INSERT INTO `ps_hook` SET name = 'ConfirmationPage', title = 'Confirmation Page', description = 'Hook qui va accueillir le module GA'
      • Surchargez le FrontController (prestashop/override/controllers/FrontController.php) via la fonction suivante :
        class FrontController extends FrontControllerCore {
        public function preProcess() {
        self::$smarty->assign('HOOK_CONFIRMATION_PAGE',Module::hookExec('ConfirmationPage'));
        parent::preProcess();
        }
        }
      • Dans le fichier ‘ganalytics.php’, ajoutez en dessous de la fonction HookFooter :
        function hookConfirmationPage($params) { return $this->hookOrderConfirmation($params); }
      • Et enfin, dans le fichier ‘order-confirmation.tpl’ (prestashop/themes/votre-theme/order-confirmation.tpl) insérez le code suivant après ‘{$HOOK_PAYMENT_RETURN}’ :
        {$HOOK_CONFIRMATION_PAGE}
  • Vu que le hook de base ne s’exécute pas, plusieurs fonctions (présentes dans le controller ‘OrderConfirmationController’ et la class ‘Hook’) liées à celui-ci ne sont pas appelées. Ce qui entraîne une perte de données dans le tableau $params qui est censé recevoir toutes les données d’une commande.
    • Solution : Plutôt que d’aller surcharger le controller et la class mentionnés ci-dessus, nous avons pris le parti de récupérer l’ID de la commande et d’utiliser une fonction de Prestashop qui permet de récupérer les différentes informations d’une commande en fonction de son ID. En remplaçant
      $order = $params['objOrder'];

      en début de fonction hookOrderConfirmation dans ‘ganalytics.php’ par

      $id_order = $_GET['id_order'];
      $order = new Order((int)$id_order);

Troisième problème auquel nous avons été confronté :

  • Si le nom de la boutique contient des caractères spéciaux (comme une apostrophe ou un ® par exemple) cela fera planter le Javascript.
    • Solution : Pour éviter cela, dans ‘ganalytics.php’ aux environs des lignes 200, remplacez la ligne
      'store' => htmlentities(Configuration::get('PS_SHOP_NAME')),

      par

      'store' => preg_replace('/[\'\x00-\x1F\x80-\xFF]/',' ', Configuration::get('PS_SHOP_NAME')),

      C’est radical, car ça remplace les caractères problématiques par un espace, mais cela fonctionne bien.

En résumé, nous avons donc :

  • Créé un hook pour remplacer celui de base qui est défectueux et greffé le module GA dessus.
  • Remplacé la fonction de base qui est censée rapatrier les données d’une commande, par une plus simple.
  • Supprimé les caractères spéciaux du nom de notre boutique envoyé à GA.

Un petit plus

Le tunnel d’objectif est habituellement composé des étapes :

  • Résumé du panier
  • Authentification
  • Adresses
  • Livraison
  • Paiement
  • La page ‘objectif’ (la page confirmation)

Mais si comme nous, vous voulez également intégrer les pages produits, le module suggère d’utiliser le lien ‘product.php’. Mais pour nous, il ne fonctionnait pas. Nous avons donc créé un alias ‘/produit.html’ (comme Google le fait pour les différentes pages du tunnel d’achat ‘/order/stepX.html’).

Voici la marche à suivre :

  • Dans le fichier ‘ganalytics.php’, remplacez la ligne :
    $pageTrack = ((strpos($_SERVER['REQUEST_URI'], __PS_BASE_URI__.'order.php') === 0 || strpos($_SERVER['REQUEST_URI'], __PS_BASE_URI__.($multilang?((string)Tools::getValue('isolang').'/'):'').$defaultMetaOrder['url_rewrite']) === 0) ? '/order/step'.(int)(Tools::getValue('step')).'.html' : '');
  • Par :
    if (strpos($_SERVER['REQUEST_URI'], __PS_BASE_URI__.'order.php') === 0 || strpos($_SERVER['REQUEST_URI'], __PS_BASE_URI__.($multilang?((string)Tools::getValue('isolang').'/'):'').$defaultMetaOrder['url_rewrite']) === 0){
    $pageTrack = '/order/step'.(int)(Tools::getValue('step')).'.html';
    } else if ($_GET['id_product'] != '') {
    $pageTrack = '/produit.html';
    } else {
    $pageTrack = '';
    };

Nous espérons que cet article vous aura aidé et n’hésitez pas à nous contacter en cas de questions et/ou remarques concernant nos solutions.

Voilà un Prestashop correctement connecté aux objectifs e-commerce de Google Analytics

This entry was posted in Prestashop and tagged , , , , . Bookmark the permalink.

54 Responses to Régler le problème de tracking des objectifs Google Analytics via le module Prestashop

  1. dominique says:

    Merci pour cet article, mais je ne trouve pas la ligne
    $order = new Order((int)$id_order);
    dans ganalytics.php
    version ganalytics : 1.4.1
    version PS : 1.4.8.2

    Merci d’avance

    • wepika says:

      Bonjour Dominique,

      Nous allons corriger l’article car en fait, plutôt que de copier
      ‘ $id_order = $_GET['id_order']; ‘
      avant :
      ‘ $order = new Order((int)$id_order); ‘,

      il faut remplacer ‘$order = $params['objOrder'];’ par
      ‘ $id_order = $_GET['id_order'];
      $order = new Order((int)$id_order); ‘

      En espérant avoir pu vous éclairer.

  2. doud says:

    Bonjour ,

    je suis sur une version 1.4.7.0 et j’ai utilisé le tuto mais je n’arrive tjs pas a passé dans le hookConfirmation. quand je vais dans le fichier OrderConfirmation.php dans la fonction PreProcess le : $this->id_cart = (int)(Tools::getValue(‘id_cart’, 0)); me renvoie un 0 donc je n’ai aucune trace du panier et il va sur history.php et non sur le confirmation.php. Auriez vous une idée Merci

    • wepika says:

      Bonjour,

      On ne change ni Process() ni preProcess() de /controllers/OrderConfirmationController.php

      Il faut bien remplacer

      $order = $params['objOrder'];

      (en début de fonction hookOrderConfirmation dans ‘ganalytics.php’)
      par

      $id_order = $_GET['id_order'];
      $order = new Order((int)$id_order);

      N’auriez-vous pas laissé $order = $params['objOrder']; après ?

  3. Jack says:

    Bonjour
    Merci pour ce Tuto, est ce normal que sur presta 1.4.8.2 je n’ai pas le fichier
    prestashop/override/controllers/FrontController.php, il y a bien un _FrontController.php caché dans la racine mais rien a part index.php dans prestashop/override/controllers/
    Merci
    Jacques

    • wepika says:

      Bonjour,
      Si vous n’avez pas encore modifier le fichier ‘FrontController.php’ alors celui que vous devez utiliser est le ‘_FrontController.php’ (qui doit normalement se trouver dans ‘prestashop/override/controllers/’). Une fois ce dernier modifié, vous devrez le renommer en enlevant le ‘_’ pour qu’il soit pris en compte par l’override.

  4. Quentin says:

    Bonjour,

    Merci beaucoup pour cet Article. J’ai deux questions?

    Concernant la modification de la page confirmation, le code de track page est effectué deux fois. Un fois dans le header (sans le code _addTrans) et une fois au niveau de hook.

    Ensuite concernant le tunnel d’objectif, la modification se fait uniquement dans ganalitycs.php ? je ne comprends pas bien l’alias.

    Merci

    Quentin

    • Quentin says:

      Pour ceux que cela interesse, led fichiers modifiés sont disponible ici (en plus il ya le support de WEBGAINs):

      ganalitycs.php : http://pastebin.com/DhSFAyVy
      header.tpl : http://pastebin.com/ug7TSeGc

    • wepika says:

      Bonjour Quentin,

      Concernant votre première question, le fait d’ajouter ‘addTrans’ permet d’envoyer certaines informations sur la commande effectuée.

      Ensuite, il faut évidemment utiliser l’alias créé, sur Google Analytics lors de la mise en place de vos étapes.

      J’espère que mes réponses vous aideront.

      • Frederic says:

        Bonjour, Merci pour ce tuto. Donc il suffit de remplacer le heaer.tpl et le ganalitycs.php que vous fournissez pour que cela fonctionne ? Ou faut t’il d’abord suivre le début du tuto et faire les modif dans la db etc. ??

        Merci d’avance

        • wepika says:

          Bonjour Frederic,

          Nous vous conseillons de plutôt suivre le tuto et d’essayer d’adapter votre code. Si vous n’y arrivez pas alors essayez avec nos fichiers.

          Bien à vous

  5. Quentin says:

    Merci,

    Nous avons mis en place le changements. Par contre il semblerait qu’ils n’apparaissent pas apres un paiement par carte.

    auriez vous une idée?

    quentin

    • wepika says:

      Quand vous dites paiement par carte, est-ce carte bleue ? Ou bien quelle solution de paiement utilisez-vous ?

  6. Quentin says:

    on utilise paybox.

    le code s execute bien dans le header, mais pas dans le hook {$HOOK_CONFIRMATION_PAGE}

    Merci

    • wepika says:

      Malheureusement, nous n’avons pas vraiment d’expérience sur Paybox mais en tout cas cela fonctionne sans problème avec PayPal et les virements bancaires. Avez-vous une autre solution de paiement pour laquelle cela fonctionne ?

      Mais par exemple, nous avons encore un petit soucis lors de la toute dernière étape avec HiPay. Nous supposons que durant un instant le client quitte le site de vente et se retrouve sur le site de la solution de paiement, ce qui pourrait faire que Google Analytics ne s’y retrouve pas ou bien qu’il perde les informations mais comme je l’ai dit, c’est juste une supposition. Nous devons encore travailler sur ce point.

      Peut-on déjà voir votre site ou pas encore ?

  7. Quentin says:

    Effectivement sur paybox il quitte le site quelques minutes pour le paiement.

    vous pouvez me joindre par email concernant notre site.

    Merci

  8. Ben says:

    Bonjour,

    J’ai bien suivi votre tutoriel mais j’ai l’erreur suivante :
    [PHP Notice #8] Undefined index: id_order (/home/web/maboutique.fr/www/www/modules/ganalytics/ganalytics.php, line 198)

    Cette erreur s’est produite lorsque j’ai affecté le module Google Analytics au Hook “Confirmation Page”. Savez-vous ce que j’ai fait d’incorrect?
    Dois je supprimer le Hook “Header of pages” auquel le module est encore rattaché?

    version ganalytics : 1.4.1
    version PS : 1.4.8.2

    Merci d’avance.

    • wepika says:

      Bonjour Ben,
      Avez-vous bien remplacé ‘$order = $params['objOrder'];’ par ‘$id_order = $_GET['id_order'];
      $order = new Order((int)$id_order);’ dans le fichier ‘ganalytics.php’ ?

      Si oui, alors faites d’abord un var_dump de ‘$params['objOrder']‘ et ensuite de ‘$_GET['id_order']‘ pour voir si l’un d’eux renvoie quelque chose.

      • Ben says:

        Merci pour votre réponse.

        Voici le début de ma fonction hookOrderConfirmation dans le fichier ganalytics.php

        function hookOrderConfirmation($params)
        {
        // Setting parameters
        $parameters = Configuration::getMultiple(array(‘PS_LANG_DEFAULT’));

        //$order = $params['objOrder'];
        $id_order = $_GET['id_order'];
        $order = new Order((int)$id_order);

        etc

        }

        J’ai ensuite tenté un var_dump($params['objOrder']) et un var_dump($_GET['id_order']) mais les deux sont vides.
        En faisant un var_dump($params) je trouve aucune trace de ces valeurs…

        • wepika says:

          C’est bien parce que nous ne trouvions pas ce que nous voulions dans ‘$params’ que nous avons modifié cette partie là de la fonction.
          Maintenant, ce qui est bizarre c’est que l’id de votre commande n’est pas retourné.
          Et qu’est ce qui est retourné si vous faites un var_dump($_GET) ?
          Quelle solution de paiement utilisez-vous ?

  9. Ben says:

    J’ai oublié de vous préciser que je tombe sur cette erreur dès que j’arrive sur ma boutique…donc cela me paraitrait normal que $_GET['id_order'] ne soit pas défini. Le plus étonnant est pourquoi justement le module est appelé aussi tôt non?

    Le var_dump($_GET) me renvoie la chose suivante :

    array
    ‘id_lang’ => int 2

    Concernant le module de paiement, j’utilise la version payante d’Atos délivrée par Prestashop.

    Pensez-vous qu’il puisse y avoir un rapport?

    • wepika says:

      Ah là c’est autre chose alors.
      Vérifiez que le module n’est accroché que sur les hook ‘Header’ et ‘Confirmation Page’ (hook créé) mais aussi que la fonction ‘hookHeader’ du fichier ‘ganalytics.php’ n’appelle pas la fonction ‘hookOrderConfirmation’ ou qu’elle n’ai pas le même comportement.

    • Ben says:

      Cela ne provient pas à mon sens du module de paiement car en le désactivant et en laissant uniquement le mode de paiement par chèque j’ai toujours le même message d’erreur.

  10. Ben says:

    J’ai trouvé ! Le problème provenait de mon fichier FrontController.php qui était déjà surchargé et qui contenait des informations générant cette erreur.

    Je ne suis pas allé plus loin dans l’analyse mais je n’ai plus l’erreur donc votre modification est désormais en place. J’espère maintenant que cela sera effectif !

    Merci en tout cas beaucoup pour votre coup de main et votre disponibilité.

  11. nicos says:

    J’ai suivi votre méthode… merci pour ces précisions sur le tracking des ventes.
    Par contre j’ai n soucis sur une verion 1.4.8.2…
    Les transactions ne s’enregistrent pas après un paiement par CB (via module Atos par Troglo Geek). Pourtant je force bien le retour à la boutique après la validation du paiement…
    Les données sont enregistrées pour les commandes payées par chèque et virement…
    Une piste pour regler ce probléme ?

    • wepika says:

      Bonjour Nicos,
      Pour le moment, nous n’avons pas (encore) de solution concernant ce problème que nous connaissons également mais avec une autre solution de paiement, HiPay.
      Nous supposons qu’il y a une perte d’informations durant le changement de domaine.
      Dès que nous aurons une solution à ce problème, nous la communiquerons.

      • nicos says:

        Je me suis ré-attelé au problème… malheureusement je n’y arrive toujours pas… vous avez avancé de votre côté ?

        • wepika says:

          Nous n’avons malheureusement pas encore trouvé de solution. Mais nous nous sommes renseigné et il s’avère que même des agences spécialisées dans ce domaine rencontre ce problème et elles utilisent les mêmes ‘solutions’ que nous :
          - Soit mettre l’objectif sur la page du choix de paiement mais là il faudra surement supprimer quelques objectifs réalisés car certaines personnes abandonnent le tunnel d’achat à cette étape.
          - Soit laisser l’objectif sur la page de confirmation de commande mais dans ce cas, il manquera certains objectifs (dû aux solutions de paiement qui ne renvoient pas ou trop tard sur la page de confirmation).

          • wepika says:

            De notre coté, nous allons contacter la solution de paiement avec laquelle nous avons ce soucis (HiPay) pour voir ce qu’ils nous conseillent .

  12. John says:

    Bonjour,

    Je présume qu’il n’y a pas de solutions non plus pour les paiements paypal qui ne se terminent pas par la page order-confirmation.php… N’y a-t-il pas moyen de forcer paypal à rediriger automatiquement sur order-confirmation.php sans avoir à cliquer sur “retour boutique”?

  13. Lexa says:

    Pour information il existe un module qui contourne ce problème et qui fonctionne de manière fiable avec même l’annulation de commande sur add-ons. Il y a une version avec rapport dans le BO et sans. Ils sont et .

  14. Destockchine says:

    With regard to successfulness some of our classmates and friends already know you and me; of difficulty we understand some of our classmates and friends. Destockchine http://www.ruenike.com/chaussure-homme-c-1.html/

  15. Destockchine says:

    The place there could be wedding and it doesn’t involve romance, you might have romance and it doesn’t involve wedding. [url=http://www.ruenike.com/foot-c-10.html/]Destockchine[/url] Destockchine

  16. louis vuitton hlouis vuitton handbags replicabags replica the piping emphasizes the soft rounded shape. The nappa leather is sooo soft louis vuitton hlouis vuitton

  17. R4i Gold says:

    this is great blog, I will certainly be back.

  18. r4 3ds says:

    Its such as you read my thoughts! You appear to understand so much about this, like you wrote the guide in it or something. I think that you just can do with a few p.c. to drive the message home a little bit, but other than that, that is excellent blog. A great read. I

  19. r4i says:

    I would like this!!!

  20. r4itt says:

    Internet is written with the capital letter in a sentence, by the way. And hundredths are written not with a point but with a comma. This is according to the standard. And actually everything is very good..!

  21. I’ll apply this idea…… It can be fun!

  22. Hey administratorWhy is there a lot of comments that look a lot like spam?

  23. I am so grateful for your article. Much obliged.

  24. Current blog, fresh information, I read it from time to time!!…

  25. I appreciate you sharing this article post.Really looking forward to read more. Awesome.

  26. This is a really good read for me, thank you!

  27. It`s really useful! Looking through the Internet you can mostly observe watered down information, something like bla bla bla, but not here to my deep surprise. It makes me happy..!

  28. Usually I do not learn article on blogs, but I would like to say that this write-up very forced me to take a look at and do so! Your writing style has been surprised me. Thank you, quite nice post.

  29. The stars of the pool could be the comments and also pictures really are secondary. Don¡ät include photos using only congrats not to mention praise.

  30. Thanks designed for sharing such a fastidious thinking, article is fastidious, thats why i have read it entirely

  31. Awesome blog. I enjoyed reading your articles. This is truly a great read for me. I have bookmarked it and I am looking forward to reading new articles. Keep up the good work.

  32. I loved your post.Thanks Again. Really Great.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>