
2020年4月13日
快速指南:带有示例的dataLayer.push
更新时间:2020年4月13日。
该快速指南是在Google跟踪代码管理器初学者/中级用户提出多个问题后诞生的: 什么时候应该使用dataLayer.push(),什么时候应该使用数据层声明(dataLayer = [{}])?
根本引起这个问题的原因是Google跟踪代码管理器’的官方文档在某些方面有些误导。继续阅读,我’ll show you where.
dataLayer.push?
那么,dataLayer.push首先是什么?它’s一种使人能够添加/更新存储在数据层中的数据的代码,例如:
<script> window.dataLayer = 窗口.dataLayer || []; window.dataLayer.push({ 'event': 'new_subscriber', 'formLocation': 'footer' }); </script>
但是这是什么意思?好吧,让’可以快速了解什么是数据层。附言如果(在阅读此博客文章之后)该主题仍然令人困惑,请考虑注册我的 面向初学者的Google跟踪代码管理器课程 在这里我更详细地解释了什么dataLayer.push。
什么是数据层?
数据层是Google跟踪代码管理器的主要概念之一,可确保最大的灵活性,可移植性和易于实施性。没有它,GTM将无法正常工作。这是使标签管理正常运行的原因。这是释放Google跟踪代码管理器潜力的关键。
I’我的另一本指南中已经介绍了数据层 完整的数据层指南,但为节省您的时间,请在这里’s the TL;DR version.
简而言之,数据层就像存储某些信息的存储桶。它是网站的中心位置(虚拟层),您,开发人员或第三方工具可以在其中临时存储数据(关于用户,页面内容等)。 Google跟踪代码管理器从那里读取该信息,在标记/触发器/变量中使用该信息,或进一步发送给其他工具(您命名为Google Analytics(分析),Google Adwords,Facebook)。
将Google跟踪代码管理器容器的JavaScript代码段放入您的 网站的源代码,即会自动创建数据层。 您无需添加任何其他内容。 但是,如果您需要更多自定义数据,例如 用户身份, 产品价格,订单总额等等(并在Google跟踪代码管理器中使用),则需要其他配置。然后’在dataLayer.push扮演角色的位置。
在数据层中存储/更新数据
有两种方法可以将数据推送到数据层。实际上,只有一个 你应该使用,但出于知识的考虑,我将同时提及:
- 通过添加数据层代码段 以上 Google跟踪代码管理器容器代码段( dataLayer = [] )。 GTM官方文档中也提到了这种方法。
- 或通过推送数据 dataLayer.push method.
你问有什么区别?
数据层声明(不建议)
这种将数据插入数据层的方法 如果您想在页面加载时立即添加任何数据,可以使用,例如, 用户身份。因此,您可以利用 用户身份 可变的 所有页面 触发。
在这种情况下,您的开发人员应添加一个数据层代码段 以上 (这很重要!)具有实际用户ID的GTM跟踪容器。将此信息添加到数据层后,您就可以在Google跟踪代码管理器中开始使用它了。这里’s a code example:
<script> dataLayer = [{ 'userID': '123456' }]; </script> <!-- Google Tag Manager --> // this 是 where your Google Tag Manager container snippet 应该 be placed <!-- End Google Tag Manager -->
尽管官方的Google跟踪代码管理器文档中提到了此方法, 你不应该使用它。为什么?
如果开发人员放置此代码段 下面 Google跟踪代码管理器容器,它将破坏一切。后果之一是 损坏的所有页面触发器。此外,Google跟踪代码管理器将无法跟踪各种网站互动,例如点击,表单提交等。
甚至谷歌’的文档在这里不一致。例如,在 标准电子商务(适用于GTM)文档 他们提供了另一种方法来放置数据’s dataLayer.push (将在下一段中说明)。
Simo Ahava也建议 使用 仅dataLayer.push, 永不 dataLayer = []。
为什么?因为通过使用语法 dataLayer = [],您将dataLayer变量重置为新的Array(读取:清除了存储桶),从而覆盖了之前的所有内容(例如,跟踪工作所需的Google Tag Manager的自定义设置)。由于您覆盖了 dataLayer,则无法再与Google跟踪代码管理器一起正常使用,并且典型的症状是GTM的触发器也不再起作用。
dataLayer.push(推荐)
如何将数据放入数据层的第二种方法 是 dataLayer.push, 绝对推荐,应该是您的唯一选择。无论您将其放置在什么位置(Google跟踪代码管理器容器的下方或上方), dataLayer.push 将正常工作。这里有一些例子:
- 您有新闻稿注册表单(无法使用默认的GTM表单侦听器轻松跟踪),因此您决定在新订阅者成功在您的网站上输入其电子邮件后,要求网站开发人员触发数据层事件:
<script> window.dataLayer = 窗口.dataLayer || []; 窗口.dataLayer.push({'event': 'new_subscriber'}); </script>
如果您愿意,可以向开发人员询问其他信息(例如 表格位置 (因为您可能在同一页面上使用多个表单)。
<script> window.dataLayer = 窗口.dataLayer || []; window.dataLayer.push({ 'formLocation': 'footer', 'event': 'new_subscriber' }); </script>
- 访客将产品添加到他/她的购物车时,数据层事件(包含产品’的信息)可能会被解雇。
还有一件事。如果您将此博客文章中的代码段与开发人员的官方Google跟踪代码管理器文档中说明的代码段进行比较,则可以’我会注意到我的代码示例也有“window” prefix (instead of dataLayer.push, 我用 窗口.dataLayer.push)。在使用Google跟踪代码管理器一段时间后,看到其他专业人员在讲话,我’ve注意到,他们建议再做一件事(作为经验法则):添加前缀 窗口 到 dataLayer.push。 结果,最终的dataLayer.push代码片段可能如下所示:
<script> window.dataLayer.push({ 'formLocation': 'footer', 'event': 'new_subscriber' }); </script>
顺便说一句 dataLayer 名称区分大小写。这意味着只有字母L必须为大写:
- DataLayer.push将不起作用(因为D是大写)
- 数据层也将不起作用(尽管L应该是大写的,所有字母都是小写的)。

更多dataLayer.push示例
前面提到的dataLayer.push示例非常基础,但如果需要,您也可以将数据作为对象或数组推送。一个很好的例子是 标准电子商务 交易代码:
<script> window.dataLayer = 窗口.dataLayer || []; dataLayer.push({ 'transactionProducts': [{ 'sku': 'DD44', 'name': 'T-Shirt', 'category': 'Apparel', 'price': 11.99, 'quantity': 1 },{ 'sku': 'AA1243544', 'name': 'Socks', 'category': 'Apparel', 'price': 9.99, 'quantity': 2 }] }); </script>
这里发生的是一个 dataLayer.push 我们还推了一个数组(交易产品)包含两个对象。每个对象都包含相同的键集(sku,名称,类别,价格,数量),但它们的值不同。然后’这是合乎逻辑的,因为两种不同的产品通常会具有不同的特征。
增强型电子商务数据层推送还使用了更困难的数据结构:
<script> window.dataLayer.push({ 'ecommerce': { 'promoView': { 'promotions': [ { 'id': 'JUNE_PROMO13', // ID or 名称 是 required. 'name': 'June Sale', 'creative': 'banner1', 'position': 'slot1' }, { 'id': 'FREE_SHIP13', 'name': 'Free Shipping Promo', 'creative': 'skyscraper1', 'position': 'slot2' }] } } }); </script>
有了这个 dataLayer.push,我们添加了一个 电子商务 包含的对象 促销 包含的对象 促销活动 数组,其中包含页面上显示的两个促销的两个对象。每个促销都有4个键, ID,名称,广告素材,位置。
好,现在呢?
将数据/事件推送到数据层后,’是时候开始与他们合作了:
- 您要使用数据层事件作为触发器吗?用 自定义事件触发器.
- 您是否想访问一些数据(例如 用户身份)并将其插入Universal Analytics代码中?创建一个 数据层变量 对于要从数据层访问的每个数据点。
dataLayer.push:最后的话
DataLayer.push 是您/开发人员/第三方插件将一些有用的数据传递到数据层的一种方式。从那里你可以“play with it”在Google跟踪代码管理器中,并在您的跟踪代码管理中使用它。
DataLayer.push应该是您添加数据的唯一方法。即使Google跟踪代码管理器的官方文档仍然使用常规数据层声明来提及/推荐(dataLayer = [{}]),您不应该那么做。请记住,请始终推送到dataLayer。
If you're placing the 窗口.dataLayer.push code 以上 the GTM container, then you 应该 add 窗口.dataLayer = 窗口.dataLayer || [].
在其他情况下,它是可选的。实际上,请随时删除window.dataLayer = 窗口.dataLayer ||。 []如果您愿意,可以从其他地方。如果您需要在GTM容器代码段执行此操作之前定义dataLayer,请务必先定义该数据图层, 页面预览 事件。
朱利叶斯,请问一个问题。这够了吗?
dataLayer.push({“ event”:“ newsletter_unsubscribe”})
因为我没有在Google Analytics(分析)中看到此事件> Behaviour >实施后的事件。通话已完成,我可以确认,但该事件不可见。
你好
如果我可以帮助您,我想当您在GTM上推送“ newsletter_unsubscribe”事件时,您是在GTM而非GA上创建事件。这意味着您现在可以在GTM上识别它并将其用作触发器。您可以根据自定义事件“ newsletter_unsubscribe”(不带引号)创建触发器。然后,您可以在GTM上创建Google Analytics(分析)事件代码,并在其中使用上面的触发器。
我希望这是有道理的=)
这也是我的假设。我刚刚在GTM中创建了一个触发器和标签,将它们关联在一起,并希望现在开始在GA中看到该事件。
谢谢布鲁诺!
如果在GTM加载之前将事件推送到dataLayer,则GTM加载后会发生什么事情?假设我为“所有页面”设置了GA,并且为该特定事件设置了另一个GA ...是在事件触发之前所有页面始终“运行”还是因为在GTM加载之前推送事件会立即发生?
标签排序使标签看起来像被“再次”触发或添加到您添加的标签之外。如果我将GA设置为在所有页面上每个事件触发一次,然后在另一个代码上选择GA作为设置代码(之前触发)...好像GA会触发两次,或者如果已经触发一次,对吗?标记排序优先级不是针对标记的吗?
嘿,如果您在GTM代码段之前推送事件+数据,则该事件将在Pageview事件之前发生。
至于第二个问题,代码可能会触发一次,也可能会触发两次。这取决于。
假设有2个标签:
-事件标签
-其他标签。
如果:
-在所有页面上触发“其他标签”
-并且您还将“事件”标签设置为其设置标签
-并且还将事件代码设置为在所有页面上触发,然后事件代码将仅触发一次,因为一切都在“ Pageview”事件的范围内发生。
如果您将事件代码设置为在DOM Ready上触发,那么事件代码将在每页触发两次:
-在所有页面上
-并且在DOM就绪
嗨,朱利叶斯,您能帮我为我的Opencart电子商务商店设置数据层吗?
嗨,我建议您阅读以下指南,以更好地了解如何实施电子商务跟踪:
- Standard Ecommerce tracking //www.toddblog.net/post/ecommerce-tracking-with-google-tag-manager/
- Enhanced Ecommerce tracking //www.simoahava.com/analytics/enhanced-ecommerce-guide-for-google-tag-manager/
朱利叶斯大家好,我是数据层的新手,我喜欢阅读和探索您网站上的更多内容。我真的很想跟踪用户ID以及数据层中的用户位置,以按照您提到的有关userid的示例编写代码:默认情况下,您设置ID为12345,但实际上,我应如何跟踪数组中的用户ID及其位置。
帮助我吗?
Hey, sorry, but I didn't quite get the question. Could you rephrase it? As for the User ID, I have just published another guide that you might find helpful //www.toddblog.net/post/google-analytics-user-id-with-google-tag-manager/
如果您要预加载一些数据,即在某人与我们的网站第一次联系之前先加载一些数据,该怎么办? (第一辑)
最好是已经用预加载的dataLayer加载页面或正常加载页面并执行推送?
这取决于您希望数据的准确性。越早将一些数据点预加载到dataLayer中(甚至在第一个pv上),效果越好。
如果您以后再推送一些数据,则该数据将不会在“页面查看”事件中显示,因此某些标签将无法访问它,例如Google Analytics(分析),您将错过它(当然,这取决于范围)
So you're saying I have to declare this 窗口.dataLayer = 窗口.dataLayer || []; even when I push an event right?
窗口.dataLayer.push({
'event':'Button clicked'
});
只需添加一次此代码就足够了,但是“以防万一”我在每个dataLayer.push之前将其触发。该代码并不繁琐,也不会产生负面影响。
你好朱利叶斯,
感谢您分享所有精彩的帖子。这些对于像我这样的人了解很有帮助。我们正在执行一项任务,以跟踪我们网站上的用户登录和帐户创建;但是,我们通过集中式帐户/子域来处理登录和帐户创建过程。即,如果我尝试从登录页面登录->它进入了子域->认证后,用户返回到登录页面。
寻找您的建议,在多域情况下使用数据层跟踪登录的最佳方法是什么。
谢谢!
在主域及其子域中跟踪访问者不是“多域跟踪”。它仍在同一域中发生。只需将“ cookieDomain:自动”保留在您的GA设置变量中,就可以了。
谢谢朱利叶斯
你好
我们使用Oracle 在 finity作为分析工具。我已将Oracle 在 finity标记添加到GTM,并且数据已正确发送到标准变量工具。
我们需要添加自定义变量。我在GTM中添加了自定义HTML标记,以触发按钮单击,该按钮在用户做出特定选择后被单击。开发人员向站点添加了代码以将数据(用户选择)推送到dataLayer。
当我测试时,GTM具有当前的dataLayer值,但是在标记触发(dcs call)时发送的内容始终是先前的数据(先前的用户选择)。
按钮上的触发标签单击错误的解决方案吗?
这是代码:
// Oracle 在 finity UDO测试
dataLayer.push({'o_filteraction':'AdvancedSearch'});
dataLayer.push({'o_filtertype':checkTypes.join(';')});
dataLayer.push({'o_filterfeature':checkFeatures.join(';')});
dataLayer.push({'o_filtercategory':checkCategory.join(';')});
dataLayer.push({'o_filteraccommodation':checkAccommodation.join(';')});;
dataLayer.push({'o_filterlocation':checkLocation.join(';')});
dataLayer.push({'o_filterdates':checkDates.join(';')});
dataLayer.push({'o_filterprice':checkPrice.join(';')});
嗨,如果您想使用代码中数据层的最新数据,则dataLayer.push代码需要具有“事件”键)。
例如。
dataLayer.push({
'event':'some_event_name',//对于您在评论中列出的所有推送,这可能是相同的
'o_filteraction':'AdvancedSearch'
});
然后创建一个自定义事件触发器,该触发器将在“ some_event_name”上激活。这样,您将在标签中获取最新数据。
阅读更多 about the custom event trigger - //www.toddblog.net/post/google-tag-manager-custom-event-trigger/
抱歉,您的建议完全有效!!!我有语法错误。非常感谢您的帮助!!!
嘿,朱利奥,好吗?我有一些用于标准GA事件的自定义变量。例如:
窗口.dataLayer.push ({
'event':'dataevent',
'mycategory':“组”,
'myaction':“ Clik”,
'mylabel':“按钮x”
});
现在,在一次推送中,我需要一次发送多个事件。
那是我应该做的吗?
窗口.dataLayer.push({
'event':'dataevent',
'mycategory':{[“ Grupo”]},//这是所有字符串唯一的字符串
'myaction':{[“单击一个,单击两个”]},//这些更改
'mylabel':{[“按钮x,按钮y”]} //这些更改
});
感谢您的帮助
您最好发送单独的事件,而不是一次发送所有事件。这意味着也要分离dataLayer.push。类别,操作和标签仅接受字符串,而不接受数组或对象。
我如何配置它也可以在正常模式下运行
它仅使用一个标签还是多个标签发生?分享链接以预览和调试模式,并告诉我如何重现dataLayer.push。
当然
你好朱利叶斯,
我目前正在尝试将数据推送到Squarespace提交HTML中。由于该事件是gtm.submit,并且formID未知(从Google跟踪代码管理器中,可以看到变量标签)。我添加了以下代码来推送formID。因此可以将其添加到Google跟踪代码管理器中以跟踪表单。
<script>
console.log('这很着火');
dataLayer.push({
'event':'formSubmission',
'formType':'contactUs',
'formPosition':'contactPage',
'formID':'contact001'
})
</script>
我不知道为什么它不能将数据推入。我该怎么办?
谢谢你的帮助
您是否在控制台中看到console.log?如果是,那么这里有一些修复:
-dataLayer.push之后缺少分号。
-另外,我在开始处添加了一行额外的行来启动dataLayer(因为此时可能仍不是GTM创建的)。
这是代码:
<script>
console.log('这很着火');
窗口.dataLayer = 窗口.dataLayer || [];
dataLayer.push({
'event':'formSubmission',
'formType':'contactUs',
'formPosition':'contactPage',
'formID':'contact001'
});
</script>
如果您在控制台中看不到console.log,则也许Squarespace不允许自定义js?我不知道它的局限性。
感谢您的答复,我在控制台中看不到console.log。也许我应该删除它?
原因是当我选择单击1个提交按钮时它起作用。但是下拉菜单需要一个formID,但我找不到它。这就是为什么我使用JS脚本进行加载的原因。
据我所知,squarespace允许自定义js。这就是为什么我如此怀疑它为什么不能被解雇的原因。
谢谢你的帮助 :)
如果看不到console.log,则表示未激活整个代码(包括dataLayer.push)。我会联系squarespace suport,也许他们会给您一些提示(因为这看起来像是squarespace特有的东西)。
你好朱利叶斯,
我刚刚重试了代码,它可以工作。
非常感谢你的帮助。
百万感谢,
里昂
再问一个问题。
假设我有一个包含3个选项的下拉菜单。
因为我没有formID,所以我使用代码为表单提供了ID。在开发人员工具上,控制台。我可以看到代码被解雇了。
问题是:
当我在DataLayer中找到下拉菜单列表时,数据为空。
可以说是8次点击:
它显示:[7] [“” gtm.element“”]。value
它没有gtm.element“我需要跟踪的数字”。值。
这是否还需要使用一些代码来注入?
谢谢
对于基于订阅的会员跟踪(例如,我想跟踪每月产生5美元的会员。)触发器仅从客户端触发一次。有没有办法从服务器(从回调到支付网关)触发触发器?
如果要在用户未登录时从后端发送数据,则GTM不会为您提供帮助。开发人员必须通过称为Measurement协议的数据直接将数据发送到GA。
嗨朱利叶斯和其他人。
我工作的网站有一个搜索字段,客户需要搜索查询列表,因为开发人员会执行ajax调用,所以我们无法跟踪搜索。
我尝试了以下-
<script>window.dataLayer = 窗口.dataLayer || [];window.dataLayer.push({'searchQuery': 'value'});</script>
并创建了一个事件,每当单击earch按钮时,都会将searchQuery的值发送到GA,但是由于变量将为null,因此我无法正确跟踪搜索。
现在,如何延迟标签并等待searchQuery变量获取搜索值,然后将其发送给GA?
提前致谢,
汤玛士
您可以使用以下代码:
<script>window.dataLayer = 窗口.dataLayer ||[];
窗口.dataLayer.push({
'searchQuery':'value',
'event':'searchComplete'
});</script>
然后创建一个自定义事件触发器,该触发器将在“ searchComplete”事件上激活,然后才触发代码。
你好朱利叶斯,
是否可以在其他门户网站(website2)中通过website1在数据层变量集中使用信息?
任务:用户在website1中执行操作,结果我们在变量中设置了一个值(“ true”)。我们需要在执行一些代码之前(通过GTM标签)在website2中读取该值。
我们不能为此使用cookie,因为您显然(不允许)访问其他网站中设置的cookie。
非常感谢
您可以尝试通过URL传递变量。当访问者从website1转到website2时,URL应该用变量的值修饰。
嘿朱利叶斯
很棒的文章,但我也有一个问题:
如何将父类推入数据层?
导航课
ul班
李班
一类
在gtm.linkclick事件中,我得到了一个类,但是我也需要nav类,以区分不同的导航。
任何想法?
Hey, use this //www.simoahava.com/analytics/capturing-the-correct-element-in-google-tag-manager/
感谢文章朱利叶斯。
如果我想通过URL传递变量该怎么办。例如,对于特定的URL,我想显示产品列表(与文章相关)。数据将来自数据库,Google表格等。
任何建议将不胜感激。
为此,您可以在GTM中使用URL变量,如果您知道如何编码,则Custom Javascript变量也很有用。
你好朱利叶斯,
需要一点帮助。我创建了一个自定义事件。标签具有一个变量,该变量捕获搜索(部分搜索而不是内部站点搜索)短语。使用DLV类型创建变量以捕获值。
活动也进行得很顺利。在预览模式下,标签下的标签值为未定义。但是,在“数据层”选项卡下,我可以看到该值传递给DLV变量。但是,这些数据并未推送到分析中。这是放置在网站上的代码
窗口.dataLayer = 窗口.dataLayer || [];
窗口.dataLayer.push
({
'event':'想法搜索'
‘dlv_ideas_search_term’:‘值’
})
请协助。
问候,
Swapna
这意味着您的数据层变量不正确。检查语法错误。
Swapna,我遇到了同样的问题。我们必须将触发器更改为“加载窗口”而不是“页面视图”,因为PV触发得太早了,无法实际捕获数据。
一旦我们更改为WL,数据便开始进入Google Analytics(分析)。
祝好运!
这将是dataLayer.push发生得很晚的工作。如果dataLayer.push在GTM容器上方(在代码中),则“所有页面”触发器将正常工作。
关于推送功能,我有一个问题。如果我想在任何gtm.start或加载或错误之前推送自定义事件。我该如何实现?
将您的代码放在GTM容器上方。
非常感谢你的回复
这是没有道理的。
“尽管官方的Google跟踪代码管理器文档中提到了这种方法,但是您不应该使用它。为什么?”
您从未真正解释过此声明,只是对GA网站上的内容不屑一顾。
请解释为什么这不好?特别是因为这(您和GA官方网站上的代码段)将位于页面级
在后面引用的文字中,将逐字地进行解释。
dataLayer.push({“ event”:“ newsletter_unsubscribe”})
我们可以在没有报价的情况下使用上面的一个吗
dataLayer.push({event:newsletter_unsubscribe})
否。除非newsletter_unsubscribe引用该函数中的某个变量。
你好朱利叶斯,
我已经阅读了您的许多教程,但陷入了一种常见情况。我具有要使用dataLayer推送的以下数据结构:
{
事件:“ loginSuccess”,
类别:“登录”,
动作:“ loginSuccess”,
noninteraction:false,//可选
loginType:“ Google”,
用户身份:dataObj.user_id
userEmail:dataObj.user_email。
}
我已经在GTM中创建了变量,并且在创建loginSuccess事件标记以将数据发送到GA时,我无法弄清楚如何发送所有其他变量,因为大多数示例都显示了一个也在“标签”中传递的变量GA在GTM中的映射。
我需要发送所有变量并在GA中进行跟踪,这是一个示例,其中许多事件包含4-5个数据变量。
我很困惑,无法解决这个小问题。
提前致谢。
您需要为每个数据点创建数据层变量。然后由您决定如何发送它们。它可以是事件操作,类别,标签,自定义维度等。
嘿朱利叶斯,
感谢您在这里以及在您的课程(我们已经完成)中提供的大量信息。我们有一个传统的实现,会及时更新,在该实现中,我们会在GTM加载脚本的紧上方设置dataLayer变量。
在调试或检查GTM和dataLayer时,将保留这些值。但是,GTM永远不会看到DOM Ready或Window Loaded事件。
这些事件不会出现在新的调试器/预览中,并且不会触发在这些事件上触发的代码。
在子域的ASP.NET网站上会发生此问题。我们的主域上的相同代码(没有dataLayer init)在所有事件触发时均按预期工作。
你见过这样的东西吗?您将如何找到问题?
预先感谢您的见解!