Warstwa danych to obiekt używany przez Menedżera tagów Google i gtag.js do przekazywania informacji do tagów. Zdarzenia lub zmienne mogą być przekazywane przez warstwę danych, a reguły można konfigurować na podstawie wartości zmiennych.
Jeśli np.tag remarketingu jest uruchamiany, gdy wartość purchase_total
jest większa niż 100 USD, lub na podstawie określonych zdarzeń, np. gdy kliknięty zostanie przycisk, możesz skonfigurować warstwę danych, aby udostępniała te dane tagom. Obiekt warstwy danych jest sformatowany jako JSON. Na przykład:
{
event: "checkout_button",
gtm: {
uniqueEventId: 2,
start: 1639524976560,
scrollThreshold: 90,
scrollUnits: "percent",
scrollDirection: "vertical",
triggers: "1_27"
},
value: "120"
}
Tagi Google zostały zaprojektowane tak, aby w łatwy sposób odwoływać się do informacji dodanych do warstwy danych w uporządkowany i przewidywalny sposób zamiast analizować zmienne, informacje o transakcjach, kategorie stron i inne sygnały rozproszone na stronie. Implementacja warstwy danych wypełniona zmiennymi i powiązanymi wartościami zapewni dostęp do odpowiednich danych, gdy będą potrzebne Twoim tagom.
Instalacja
W przypadku instalacji na stronach internetowych Menedżera tagów musisz utworzyć warstwę danych. Podświetlony kod poniżej pokazuje, gdzie jest tworzona warstwa danych, czyli przed załadowaniem Menedżera tagów.
<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 -->
W standardowych implementacjach tagu gtag.js, w których tag został skopiowany z usługi i dodany do strony internetowej, przesyłany jest kod tworzący warstwę danych. W przypadku niestandardowych implementacji tagu Google dodaj kod warstwy danych na początku skryptu, jak pokazano w wyróżnionym przykładzie poniżej:
<!-- 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>
Sposób przetwarzania informacji z warstwy danych
Po załadowaniu kontenera Menedżer tagów zacznie przetwarzać wszystkie komunikaty push warstwy danych znajdujące się w kolejce. Menedżer tagów przetwarza wiadomości w kolejności ich otrzymania: każda wiadomość jest przetwarzana pojedynczo. Jeśli komunikat jest zdarzeniem, wszystkie tagi z warunkami reguły, które zostaną spełnione, uruchomią się, zanim Menedżer tagów przejdzie do następnej wiadomości.
Jeśli w kodzie strony, szablonie niestandardowym lub niestandardowym tagu HTML występuje wywołanie metody gtag()
lub dataLayer.push()
, powiązana wiadomość trafi do kolejki i zostanie przetworzona dopiero po sprawdzeniu pozostałych oczekujących wiadomości. Oznacza to, że nie możemy zagwarantować, że zaktualizowane wartości warstwy danych będą dostępne na potrzeby następnego zdarzenia.
Aby radzić sobie z takimi sytuacjami, możesz dodać nazwę zdarzenia do wiadomości przekazywanej do warstwy danych, a potem wykrywać nazwę tego zdarzenia za pomocą reguły zdarzenia niestandardowego.
Używanie warstwy danych z obsługami zdarzeń
Obiekt dataLayer
używa polecenia event
do inicjowania wysyłania zdarzeń.
Tag Google i Menedżer tagów używają specjalnej zmiennej warstwy danych o nazwie event
, która jest używana przez detektory zdarzeń JavaScript do uruchamiania tagów, gdy użytkownik wchodzi w interakcję z elementami witryny. Możesz np. uruchomić tag śledzenia konwersji, gdy użytkownik kliknie przycisk potwierdzenia zakupu. Zdarzenia mogą być wywoływane, gdy użytkownik wchodzi w interakcję z elementami witryny, np. klika linki, klika przyciski, przewija strony itp.
Ta funkcja jest realizowana przez wywołanie funkcji dataLayer.push()
, gdy wystąpi zdarzenie. Składnia wysyłania zdarzenia za pomocą dataLayer.push()
:
dataLayer.push({'event': 'event_name'});
Gdzie event_name
to ciąg tekstowy opisujący zdarzenie, np. 'login'
, purchase
lub search
.
Używaj usługi dataLayer.push()
do wysyłania danych zdarzenia, gdy występuje działanie, które chcesz mierzyć. Jeśli na przykład chcesz wysyłać zdarzenie, gdy użytkownik kliknie przycisk, zmień moduł obsługi onclick
przycisku tak, by wywoływał dataLayer.push()
:
<button onclick="dataLayer.push({'event': 'login'});">Button 1</button>
Zmienne warstwy danych możesz dynamicznie przekazywać do warstwy danych, aby rejestrować informacje, takie jak wartości wpisane lub wybrane w formularzu, metadane powiązane z filmem odtwarzanym przez użytkownika, dostosowany przez użytkownika kolor produktu (np. samochodu) czy docelowe adresy URL klikniętego linku itp.
Podobnie jak w przypadku zdarzeń, ta funkcja jest realizowana przez wywołanie interfejsu API push()
w celu dodania lub zastąpienia zmiennych warstwy danych w warstwie danych. Podstawowa składnia służąca do ustawiania zmiennych warstwy danych dynamicznych:
dataLayer.push({'variable_name': 'variable_value'});
Gdzie 'variable_name'
to ciąg określający nazwę zmiennej warstwy danych do ustawienia, a 'variable_value'
to ciąg określający wartość zmiennej warstwy danych do ustawienia lub zastąpienia.
Przykład: aby ustawić zmienną warstwy danych z preferowanym kolorem, gdy użytkownik korzysta z narzędzia do personalizacji produktu, możesz przesłać tę zmienną warstwy danych dynamicznie:
dataLayer.push({'color': 'red'});
Jeden komunikat, wiele zmiennych
Możesz przekazać wiele zmiennych i zdarzeń jednocześnie:
dataLayer.push({
'color': 'red',
'conversionValue': 50,
'event': 'customize'
});
Zachowywanie zmiennych warstwy danych
Aby zachować zmienne warstwy danych między stronami internetowymi, po utworzeniu instancji warstwy danych przy każdym wczytaniu strony wywołaj funkcję dataLayer.push()
i prześlij zmienne do warstwy danych. Jeśli chcesz, aby te zmienne warstwy danych były dostępne dla Menedżera tagów po załadowaniu kontenera, nad kodem kontenera Menedżera tagów dodaj wywołanie dataLayer.push()
, jak pokazano poniżej.
<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 -->
Każda zmienna zadeklarowana w obiekcie warstwy danych będzie obowiązywać, dopóki użytkownik pozostanie na bieżącej stronie. Zmienne warstwy danych, które są istotne na różnych stronach (np. visitorType
), muszą być zadeklarowane w warstwie danych na każdej stronie w Twojej witrynie. Nie musisz umieszczać tego samego zestawu zmiennych w warstwie danych na każdej stronie, ale musisz stosować spójne konwencje nazewnictwa. Innymi słowy: jeśli na stronie rejestracji ustawisz kategorię strony za pomocą zmiennej o nazwie pageCategory
, strony produktów i strony zakupu powinny również używać zmiennej pageCategory
.
Rozwiązywanie problemów
Oto kilka wskazówek dotyczących rozwiązywania problemów z warstwą danych:
Nie zastępuj zmiennej window.dataLayer
: gdy używasz bezpośrednio warstwy danych (np. dataLayer = [{'item': 'value'}])
), zastąpi ona wszystkie istniejące wartości w polu dataLayer
. Instalacje Menedżera tagów powinny tworzyć instancje warstwy danych jak najwyżej w kodzie źródłowym, powyżej fragmentu kodu kontenera, za pomocą window.dataLayer =
window.dataLayer || [];
. Po zadeklarowaniu elementu dataLayer
możesz za jego pomocą dodawać do niego dodatkowe wartości. Jeśli wartości te mają być dostępne dla Menedżera tagów po załadowaniu strony, wywołanie elementu dataLayer.push()
musi znajdować się nad kodem kontenera Menedżera tagów.dataLayer.push({'item': 'value'})
W nazwie obiektu dataLayer
rozróżniana jest wielkość liter: jeśli spróbujesz przekazać zmienną lub zdarzenie bez odpowiedniej wielkości liter, przekazanie się nie uda.
datalayer.push({'pageTitle': 'Home'}); // Bad (datalayer in lowercase)
dataLayer.push({'pageTitle': 'Home'}); // Good (dataLayer in camel case)
Funkcja dataLayer.push
musi być wywoływana za pomocą prawidłowych obiektów JavaScript. Nazwy wszystkich zmiennych warstwy danych powinny być ujęte w cudzysłowie.
dataLayer.push({new-variable: 'value'}); // Bad - no quote marks
dataLayer.push({'new-variable': 'value'}); // Good - proper quote marks
Zachowuj spójność nazw zmiennych na różnych stronach: jeśli na różnych stronach używasz różnych nazw zmiennych dla tego samego pojęcia, tagi nie będą się konsekwentnie uruchamiać we wszystkich odpowiednich miejscach.
Nieprawidłowo:
// Homepage:
dataLayer.push({'visitorType': 'low-value'});
// Checkout Page:
dataLayer.push({'visitor_type': 'high-value'});
Dobra:
// Homepage:
dataLayer.push({'visitorType': 'low-value'});
// Checkout Page:
dataLayer.push({'visitorType': 'high-value'});
Zmiana nazwy warstwy danych
Domyślna nazwa obiektu warstwy danych zainicjowanego przez tag Google lub Menedżer tagów to dataLayer
. Jeśli wolisz używać innej nazwy dla warstwy danych, możesz to zrobić, edytując wartość parametru warstwy danych w tagu Google lub fragmencie kodu kontenera Menedżera tagów, podając wybraną nazwę.
gtag.js
Aby ustawić nową nazwę warstwy danych, dodaj do adresu URL parametr zapytania o nazwie „l”, np. l=myNewName
. Zmień nazwę we wszystkich wystąpieniach ciągu dataLayer
we fragmencie kodu tagu 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>
Menedżer tagów
Zastąp wartość parametru warstwy danych (zaznaczoną poniżej) w fragmentach kodu kontenera nazwą wybraną przez siebie.
<!-- 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 -->
Po zmianie nazwy wszystkie odwołania do warstwy danych (np. podczas deklarowania warstwy danych nad fragmentem kodu lub podczas przesyłania zdarzeń lub zmiennych warstwy danych dynamicznych do warstwy danych za pomocą polecenia .push()
) muszą zostać dostosowane do nazwy niestandardowej warstwy danych:
<script>
myNewName = window.dataLayer || [];
myNewName.push({'variable_name': 'variable_value'});
</script>
Metody warstwy danych niestandardowych
Jeśli prześlesz funkcję na warstwę danych, będzie ona wywoływana z użyciem tego zestawu jako abstrakcyjny model danych. Ten abstrakcyjny model danych może pobierać i ustawiać wartości w magazynie par klucz-wartość, a także umożliwia resetowanie warstwy danych.
zestaw
Funkcja set
w abstrakcyjnym modelu danych umożliwia ustawianie wartości do pobierania za pomocą funkcji get.
window.dataLayer.push(function() {
this.set('time', new Date());
});
get
Funkcja get
w abstrakcyjnym modelu danych umożliwia pobieranie wartości, które zostały ustawione.
window.dataLayer.push(function() {
const existingTime = this.get('time');
if (existingTime !== null) {
// Change behavior based on whether or not this value exists...
} else {
// ...
}
})
zresetuj
Funkcja reset
w abstrakcyjnym modelu danych umożliwia zresetowanie danych w warstwie danych. Jest to szczególnie przydatne w przypadku strony, która pozostanie otwarta, a jej warstwa danych będzie się z czasem powiększać. Aby zresetować warstwę danych, użyj tego kodu:
window.dataLayer.push(function() {
this.reset();
})