GTM脚本后dataLayer.push不起作用

15

我想要用谷歌标签管理器实现增强型电子商务,并希望为通用分析标签推送一些数据。

我总是在GTM脚本之前创建数据层,但现在我需要使用 dataLayer.push 发送更多数据。

但它不起作用,只有当 dataLayer.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>

1
当您打开此页面时,在GTM调试模式下,您会看到什么?尽管缺少一个事件可以由GTM处理,但推送调用似乎很好。在Page View事件期间,您将无法获得此数据,但您将看到您指定的事件,并且您可以在其上构建触发器。 - kgrg
@kgrg,我认为你应该把这个作为一个答案。由于缺少事件而导致数据不可用将使其看起来似乎不能正常工作,因此这似乎是最有可能的罪魁祸首。 - Eike Pierstorff
顺便说一句,对于新手来说,文档中对分析功能的解释非常糟糕,window.dataLayer.push实际上被GTM修补过了,以运行自己的代码。它不再只是一个简单的数组存在于页面上。这就是你后来能够添加到它的原因。在浏览器控制台中键入window.dataLayer.push,你会发现它是gtm.js中的自定义函数。 - Simon_Weaver
提示:在频繁更新GTM标签时,在Chrome中禁用缓存,以确保您获取最新版本https://www.technipages.com/google-chrome-how-to-completely-disable-cache-有时您可能已经完美地设置了一切,但您的浏览器仍在使用旧版本。 - Simon_Weaver
你缺少了声明dataLayer的var部分。你可以使用var,或者将其添加到window命名空间中window.dataLayer - dockeryZ
1个回答

27

你没有遵循最佳实践,所以早晚会遇到问题

  • 始终使用.push而不是初始化:你的第一个调用是一个数组的初始化(dataLayer = [])。这意味着如果 dataLayer 已经存在,它将被完全覆盖,包括 .push 方法,这个方法是由 GTM 定制的,用于接收推送事件。现在它可以正常工作,因为你在初始化后调用了 GTM。但这是一个不好的习惯。有一天你会把 GTM 移动到这个初始化之前,或者在 GTM 之后添加类似的初始化调用,那么它将会出错。

正确的调用方式应该是:

window.dataLayer = window.dataLayer || [];  
dataLayer.push({...});
  • 始终设置event属性event属性是GTM用于定义触发器并知道何时数据可用的属性。您可以连续进行2次.push调用,第1次带有event,第2次没有,第1次的数据将在第2次中可用(前提是该push未覆盖它),但再次强调这是不好的习惯和冒险。

例如:

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

针对您的具体情况,由于缺少 event键,在GTM加载后推送数据是有效的,因为当GTM启动时,数据已经存在。 当将push调用移动到GTM之后时,由于没有event属性,GTM无法知道何时数据可用。 所以你应该:

  • 始终添加 event
  • 配置匹配event的触发器

这些主题有更多阅读材料:


1
我的第一个调用应该是 dataLayer = window.dataLayer || []; 和 dataLayer.push({...});,但是,GTM脚本放在哪里?之前还是之后?谢谢。 - RichardMiracles
1
为了最小化延迟,GTM 应尽快加载(浏览器需要获取 GTM = 1 网络往返,然后获取其他库 = 第二次往返,最终触发分析事件)。因此,请尽早在 <head> 后面放置 GTM。至于 .push 调用,只要始终使用 .push 并初始化第一次 (window.dataLayer || []),放置位置并不重要。如果 GTM 已经就位,您将获取它创建的 dataLayer (window.dataLayer),否则您将创建一个虚拟数组 (|| []),GTM 将稍后将其转换为适当的 dataLayer,并保留其数据。 - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接