dataLayer.push не работает после скрипта GTM

Я хочу реализовать расширенную электронную торговлю с помощью Диспетчера тегов Google, и я хочу отправить некоторые данные для тега Universal Analytics.

Я всегда создавал dataLayer перед сценарием GTM, но теперь мне нужно отправить больше данных с помощью dataLayer.push

И это не работает, datalaLayer.push работает только в том случае, если это происходит непосредственно перед запуском сценария GTM.

Пример. Это работает:

   <script>
    <head>
     dataLayer = [{   
                 
            'google_tag_params': {
               'ecomm_pagetype': 'category',
               'ecomm_category': '{{ $resource->seo->h1 }}',
             }
         }];
    
    dataLayer.push({
              'ecommerce': {
                'currencyCode': 'EUR',    
                'impressions': [
                     {
                        'id':       '12312',
                        'price':    24,
                        'category': 'wfwefwerwerwer',
                        'position': 2,
                        'name':     'wfwefwerwerwer',  
                        'brand':   'My Brand',
                        'list':    'Product List',
    
                    }
                ]
              }
            });
    
    (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-XXXXXX');
    
    </script>
    </head>

Но если я использую dataLayer.push после того, как сценарий GTM не работает, данные не отправляются и не сообщается об ошибках.

У меня это не работает:

<head>
    <script>
         dataLayer = [{   
                     
                'google_tag_params': {
                   'ecomm_pagetype': 'category',
                   'ecomm_category': '{{ $resource->seo->h1 }}',
                 }
             }];
        
        
        (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
        new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
        j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
        'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
        })(window,document,'script','dataLayer','GTM-XXXXXX');

    </script>
</head>

<body>

    //something content html here

    <footer></footer>

    <script>
        dataLayer.push({
          'ecommerce': {
            'currencyCode': 'EUR',    
            'impressions': [
                 {
                    'id':       '12312',
                    'price':    24,
                    'category': 'wfwefwerwerwer',
                    'position': 2,
                    'name':     'wfwefwerwerwer',  
                    'brand':   'My Brand',
                    'list':    'Product List',

                }
            ]
          }
        });
    </script>
</body>

person Antonio Morales    schedule 01.08.2018    source источник
comment
Что вы видите в режиме отладки GTM, когда открываете эту страницу? С push-вызовом все в порядке, хотя в нем отсутствует событие, которое может быть обработано GTM. У вас не будет этих данных во время события просмотра страницы, но вы увидите указанное вами событие, и вы можете создать для него триггеры.   -  person kgrg    schedule 01.08.2018
comment
@kgrg, я думаю, тебе стоит дать ответ. То, что данные недоступны из-за отсутствующего события, будет выглядеть так, как будто это не работает, поэтому это кажется наиболее вероятной причиной.   -  person Eike Pierstorff    schedule 01.08.2018
comment
Кстати, для новичков в Analytics в документации очень плохо объясняется, что window.dataLayer.push на самом деле ПАТЧИРОВАННЫЙ GTM для запуска собственного кода. Это уже не просто тупой массив, сидящий на странице. Вот как вы можете добавить к нему позже. Введите window.dataLayer.push в консоли браузера, и вы увидите, что это настраиваемая функция в gtm.js.   -  person Simon_Weaver    schedule 06.09.2019
comment
Совет: отключите кеширование в Chrome при частом обновлении тегов GTM, чтобы убедиться, что вы используете последнюю версию technipages.com/google-chrome-how-to-completely-disable-cache - Иногда у вас может быть все идеально настроено, но ваш браузер просто использует старую версию   -  person Simon_Weaver    schedule 06.09.2019
comment
Вам не хватает var части объявления уровня данных. Вы можете использовать var или просто добавить его в пространство имен окна window.dataLayer   -  person dockeryZ    schedule 17.03.2021


Ответы (1)


Вы не следуете рекомендациям и рано или поздно столкнетесь с проблемами.

  • Всегда используйте .push вместо инициализации: ваш первый вызов - это инициализация массива (dataLayer = [). Это означает, что, если dataLayer уже существует, он будет полностью перезаписан, включая метод .push, который настроен GTM для получения отправленных событий. Сейчас он работает нормально, потому что вы вызываете GTM после инициализации. Но это плохая привычка. Однажды вы переместите GTM выше этой инициализации или добавите аналогичные вызовы инициализации после GTM, и он сломается.

Ваши звонки должны быть:

window.dataLayer = window.dataLayer || [];  
dataLayer.push({...});
  • Всегда устанавливайте свойство event: свойство event используется GTM для определения триггеров и определения того, когда данные становятся доступными. У вас может быть 2 последовательных .push вызова, 1-й с event, а 2-й без, и данные с 1-го будут доступны во 2-м событии (пока это событие не перезапишет их), но опять же, это плохо. привычка и игра с огнем.

Например:

dataLayer.push({
  'event': 'ecommerce', // naming is up to you, should match your GTM triggers 
  'ecommerce': {
  ...

В вашем конкретном случае, поскольку ключ event отсутствует, он работает, пока GTM загружается после нажатия, потому что данные уже есть, когда GTM срабатывает. Когда вызов push перемещается после GTM, поскольку нет свойства event, GTM просто не может узнать, когда данные станут доступны. Итак, вам следует:

  • Добавьте ключ event (всегда!)
  • Настройте триггер, соответствующий event

Вот еще несколько материалов по этим темам:

person Max    schedule 01.08.2018
comment
Мой первый вызов должен быть dataLayer = window.dataLayer || []; и dataLayer.push ({...}) ;, но где разместить скрипт GTM? до или после? Спасибо - person Antonio Morales; 02.08.2018
comment
GTM должен загружаться как можно скорее, чтобы минимизировать задержку (браузеру необходимо получить GTM = 1 сетевой цикл туда и обратно, затем получить другие библиотеки = 2-й рейс, а затем в конечном итоге запустить аналитические события). Так что размещайте GTM как можно раньше после <head>. Что касается вызовов .push, не имеет значения, где вы их размещаете, если вы всегда используете .push и инициализируете первый раз (window.dataLayer || []). Если GTM уже установлен, вы получите созданный им слой данных (window.dataLayer), в противном случае вы создадите фиктивный массив (`|| []`), который позже GTM преобразует в соответствующий уровень данных, сохраняя свои данные. - person Max; 02.08.2018