Google Tag Manager (GTM) est un outil très puissant pour gérer les tags sur sa boutique (comme Universal Analytics / Enhanced Ecommerce, Criteo, Facebook tag etc…). Pour plus d’infos sur cet outil, je vous invite à visiter le site officiel de Google Tag Manager : www.google.fr/tagmanager/

Un article très intéressant a été publié sur la paramétrage de Google Tag Manager et PrestaShop, je vous invite à la lire : //www.chablais-web.fr/google-tag-manager-ecommerce-prestashop.php

Pour l’intégrer sur votre boutique Prestashop (ou autre solution ecommerce), il faut placer le script GTM sous la balise et le dataLayer (pour passer des infos à GTM) avant ce script.

Le problème avec Prestashop, c’est l’option “Déplacer le code JavaScript à la fin” qui va déplacer le script GTM et le dataLayer en bas de page.

Pour garder les avantages de cette option (déplacer le code js en bas de page) et faire fonctionner Google Tag Manager avec Prestashop, voici un override de la classe Media qui permettra de gérer des exceptions et de ne pas déplacer certains scripts en bas de page :

<?php
Class Media extends MediaCore
{

    public static function deferScript($matches)
    {
        if (!is_array($matches))
            return false;
        $inline = '';

        if (isset($matches[0]))
            $original = trim($matches[0]);

        if (isset($matches[1]))
            $inline = trim($matches[1]);
        // prestarocket
        /* This is an inline script, add its content to inline scripts stack then remove it from content */
        if (!empty($inline) && preg_match('/<\s*script(?!.*data-keepinline)[^>]*>/ims', $original) !== 0 && Media::$inline_script[] = $inline)
            return '';
        //end prestarocket
        /* This is an external script, if it already belongs to js_files then remove it from content */
        preg_match('/src\s*=\s*["\']?([^"\']*)[^>]/ims', $original, $results);
        if (array_key_exists(1, $results))
        {
            if (substr($results[1], 0, 2) == '//')
            {
                $protocol_link = Tools::getCurrentUrlProtocolPrefix();
                $results[1] = $protocol_link.ltrim($results[1], '/');
            }
            if (in_array($results[1], Context::getContext()->controller->js_files) || in_array($results[1], Media::$inline_script_src))
                return '';
        }

        /* return original string because no match was found */
        return $original;
    }
}

Côté tpl, il faudra ajouter l’attribut data-keepinline=”true” dans la balise script que vous ne souhaitez pas déplacer en bas de page :

<script data-keepinline="true">
...
<script>

 

Merci à gabeshackle pour la solution