dataLayer.push在GTM脚本之后不起作用



我想用谷歌标签管理器实现增强型电子商务,我想为标签Universal Analytics推送一些数据。

我一直在GTM脚本之前创建dataLayer,但现在我需要用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>

但是,如果我在GTM脚本不起作用后使用dataLayer.push,则不会发送任何数据,也不会报告任何错误。

这对我不起作用:

<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>

您没有遵循最佳实践,因此迟早会遇到问题

  • 始终使用.push而不是初始化:您的第一个调用是数组初始化(dataLayer = [](。这意味着,如果dataLayer已经存在,它将被完全覆盖,包括GTM为接收推送事件而定制的.push方法。现在它工作得很好,因为您在初始化之后调用GTM。但这是个坏习惯。有一天,您将把GTM移到该初始化之上,或者在GTM之后添加类似的初始化调用,它就会中断

您的电话应该是:

window.dataLayer = window.dataLayer || [];  
dataLayer.push({...});
  • 始终设置event属性event属性是GTM用来定义触发器并知道数据何时可用的属性。你可以有两个连续的.push调用,第一个有event,第二个没有,第一个的数据将在第二个可用(只要推送不会覆盖它(,但这又是一个坏习惯和玩火

例如:

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

在您的特定情况下,由于event密钥丢失,只要GTM在推送后加载,它就会工作,因为GTM启动时数据已经在那里了。当push调用在GTM之后移动时,因为没有event属性,GTM就无法知道数据何时可用。所以你应该:

  • 添加event密钥(始终!(
  • 配置与event匹配的触发器

以下是关于这些主题的更多阅读:

  • https://www.simoahava.com/gtm-tips/datalayer-declaration-vs-push/
  • https://www.simoahava.com/gtm-tips/add-the-event-key-to-datalayer-pushes/

最新更新