Я хочу реализовать расширенную электронную торговлю с помощью Диспетчера тегов 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>
@kgrg, я думаю, тебе стоит дать ответ. То, что данные недоступны из-за отсутствующего события, будет выглядеть так, как будто это не работает, поэтому это кажется наиболее вероятной причиной.
Кстати, для новичков в Analytics в документации очень плохо объясняется, что window.dataLayer.push на самом деле ПАТЧИРОВАННЫЙ GTM для запуска собственного кода. Это уже не просто тупой массив, сидящий на странице. Вот как вы можете добавить к нему позже. Введите window.dataLayer.push в консоли браузера, и вы увидите, что это настраиваемая функция в gtm.js.
Совет: отключите кеширование в Chrome при частом обновлении тегов GTM, чтобы убедиться, что вы используете последнюю версию technipages.com/google-chrome-how-to-completely-disable-cach e - Иногда у вас может быть все идеально настроено, но ваш браузер просто использует старую версию
Вам не хватает части var при объявлении уровня данных. Вы можете использовать var или просто добавить его в пространство имен окна window.dataLayer



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы не следуете лучшим практикам, поэтому столкнетесь с проблемами, рано или поздно.
.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Вот еще несколько материалов по этим темам:
Мой первый вызов должен быть dataLayer = window.dataLayer || []; и dataLayer.push ({...}) ;, но где разместить скрипт GTM? до или после? Спасибо
GTM должен загружаться как можно скорее, чтобы минимизировать задержку (браузеру необходимо получить GTM = 1 сетевой цикл туда и обратно, затем получить другие библиотеки = 2-й рейс, а затем, в конечном итоге, запустить аналитические события). Так что размещайте GTM как можно раньше после <head>. Что касается вызовов .push, не имеет значения, где вы их размещаете, если вы всегда используете .push и инициализируете первый раз (window.dataLayer || []). Если GTM уже установлен, вы возьмете созданный им слой данных (window.dataLayer), в противном случае вы создадите фиктивный массив (`|| []`), который позже GTM преобразует в соответствующий уровень данных, сохраняя свои данные.
Что вы видите в режиме отладки GTM, когда открываете эту страницу? С push-вызовом все в порядке, хотя в нем отсутствует событие, которое может быть обработано GTM. У вас не будет этих данных во время события просмотра страницы, но вы увидите указанное вами событие, и вы можете создать для него триггеры.