[英]dataLayer.push not working after GTM script
我想使用 Google 標簽管理器實施增強型電子商務,並且我想為標簽 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 用來定義觸發器並知道數據何時可用的屬性。 您可以有 2 個連續的.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
的觸發器以下是有關這些主題的更多閱讀資料:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.