{"id":13139,"date":"2026-09-22T18:25:00","date_gmt":"2026-09-22T16:25:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=13139"},"modified":"2026-10-26T13:26:41","modified_gmt":"2026-10-26T12:26:41","slug":"tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/","title":{"rendered":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM"},"content":{"rendered":"<p>Zmienna warstwy danych w Google Tag Managerze (GTM) mo\u017ce zwraca\u0107 liczb\u0119, tekst, obiekt lub ca\u0142\u0105 tablic\u0119. Notacja kropkowa wybiera warto\u015b\u0107 z zagnie\u017cd\u017conych danych. Najwa\u017cniejsza jest r\u00f3\u017cnica mi\u0119dzy nazw\u0105 pola a pozycj\u0105 w tablicy: <code>items.0<\/code> oznacza pierwsz\u0105 pozycj\u0119, a nie konkretny produkt.<\/p>\n<p>Trwa\u0142e zmienne wymagaj\u0105 udokumentowanej struktury, kompletnych danych zdarzenia i kontroli brakuj\u0105cych warto\u015bci. Indeks nadaje si\u0119 do wskazania okre\u015blonej pozycji; to\u017csamo\u015b\u0107 produktu wymaga identyfikatora.<\/p>\n<figure class=\"lw-diagram\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/quality-13139-20261024.png\" width=\"1120\" height=\"580\" decoding=\"async\" loading=\"lazy\" alt=\"Nazwane \u015bcie\u017cki wskazuj\u0105 pola, a indeksy liczbowe pozycje. Ca\u0142a tablica produkt\u00f3w nie wymaga sta\u0142ej liczby pozycji.\"><figcaption>Nazwane \u015bcie\u017cki wskazuj\u0105 pola, a indeksy liczbowe pozycje. Ca\u0142a tablica produkt\u00f3w nie wymaga sta\u0142ej liczby pozycji.<\/figcaption><\/figure>\n<h2>Kompletne zdarzenie add_to_cart<\/h2>\n<p>Przyk\u0142ad dodaje dwa krzes\u0142a i jeden st\u00f3\u0142 w jednej operacji. Zdarzenie zawiera te nowo dodane produkty, a nie ca\u0142\u0105 dotychczasow\u0105 zawarto\u015b\u0107 koszyka. Warto\u015b\u0107 wynosi <code>64.95 \u00d7 2 + 219.00 \u00d7 1 = 348.90<\/code>, bez dostawy i podatku. Przy podaniu warto\u015bci wymagana jest waluta.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"javascript\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JavaScript<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-javascript\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">window.dataLayer = window.dataLayer || &#91;&#93;;\n<\/span><span class=\"cbb-line\">dataLayer.<span class=\"cbb-function\">push<\/span>({ ecommerce: <span class=\"cbb-constant\">null<\/span> });\n<\/span><span class=\"cbb-line\">dataLayer.<span class=\"cbb-function\">push<\/span>({\n<\/span><span class=\"cbb-line\">  event: <span class=\"cbb-string\">\"add_to_cart\"<\/span>,\n<\/span><span class=\"cbb-line\">  ecommerce: {\n<\/span><span class=\"cbb-line\">    currency: <span class=\"cbb-string\">\"EUR\"<\/span>,\n<\/span><span class=\"cbb-line\">    value: <span class=\"cbb-number\">348.90<\/span>,\n<\/span><span class=\"cbb-line\">    items: &#91;\n<\/span><span class=\"cbb-line\">      { item_id: <span class=\"cbb-string\">\"SKU-42\"<\/span>, item_name: <span class=\"cbb-string\">\"Krzeslo\"<\/span>, price: <span class=\"cbb-number\">64.95<\/span>, quantity: <span class=\"cbb-number\">2<\/span>,\n<\/span><span class=\"cbb-line\">        item_category: <span class=\"cbb-string\">\"Meble\"<\/span>, index: <span class=\"cbb-number\">0<\/span> },\n<\/span><span class=\"cbb-line\">      { item_id: <span class=\"cbb-string\">\"SKU-77\"<\/span>, item_name: <span class=\"cbb-string\">\"Stol\"<\/span>, price: <span class=\"cbb-number\">219.00<\/span>, quantity: <span class=\"cbb-number\">1<\/span>,\n<\/span><span class=\"cbb-line\">        item_category: <span class=\"cbb-string\">\"Meble\"<\/span>, index: <span class=\"cbb-number\">1<\/span> }\n<\/span><span class=\"cbb-line\">    &#93;\n<\/span><span class=\"cbb-line\">  },\n<\/span><span class=\"cbb-line\">  user: { logged_in: <span class=\"cbb-constant\">true<\/span>, segment: <span class=\"cbb-string\">\"b2b\"<\/span> }\n<\/span><span class=\"cbb-line\">});<\/span><\/code><\/pre><\/figure>\n<p>Inicjalizacja zachowuje istniej\u0105c\u0105 kolejk\u0119. Wyczyszczenie <code>ecommerce<\/code> zapobiega przeniesieniu starych p\u00f3l do tego kompletnego zestawu danych. Nazwa zdarzenia i zwi\u0105zane dane nale\u017c\u0105 do tego samego wywo\u0142ania push. <code>user.segment<\/code> pokazuje dodatkowy stan aplikacji; samo przes\u0142anie warto\u015bci nie konfiguruje w\u0142a\u015bciwo\u015bci u\u017cytkownika w GA4.<\/p>\n<h2>Odczyt zagnie\u017cd\u017conych p\u00f3l w wersji 2<\/h2>\n<p>Zmienna warstwy danych o nazwie wy\u015bwietlanej <code>DLV - ecommerce.currency<\/code>, \u015bcie\u017cce <code>ecommerce.currency<\/code> i wersji 2 zwraca <code>EUR<\/code>. Nazwa wy\u015bwietlana jest dowolna; warto\u015b\u0107 zale\u017cy od skonfigurowanej \u015bcie\u017cki. Kolejne zmienne mog\u0105 odczytywa\u0107 <code>ecommerce.value<\/code>, <code>ecommerce.items<\/code> i <code>ecommerce<\/code>. Dwie ostatnie zwracaj\u0105 odpowiednio tablic\u0119 i obiekt.<\/p>\n<p>Wersja 1 traktuje kropki jako dos\u0142owne znaki w nazwie klucza. Wersja 2 interpretuje kropki jako zagnie\u017cd\u017cenie i potrafi tak\u017ce rozwin\u0105\u0107 klucze takie jak <code>{\"page.type\":\"pdp\"}<\/code> do struktury zagnie\u017cd\u017conej. Klucz z kropk\u0105 nie wymaga wi\u0119c automatycznie wersji 1. Jednolite obiekty zagnie\u017cd\u017cone pozwalaj\u0105 unikn\u0105\u0107 niejednoznacznego mieszania kluczy z kropkami i w\u0142a\u015bciwo\u015bci obiekt\u00f3w.<\/p>\n<p>Wielko\u015b\u0107 liter ma znaczenie. Brakuj\u0105ca \u015bcie\u017cka bez skonfigurowanej warto\u015bci domy\u015blnej zwraca <code>undefined<\/code>. Dalsze zachowanie zale\u017cy od tagu i sposobu przekszta\u0142cania warto\u015bci w wysy\u0142ane \u017c\u0105danie: parametr mo\u017ce zosta\u0107 pomini\u0119ty lub przekszta\u0142cony, a w\u0142asny kod mo\u017ce zako\u0144czy\u0107 si\u0119 b\u0142\u0119dem. Brak warto\u015bci nie oznacza automatycznie pustego parametru ani konkretnej r\u00f3\u017cnicy w raporcie.<\/p>\n<h2>Pozycja a to\u017csamo\u015b\u0107 produktu<\/h2>\n<table><thead><tr><th>\u015acie\u017cka<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td><code>ecommerce.currency<\/code><\/td><td>Waluta zdarzenia<\/td><\/tr><tr><td><code>ecommerce.value<\/code><\/td><td>Warto\u015b\u0107 zdarzenia<\/td><\/tr><tr><td><code>user.segment<\/code><\/td><td>Segment aplikacji<\/td><\/tr><tr><td><code>ecommerce.items<\/code><\/td><td>Ca\u0142a tablica produkt\u00f3w<\/td><\/tr><tr><td><code>ecommerce.items.0.item_id<\/code><\/td><td>ID pierwszego produktu<\/td><\/tr><tr><td><code>ecommerce.items.1.price<\/code><\/td><td>Cena drugiego produktu; brak przy jednym produkcie<\/td><\/tr><\/tbody><\/table>\n<p>Nazwana \u015bcie\u017cka pozostaje u\u017cyteczna przy zgodnym schemacie i obecnych danych zdarzenia. \u015acie\u017cka z indeksem jest poprawna, gdy wymaganie brzmi \u201epierwszy produkt\u201d; zmiana kolejno\u015bci zmienia produkt na tej pozycji. Wyszukiwanie konkretnego produktu powinno u\u017cywa\u0107 <code>item_id<\/code>. Dla e-commerce GA4 odpowiednia jest zwykle ca\u0142a tablica <code>ecommerce.items<\/code>. W\u0142asne przekszta\u0142cenie nie jest potrzebne, je\u015bli \u017ar\u00f3d\u0142o ju\u017c dostarcza oczekiwany format.<\/p>\n<h2>Kolejka komunikat\u00f3w i scalony model<\/h2>\n<p><code>window.dataLayer<\/code> jest tablic\u0105 oczekuj\u0105cych komunikat\u00f3w. GTM przetwarza komunikaty i utrzymuje wewn\u0119trzny model danych. Wersja 2 mo\u017ce scala\u0107 obiekty i tablice tak\u017ce na kolejnych zagnie\u017cd\u017conych poziomach: pomini\u0119te pola lub ko\u0144cowe pozycje mog\u0105 pozosta\u0107 z wcze\u015bniejszych komunikat\u00f3w. Kr\u00f3tsza tablica nie usuwa wi\u0119c niezawodnie poprzednich pozycji.<\/p>\n<p>Przyk\u0142ady Google dla e-commerce w GTM czyszcz\u0105 poprzedni obiekt przez <code>dataLayer.push({ecommerce:null})<\/code> przed wys\u0142aniem kompletnego zdarzenia. Ten wzorzec pasuje do powy\u017cszego przyk\u0142adu. Integracje celowo buduj\u0105ce stan przez kilka komunikat\u00f3w wymagaj\u0105 uzgodnionego resetowania i kompletnych danych; bezrefleksyjne czyszczenie przed niepe\u0142nym zestawem mo\u017ce usun\u0105\u0107 potrzebne warto\u015bci.<\/p>\n<h2>Opcjonalna walidacja bez wymy\u015blonych warto\u015bci domy\u015blnych<\/h2>\n<p>Poni\u017csza niestandardowa zmienna JavaScript o nazwie <code>JS - ecommerce valid<\/code> odczytuje zmienn\u0105 warstwy danych w wersji 2 o nazwie <code>DLV - ecommerce<\/code>. Funkcja zwraca warto\u015b\u0107 logiczn\u0105 i nie zmienia \u017ar\u00f3d\u0142a.<\/p>\n<p>Przyk\u0142adowe wymagania s\u0105 celowo \u015bcis\u0142e: EUR, liczbowe nieujemne ceny i warto\u015bci, dodatnie ca\u0142kowite ilo\u015bci oraz niepusty tekst w co najmniej jednym polu <code>item_id<\/code> lub <code>item_name<\/code>. Ka\u017cdy przekazany identyfikator i ka\u017cda przekazana nazwa musz\u0105 by\u0107 niepustym tekstem. GA4 akceptuje r\u00f3wnie\u017c produkt z sam\u0105 nazw\u0105; identyfikator nie jest bezwzgl\u0119dnie wymagany. Przy pomini\u0119ciu ilo\u015bci GA4 przyjmuje 1, lecz ten przyk\u0142ad wymaga jawnej ilo\u015bci, aby ujawni\u0107 brakuj\u0105ce dane sklepu.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"javascript\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JavaScript<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-javascript\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">function<\/span> () {\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">var<\/span> e = {{DLV - ecommerce}};\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">function<\/span> <span class=\"cbb-function\">number<\/span>(x) { <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-keyword\">typeof<\/span> x === <span class=\"cbb-string\">\"number\"<\/span> &amp;&amp; <span class=\"cbb-function\">isFinite<\/span>(x); }\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">function<\/span> <span class=\"cbb-function\">text<\/span>(x) { <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-keyword\">typeof<\/span> x === <span class=\"cbb-string\">\"string\"<\/span> &amp;&amp; x.<span class=\"cbb-function\">trim<\/span>() !== <span class=\"cbb-string\">\"\"<\/span>; }\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">if<\/span> (!e || e.currency !== <span class=\"cbb-string\">\"EUR\"<\/span> || !<span class=\"cbb-function\">number<\/span>(e.value) || e.value &lt; <span class=\"cbb-number\">0<\/span> ||\n<\/span><span class=\"cbb-line\">      !<span class=\"cbb-type\">Array<\/span>.<span class=\"cbb-function\">isArray<\/span>(e.items) || !e.items.length) { <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">false<\/span>; }\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">var<\/span> sum = <span class=\"cbb-number\">0<\/span>;\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">for<\/span> (<span class=\"cbb-keyword\">var<\/span> i = <span class=\"cbb-number\">0<\/span>; i &lt; e.items.length; i++) {\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">var<\/span> a = e.items&#91;i&#93;;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> (!a || <span class=\"cbb-keyword\">typeof<\/span> a !== <span class=\"cbb-string\">\"object\"<\/span> || <span class=\"cbb-type\">Array<\/span>.<span class=\"cbb-function\">isArray<\/span>(a)) { <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">false<\/span>; }\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> (!<span class=\"cbb-function\">text<\/span>(a.item_id) &amp;&amp; !<span class=\"cbb-function\">text<\/span>(a.item_name)) { <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">false<\/span>; }\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> (a.item_id !== <span class=\"cbb-constant\">undefined<\/span> &amp;&amp; !<span class=\"cbb-function\">text<\/span>(a.item_id)) { <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">false<\/span>; }\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> (a.item_name !== <span class=\"cbb-constant\">undefined<\/span> &amp;&amp; !<span class=\"cbb-function\">text<\/span>(a.item_name)) { <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">false<\/span>; }\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> (!<span class=\"cbb-function\">number<\/span>(a.price) || a.price &lt; <span class=\"cbb-number\">0<\/span> ||\n<\/span><span class=\"cbb-line\">        !<span class=\"cbb-function\">number<\/span>(a.quantity) || a.quantity &lt;= <span class=\"cbb-number\">0<\/span> ||\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-type\">Math<\/span>.<span class=\"cbb-function\">floor<\/span>(a.quantity) !== a.quantity) { <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">false<\/span>; }\n<\/span><span class=\"cbb-line\">    sum += a.price * a.quantity;\n<\/span><span class=\"cbb-line\">  }\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-function\">isFinite<\/span>(sum) &amp;&amp; <span class=\"cbb-type\">Math<\/span>.<span class=\"cbb-function\">abs<\/span>(sum - e.value) &lt; <span class=\"cbb-number\">0.005<\/span>;\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n<p>Por\u00f3wnanie dopuszcza r\u00f3\u017cnic\u0119 zmiennoprzecinkow\u0105 mniejsz\u0105 ni\u017c p\u00f3\u0142 eurocenta. To przyk\u0142adowa kontrola dla EUR, a nie uniwersalny model walut, rabat\u00f3w lub podatk\u00f3w. Bezp\u0142atne produkty z rzeczywist\u0105 liczbow\u0105 cen\u0105 0 pozostaj\u0105 poprawne. Tekst taki jak <code>\"64.95\"<\/code>, b\u0142\u0119dne ceny i zerowe ilo\u015bci nie przechodz\u0105 kontroli zamiast po cichu zmienia\u0107 si\u0119 w 0 lub 1. Opcjonalne pola produkt\u00f3w pozostaj\u0105 dost\u0119pne, poniewa\u017c tablica nie jest przebudowywana.<\/p>\n<p>Dla tagu GA4 <code>add_to_cart<\/code> regu\u0142a typu \u201eZdarzenie niestandardowe\u201d u\u017cywa nazwy <code>add_to_cart<\/code> i dodatkowego warunku <code>{{JS - ecommerce valid}}<\/code> r\u00f3wna si\u0119 <code>true<\/code>. Parametry zdarzenia <code>currency<\/code>, <code>value<\/code> i <code>items<\/code> korzystaj\u0105 z odpowiednich zmiennych wersji 2. Kontrola musi by\u0107 przypisana do tagu faktycznie wysy\u0142aj\u0105cego dane; samo zwr\u00f3cenie <code>undefined<\/code> przez inn\u0105 zmienn\u0105 nie zatrzymuje tagu. Inne regu\u0142y nie mog\u0105 omija\u0107 kontroli.<\/p>\n<h2>Sprawdzenie wybranego zdarzenia<\/h2>\n<p>W podgl\u0105dzie GTM trzy widoki tego samego wybranego zdarzenia dostarczaj\u0105 uzupe\u0142niaj\u0105cych informacji: oryginalny komunikat, wynikowy stan warstwy danych i obliczone zmienne. Dodatkowe pola modelu mog\u0105 by\u0107 zamierzonym trwa\u0142ym stanem, a nie b\u0142\u0119dem. Brak wyniku mo\u017ce wynika\u0107 z czasu odczytu, resetu, niew\u0142a\u015bciwej wersji, pisowni lub w\u0142asnej walidacji.<\/p>\n<p>Przydatna sekwencja testowa obejmuje dwa produkty, jeden produkt, zmian\u0119 kolejno\u015bci, produkt bezp\u0142atny, produkt z sam\u0105 nazw\u0105 oraz b\u0142\u0119dne dane. Po drugim, kr\u00f3tszym zdarzeniu nie mog\u0105 pozostawa\u0107 stare produkty. Tag powinien uruchomi\u0107 si\u0119 raz dla poprawnych danych i pozosta\u0107 zablokowany dla b\u0142\u0119dnych. Tag Assistant i wychodz\u0105ce \u017c\u0105danie GA4 pozwalaj\u0105 nast\u0119pnie sprawdzi\u0107 mapowanie; sam test funkcji nie sprawdza kontenera.<\/p>\n<div class=\"lw-faq\"><h2>Pytania i odpowiedzi<\/h2><h3>Co dzieje si\u0119 z cen\u0105 z przecinkiem dziesi\u0119tnym?<\/h3><p>Walidator odrzuca tekst, r\u00f3wnie\u017c <code>\"64,95\"<\/code>. Preferowane s\u0105 ceny liczbowe w \u017ar\u00f3dle. Konwersja tekstu lokalnego wymaga znanego formatu i jawnej walidacji; bezwarunkowe usuwanie kropek zmieni\u0142oby angielsk\u0105 cen\u0119 dziesi\u0119tn\u0105 w inn\u0105 kwot\u0119. Wyra\u017cenie <code>Number(value) || 0<\/code> ukrywa b\u0142\u0119dne dane i nie powinno ustala\u0107 domy\u015blnej kwoty.<\/p><h3>Czy w\u0142asna zmienna powinna wysy\u0142a\u0107 kolejny komunikat?<\/h3><p>Nie. Obliczenie zmiennej mo\u017ce nast\u0105pi\u0107 wielokrotnie. Czysta funkcja odczytuje dane i zwraca wynik bez zmiany kolejki lub produkt\u00f3w. Push wewn\u0105trz zmiennej mo\u017ce tworzy\u0107 nieoczekiwane zdarzenia albo p\u0119tle.<\/p><\/div>\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/datalayer\" target=\"_blank\" rel=\"noopener noreferrer\">Warstwa danych<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\" target=\"_blank\" rel=\"noopener noreferrer\">Google Tag Manager: dokumentacja<\/a><\/li>\n<li><a href=\"https:\/\/support.google.com\/tagmanager\/answer\/7683362?hl=en\" target=\"_blank\" rel=\"noopener noreferrer\">GTM: typy zmiennych<\/a><\/li><li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\/ecommerce?client_type=gtm\" target=\"_blank\" rel=\"noopener noreferrer\">E-commerce GA4 z GTM<\/a><\/li><li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\/reference\/events?hl=en\" target=\"_blank\" rel=\"noopener noreferrer\">GA4: dokumentacja zdarze\u0144<\/a><\/li><li><a href=\"https:\/\/github.com\/google\/data-layer-helper\" target=\"_blank\" rel=\"noopener noreferrer\">Google Data Layer Helper: model danych i scalanie<\/a><\/li><\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Zagnie\u017cd\u017cone warto\u015bci dataLayer mo\u017cna odczytywa\u0107 bezpo\u015brednio zmiennymi wersji 2. Kompletny przyk\u0142ad e-commerce wyja\u015bnia pozycje w tablicy, scalony stan i opcjonaln\u0105 walidacj\u0119 bez wymy\u015blonych cen lub ilo\u015bci.<\/p>\n","protected":false},"author":1,"featured_media":29390,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[117],"tags":[92133,92271,92044,92238],"class_list":["post-13139","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl","tag-google-tag-manager-pl","tag-javascript-pl","tag-tracking-pl","tag-tutorial-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-22T16:25:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T12:26:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13135-13139.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM\",\"datePublished\":\"2026-09-22T16:25:00+00:00\",\"dateModified\":\"2026-10-26T12:26:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/\"},\"wordCount\":1043,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13135-13139.png\",\"keywords\":[\"Google Tag Manager\",\"JavaScript\",\"Tracking\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/\",\"name\":\"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13135-13139.png\",\"datePublished\":\"2026-09-22T16:25:00+00:00\",\"dateModified\":\"2026-10-26T12:26:41+00:00\",\"description\":\"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13135-13139.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13135-13139.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM | Lukas Wojcik","description":"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM | Lukas Wojcik","og_description":"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-22T16:25:00+00:00","article_modified_time":"2026-10-26T12:26:41+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13135-13139.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM","datePublished":"2026-09-22T16:25:00+00:00","dateModified":"2026-10-26T12:26:41+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/"},"wordCount":1043,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13135-13139.png","keywords":["Google Tag Manager","JavaScript","Tracking","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/","name":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13135-13139.png","datePublished":"2026-09-22T16:25:00+00:00","dateModified":"2026-10-26T12:26:41+00:00","description":"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13135-13139.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13135-13139.png","width":1200,"height":630,"caption":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13139"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13139\/revisions"}],"predecessor-version":[{"id":27381,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13139\/revisions\/27381"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/29390"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=13139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}