ชั้นข้อมูล

ชั้นข้อมูลคือออบเจ็กต์ที่ Google Tag Manager และ 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 ได้รับการออกแบบมาเพื่ออ้างอิงข้อมูลที่เพิ่มลงในเลเยอร์ข้อมูลได้อย่างง่ายดายในลักษณะที่เป็นระเบียบและคาดการณ์ได้ แทนที่จะแยกวิเคราะห์ตัวแปร ข้อมูลธุรกรรม หมวดหมู่หน้าเว็บ และสัญญาณอื่นๆ ที่กระจัดกระจายอยู่ในหน้าเว็บ การใช้ชั้นข้อมูลที่มีตัวแปรและค่าที่เกี่ยวข้องจะช่วยให้มั่นใจว่าข้อมูลที่เกี่ยวข้องจะพร้อมใช้งานเมื่อแท็กของคุณจำเป็นต้องใช้

การติดตั้ง

สําหรับการติดตั้ง Tag Manager ในหน้าเว็บ คุณต้องสร้างชั้นข้อมูล โค้ดที่ไฮไลต์ด้านล่างแสดงตำแหน่งที่มีการสร้างชั้นข้อมูลก่อนที่เครื่องจัดการแท็กจะโหลด

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

วิธีการประมวลผลข้อมูลในชั้นข้อมูล

เมื่อโหลดคอนเทนเนอร์แล้ว Tag Manager จะเริ่มประมวลผลข้อความแบบพุชในชั้นข้อมูลทั้งหมดที่อยู่ในคิว Tag Manager ประมวลผลข้อความในลักษณะก่อนได้รับและได้ก่อนใคร นั่นคือจะประมวลผลแต่ละข้อความพร้อมกันตามลำดับที่ได้รับ หากข้อความเป็นเหตุการณ์ แท็กที่มีเงื่อนไขทริกเกอร์ที่เป็นไปตามเงื่อนไขจะเริ่มทำงานก่อนที่ Tag Manager จะไปยังข้อความถัดไป

หากโค้ดเรียกใช้ gtag() หรือ dataLayer.push() ในหน้าเว็บ ในเทมเพลตที่กําหนดเอง หรือในแท็ก HTML ที่กําหนดเอง ระบบจะจัดคิวและประมวลผลข้อความที่เกี่ยวข้องหลังจากประเมินข้อความอื่นๆ ทั้งหมดที่รอดําเนินการแล้ว ซึ่งหมายความว่าไม่มีการรับประกันว่าค่าชั้นข้อมูลที่อัปเดตแล้วจะใช้ได้กับเหตุการณ์ถัดไป ในการจัดการกรณีเหล่านี้ คุณควรเพิ่มชื่อเหตุการณ์ลงในข้อความเมื่อมีการพุชเข้าไปในชั้นข้อมูล แล้วรอรับชื่อเหตุการณ์นั้นด้วยทริกเกอร์เหตุการณ์ที่กำหนดเอง

ใช้ชั้นข้อมูลกับเครื่องจัดการเหตุการณ์

ออบเจ็กต์ dataLayer ใช้คำสั่ง event เพื่อเริ่มการส่งเหตุการณ์

แท็ก Google และ Tag Manager ใช้ตัวแปรชั้นข้อมูลพิเศษที่เรียกว่า event ซึ่งใช้โดยโปรแกรมรับฟังเหตุการณ์ JavaScript เพื่อเริ่มทํางานของแท็กเมื่อผู้ใช้โต้ตอบกับองค์ประกอบของเว็บไซต์ ตัวอย่างเช่น คุณอาจต้องการให้แท็กเครื่องมือวัด Conversion เริ่มทำงานเมื่อผู้ใช้คลิกปุ่มยืนยันการซื้อ ระบบอาจเรียกเหตุการณ์เมื่อใดก็ตามที่ผู้ใช้โต้ตอบกับองค์ประกอบของเว็บไซต์ เช่น ลิงก์ ปุ่ม การเลื่อน เป็นต้น

ฟังก์ชันการทํางานนี้ทําได้โดยเรียกใช้ dataLayer.push() เมื่อเกิดเหตุการณ์ ไวยากรณ์สำหรับส่งเหตุการณ์ด้วย dataLayer.push() มีดังนี้

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

