資料層

資料層是一種 Google 代碼管理工具和 gtag.js 物件,用於將資訊傳送至代碼。事件或變數可透過資料層傳遞,且可根據變數的值設定觸發條件。

舉例來說,如果您在 purchase_total 值大於 $100 美元,或根據特定事件 (例如按下按鈕) 時觸發再行銷代碼,您可以設定資料層,讓代碼能夠使用這些資料。資料層物件是以 JSON 格式建構而成。例如:

{
  event: "checkout_button",
  gtm: {
    uniqueEventId: 2,
    start: 1639524976560,
    scrollThreshold: 90,
    scrollUnits: "percent",
    scrollDirection: "vertical",
    triggers: "1_27"
  },
  value: "120"
}

Google 代碼的設計宗旨是要以有條理且可預測的方式輕鬆參照加進資料層的資訊,而不是透過剖析變數、交易資訊、網頁類別,以及整個網頁中散佈的其他信號。填入變數和關聯值的資料層導入,有助於確保在標記需要相關資料時可取得相關資料。

安裝

如要安裝代碼管理工具網頁,您必須建立資料層。下方醒目顯示的程式碼顯示的是載入代碼管理工具前的資料層建立位置。

<script>
window.dataLayer = window.dataLayer || [];
</script>
<!-- Google Tag Manager -->
<script>(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>
<!-- End Google Tag Manager -->

在標準 gtag.js 導入中,代碼是從產品內部複製並加進網頁,系統會提供用來建立資料層的程式碼。在 Google 代碼的自訂導入中,請在指令碼的開頭加入資料層程式碼,如下方醒目顯示的範例所示:

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=TAG_ID"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments)};
  gtag('js', new Date());

  gtag('config', 'TAG_ID');
</script>

資料層資訊的處理方式

容器載入後,代碼管理工具就會開始處理所有已排入佇列的資料層推送訊息。代碼管理工具會先處理訊息,先進先處理,每個訊息都會按照接收順序一次處理。如果訊息是事件,則在代碼管理工具接著接收下一則訊息前,就觸發了符合觸發條件的所有代碼。

如果網頁、自訂範本或自訂 HTML 標記中的程式碼執行 gtag()dataLayer.push() 呼叫,相關訊息就會排入佇列,並在評估所有其他待處理訊息後進行處理。這表示,不保證在下一個事件中可以使用任何更新過的資料層值。如要處理這類情況,您應在推送至資料層時在訊息中加入事件名稱,然後使用自訂事件觸發條件監聽該事件名稱。

搭配事件處理常式使用資料層

dataLayer 物件會使用 event 指令啟動事件傳送作業。

Google 代碼和代碼管理工具會使用名為 event 的特殊資料層變數,供 JavaScript 事件監聽器在使用者與網站元素互動時觸發代碼。舉例來說,您可能想在使用者點擊購買確認按鈕時觸發轉換追蹤代碼。每當使用者與網站元素 (例如連結、按鈕和捲動等等) 互動時,系統就會呼叫事件。

在事件發生時,透過呼叫 dataLayer.push() 來完成此功能。使用 dataLayer.push() 傳送事件的語法如下:

dataLayer.push({'event': 'event_name'});

其中 event_name 是描述事件的字串,例如 'login'purchasesearch

在要評估動作時,使用 dataLayer.push() 傳送事件資料。舉例來說,如要在使用者點選按鈕時傳送事件,請修改按鈕的 onclick 處理常式以呼叫 dataLayer.push()

<button onclick="dataLayer.push({'event': 'login'});">Button 1</button>

您可以動態將資料層變數推送至資料層來擷取資訊,例如在表單中輸入或選取的值、訪客播放的影片相關中繼資料、訪客自訂的產品 (例如汽車) 顏色、點擊連結的到達網頁網址等。

與事件一樣,可以藉由呼叫 push() API 新增或取代資料層中的資料層變數來完成這項功能。設定動態資料層變數的基本語法如下:

dataLayer.push({'variable_name': 'variable_value'});

其中 'variable_name' 是表示要設定資料層變數名稱的字串,而 'variable_value' 是字串來指出要設定或取代的資料層變數值。

舉例來說,當訪客與產品自訂工具互動時,如要設定帶有顏色偏好設定的資料層變數,您可以推送下列動態資料層變數:

dataLayer.push({'color': 'red'});

一次推送,多個變數

您可以一次推送多個變數和事件:

dataLayer.push({
  'color': 'red',
  'conversionValue': 50,
  'event': 'customize'
});

保留資料層變數

如要在網頁之間保留資料層變數,請在每次載入網頁時呼叫 dataLayer.push(),並將變數推送至資料層。如果您想在載入容器時將這些資料層變數提供給代碼管理工具使用,請在代碼管理工具容器程式碼上方新增 dataLayer.push() 呼叫,如下所示。

<script>
window.dataLayer = window.dataLayer || [];

dataLayer.push({
 'event': 'Pageview',
 'pagePath': 'https://www.googleanalytics.dev/pancakes',
 'pageTitle': 'Pancake Event Signup',
 'visitorType': 'customer'
});
</script>
<!-- Google Tag Manager -->
<script>(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>
<!-- End Google Tag Manager -->

只要訪客仍在目前網頁上,資料層物件內宣告的每個變數都會持續保留。與網頁相關的資料層變數 (例如 visitorType) 必須在網站每個網頁的資料層中宣告。雖然您不需要在每個頁面的資料層中放置同一組變數,但仍應使用一致的命名慣例。換句話說,如果您在註冊頁面使用名為 pageCategory 的變數設定網頁類別,您的產品和購買頁面也應使用 pageCategory 變數。

疑難排解

以下提供幾個資料層疑難排解訣竅:

請勿覆寫 window.dataLayer 變數:直接使用資料層時 (例如 dataLayer = [{'item': 'value'}])),這會覆寫 dataLayer 中的所有現有值。代碼管理工具安裝作業應使用 window.dataLayer = window.dataLayer || [];,盡可能將資料層例項化,在原始碼中盡可能高於容器片段上方的位置。宣告 dataLayer 後,請使用 dataLayer.push({'item': 'value'}) 為其加入其他值,如果這些值在網頁載入時可供代碼管理工具使用,則 dataLayer.push() 呼叫也必須位於代碼管理工具容器程式碼上方。

dataLayer 物件名稱區分大小寫:如果您嘗試推送變數或事件時,沒有使用正確的大小寫,則推送作業將無法運作。

datalayer.push({'pageTitle': 'Home'});    // Bad (datalayer in lowercase)
dataLayer.push({'pageTitle': 'Home'});    // Good (dataLayer in camel case)

必須以有效的 JavaScript 物件呼叫 dataLayer.push。所有資料層變數名稱都應用引號括住。

dataLayer.push({new-variable: 'value'});      // Bad - no quote marks
dataLayer.push({'new-variable': 'value'});    // Good - proper quote marks

保持各網頁的變數名稱一致:如果您在不同網頁上為相同概念使用不同的變數名稱,您的代碼就無法一致地在所需的所有位置觸發。

不佳的做法:

// Homepage:
dataLayer.push({'visitorType': 'low-value'});

// Checkout Page:
dataLayer.push({'visitor_type': 'high-value'});

佳:

// Homepage:
dataLayer.push({'visitorType': 'low-value'});

// Checkout Page:
dataLayer.push({'visitorType': 'high-value'});

重新命名資料層

由 Google 代碼或代碼管理工具啟動的資料層物件預設名稱為 dataLayer。如果您想為資料層使用不同的名稱,可以使用所選名稱編輯 Google 代碼或代碼管理工具容器片段中的資料層參數值。

gtag.js

在網址中加入名為「l」的查詢參數,以設定新的資料層名稱,例如 l=myNewName。將 Google 代碼片段中的所有 dataLayer 例項更新為新名稱。

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=TAG_ID&l=myNewName"></script>
<script>
  window.myNewName = window.myNewName || [];
  function gtag(){myNewName.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'TAG_ID');
</script>

代碼管理工具

將容器程式碼片段中的資料層參數值 (醒目顯示如下) 替換成您選擇的名稱。

<!-- Google Tag Manager -->
<script>(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','myNewName','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->

重新命名後,您必須調整資料層的所有參照 (例如,宣告程式碼片段上方的資料層,或使用 .push() 指令將事件或動態資料層變數推送至資料層時),才能反映您的自訂資料層名稱:

<script>
  myNewName = window.dataLayer || [];
  myNewName.push({'variable_name': 'variable_value'});
</script>

自訂資料層方法

如果您將函式推送至資料層,系統就會使用這個設定為抽象資料模型的該集叫用函式。這個抽象資料模型可以取得值並將其設為鍵/值存放區,同時也能重設資料層。

set

抽象資料模型上的 set 函式可讓您設定要透過 get 擷取的值。

window.dataLayer.push(function() {
  this.set('time', new Date());
});

get

抽象資料模型上的 get 函式可讓您擷取所設定的值。

window.dataLayer.push(function() {
  const existingTime = this.get('time');
  if (existingTime !== null) {
    // Change behavior based on whether or not this value exists...
  } else {
    // ...
  }
})

重設

抽象資料模型上的 reset 函式可讓您重設資料層中的資料。這個方法最為實用,因為頁面會保持開啟,而資料層的大小也會隨時間持續增加。如要重設資料層,請使用下列程式碼:

window.dataLayer.push(function() {
  this.reset();
})