โดยที่ event_name คือสตริงที่อธิบายเหตุการณ์ เช่น 'login', purchase หรือ search

ใช้ dataLayer.push() เพื่อส่งข้อมูลเหตุการณ์เมื่อเกิดการกระทำที่คุณต้องการวัด ตัวอย่างเช่น หากต้องการส่งเหตุการณ์เมื่อผู้ใช้คลิกปุ่ม ให้แก้ไขตัวแฮนเดิล onclick ของปุ่มเพื่อเรียก dataLayer.push() ดังนี้

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

คุณสามารถพุชตัวแปรของชั้นข้อมูลไปยังชั้นข้อมูลแบบไดนามิกเพื่อบันทึกข้อมูล เช่น ค่าที่ป้อนหรือเลือกในแบบฟอร์ม ข้อมูลเมตาที่เชื่อมโยงกับวิดีโอที่ผู้เข้าชมกําลังเล่น สีของผลิตภัณฑ์ (เช่น รถยนต์) ที่ผู้เข้าชมปรับแต่ง URL ปลายทางของลิงก์ที่คลิก ฯลฯ

เช่นเดียวกับเหตุการณ์ ฟังก์ชันนี้ดำเนินการได้ด้วยการเรียกใช้ 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() หลังจากที่สร้างชั้นข้อมูลขึ้นมาใหม่ในการโหลดหน้าเว็บแต่ละครั้ง และพุชตัวแปรไปยังชั้นข้อมูล หากต้องการให้ตัวแปรชั้นข้อมูลเหล่านี้พร้อมใช้งานสําหรับ Tag Manager เมื่อโหลดคอนเทนเนอร์ ให้เพิ่มการเรียกใช้ dataLayer.push() เหนือโค้ดคอนเทนเนอร์ Tag Manager ดังที่แสดงด้านล่าง

<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 การติดตั้ง Tag Manager ควรสร้างอินสแตนซ์ของชั้นข้อมูลในซอร์สโค้ดให้สูงที่สุดเหนือข้อมูลโค้ดคอนเทนเนอร์โดยใช้ window.dataLayer = window.dataLayer || []; หลังจากประกาศ dataLayer แล้ว ให้ใช้ dataLayer.push({'item': 'value'}) เพื่อเพิ่มค่าเพิ่มเติม และหากค่าเหล่านั้นต้องพร้อมใช้งานสําหรับ Tag Manager เมื่อโหลดหน้าเว็บ การเรียกใช้ dataLayer.push() นั้นต้องอยู่เหนือโค้ดคอนเทนเนอร์ Tag Manager ด้วย

ชื่อออบเจ็กต์ dataLayer จะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ หากคุณพยายามพุชตัวแปรหรือเหตุการณ์โดยไม่ใช้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ที่ถูกต้อง การพุชจะไม่ทำงาน

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

ต้องเรียก dataLayer.push ด้วยออบเจ็กต์ JavaScript ที่ถูกต้อง ชื่อตัวแปรของชั้นข้อมูลทั้งหมดควรอยู่ในเครื่องหมายคำพูด

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 หรือ Tag Manager เริ่มต้นคือ dataLayer หากต้องการใช้ชื่ออื่นสําหรับชั้นข้อมูล ให้แก้ไขค่าพารามิเตอร์ชั้นข้อมูลในแท็ก Google หรือข้อมูลโค้ดคอนเทนเนอร์ Tag Manager ด้วยชื่อที่ต้องการ

gtag.js

เพิ่มพารามิเตอร์การค้นหาชื่อ "l" ลงใน URL เพื่อตั้งชื่อชั้นข้อมูลใหม่ เช่น l=myNewName อัปเดตอินสแตนซ์ทั้งหมดของ dataLayer ในข้อมูลโค้ดแท็ก Google เป็นชื่อใหม่

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

Tag Manager

แทนที่ค่าพารามิเตอร์ชั้นข้อมูล (ไฮไลต์ด้านล่าง) ในข้อมูลโค้ดของคอนเทนเนอร์ด้วยชื่อที่ต้องการ

<!-- 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 ในโมเดลข้อมูลนามธรรมช่วยให้คุณตั้งค่าเพื่อดึงข้อมูลผ่าน get ได้

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

รับ

ฟังก์ชัน 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();
})