Ask me anything
Ithy Logo
Sign in to save

Tworzenie Modułu Google Tag Manager dla PrestaShop 8.2 Multistore: Kompleksowy Przewodnik

Zintegruj GTM na każdej stronie Twojego multistore'a – od podstawowej konfiguracji po zaawansowane śledzenie.

prestashop-gtm-multistore-module-syhzaa1j

Integracja Google Tag Manager (GTM) z PrestaShop 8.2 w środowisku multistore pozwala na centralne zarządzanie tagami marketingowymi i analitycznymi (jak Google Analytics 4, Google Ads, Facebook Pixel) bez konieczności edycji kodu źródłowego dla każdego sklepu z osobna. Ten przewodnik pokaże Ci, jak stworzyć własny moduł lub wykorzystać istniejące rozwiązania, aby zapewnić spójne śledzenie na wszystkich stronach Twojej instalacji multistore.

Najważniejsze Informacje

  • Gotowe Moduły vs. Własny Kod: Rozważ użycie sprawdzonych modułów z PrestaShop Addons lub darmowych rozwiązań (np. z GitHub), które często oferują zaawansowane funkcje (jak warstwa danych eCommerce) i wsparcie dla multistore. Budowa własnego modułu daje pełną kontrolę, ale wymaga wiedzy technicznej.
  • Kluczowe Elementy Modułu: Moduł musi poprawnie rejestrować hooki (np. displayHeader, displayAfterBodyOpeningTag), obsługiwać konfigurację GTM ID osobno dla każdego sklepu w multistore (używając kontekstu sklepu) i wstrzykiwać oba fragmenty kodu GTM (w <head> i <body>).
  • Testowanie i Weryfikacja: Po instalacji i konfiguracji modułu, niezbędne jest dokładne przetestowanie działania GTM za pomocą trybu podglądu Google Tag Manager oraz narzędzia Tag Assistant Companion na różnych stronach i we wszystkich sklepach multistore.

Dlaczego Google Tag Manager w PrestaShop Multistore?

Centralizacja Zarządzania Tagami

Google Tag Manager (GTM) działa jak kontener na różne skrypty śledzące i marketingowe. Zamiast dodawać każdy tag (np. Google Analytics, Google Ads Remarketing, Facebook Pixel) osobno do kodu sklepu, dodajesz tylko jeden fragment kodu GTM. Następnie wszystkimi tagami zarządzasz z poziomu interfejsu GTM.

Korzyści w Kontekście Multistore:

  • Spójność: Zapewnia, że te same podstawowe tagi są aktywne we wszystkich sklepach.
  • Elastyczność: Umożliwia łatwe dodawanie, modyfikowanie lub usuwanie tagów bez interwencji programisty.
  • Kontrola: Pozwala na precyzyjne określenie reguł uruchamiania tagów (np. tylko na stronie podziękowania za zamówienie, tylko w określonym sklepie).
  • Wsparcie dla GA4: GTM jest preferowaną metodą implementacji Google Analytics 4, zwłaszcza zaawansowanego śledzenia eCommerce.
Włączanie trybu multistore w panelu PrestaShop

Panel administracyjny PrestaShop z włączoną opcją multistore.


Podejścia do Integracji GTM w PrestaShop Multistore

Opcja 1: Użycie Gotowego Modułu (Zalecane)

Najprostszym i często najbezpieczniejszym sposobem jest skorzystanie z modułu dostępnego na PrestaShop Addons lub od zaufanych deweloperów. Wiele z nich oferuje wsparcie dla PrestaShop 8.2 i konfiguracji multistore.

Zalety:

  • Łatwa instalacja i konfiguracja przez panel administracyjny.
  • Często zawierają gotową implementację warstwy danych (DataLayer) dla śledzenia eCommerce (wyświetlenia produktów, dodania do koszyka, zakupy).
  • Zapewniona kompatybilność z aktualizacjami PrestaShop (w przypadku wspieranych modułów).
  • Wsparcie techniczne od twórcy modułu.

Przykłady (wspominane w źródłach):

Opcja 2: Stworzenie Własnego Modułu

Jeśli potrzebujesz pełnej kontroli lub specyficznych funkcji, możesz napisać własny moduł. Poniżej znajduje się przykład podstawowej struktury i kodu dla modułu integrującego GTM w PrestaShop 8.2 multistore.

Zalety:

  • Pełna kontrola nad kodem i funkcjonalnością.
  • Brak kosztów licencji (poza czasem deweloperskim).
  • Możliwość dostosowania do nietypowych wymagań.

Wady:

  • Wymaga znajomości PHP, Smarty i architektury modułów PrestaShop.
  • Konieczność samodzielnego utrzymania i aktualizacji modułu.
  • Brak gotowej implementacji zaawansowanych funkcji (np. DataLayer) – trzeba je dopisać.

Porównanie Podejść: Moduł Gotowy vs. Własny

Wybór między gotowym modułem a stworzeniem własnego zależy od Twoich zasobów, wiedzy technicznej i specyficznych potrzeb. Poniższy wykres radarowy przedstawia porównanie obu podejść pod kątem kilku kluczowych czynników.

Jak widać, gotowe moduły oferują szybszą implementację i łatwiejsze utrzymanie, często kosztem elastyczności lub początkowej ceny. Budowa własnego modułu jest bardziej pracochłonna i wymaga większej wiedzy, ale zapewnia maksymalną kontrolę i potencjalnie niższy koszt licencji.


Budowa Podstawowego Modułu GTM dla Multistore

Struktura Plików Modułu

Stwórz folder modułu w katalogu /modules/ Twojej instalacji PrestaShop, np. /modules/mygtmmodule/. Podstawowa struktura będzie wyglądać następująco:

/modules/mygtmmodule/
├── mygtmmodule.php         # Główny plik modułu
├── config.xml              # Plik konfiguracyjny modułu (opcjonalny dla podstawowej funkcji)
├── logo.png                # Ikona modułu (opcjonalne)
└── views/
    └── templates/
        └── hook/
            ├── displayHeader.tpl   # Szablon dla kodu GTM w <head>
            └── displayAfterBodyOpeningTag.tpl # Szablon dla kodu GTM w <body> (jeśli używasz tego hooka)

Kod Pliku Głównego (mygtmmodule.php)

Poniższy kod przedstawia podstawową implementację modułu, który pozwala na ustawienie GTM ID dla każdego sklepu w multistore i wstrzykuje kody GTM.

<?php

if (!defined('_PS_VERSION_')) {
    exit;
}

class MyGtmModule extends Module
{
    public function __construct()
    {
        $this->name = 'mygtmmodule';
        $this->tab = 'analytics_stats'; // Kategoria modułu w panelu admina
        $this->version = '1.0.0';
        $this->author = 'Twoje Imię';
        $this->need_instance = 0; // Nie wymaga ładowania instancji przy każdym żądaniu
        $this->bootstrap = true; // Używa Bootstrap dla formularza konfiguracji

        parent::__construct();

        $this->displayName = $this->trans('Mój Moduł GTM Multistore', [], 'Modules.Mygtmmodule.Admin');
        $this->description = $this->trans('Dodaje Google Tag Manager na każdej stronie w środowisku multistore.', [], 'Modules.Mygtmmodule.Admin');
        $this->ps_versions_compliancy = ['min' => '8.0.0', 'max' => _PS_VERSION_]; // Kompatybilność z PrestaShop
    }

    /**
     * Instalacja modułu: rejestracja hooków i inicjalizacja konfiguracji.
     */
    public function install()
    {
        if (!parent::install() ||
            !$this->registerHook('displayHeader') || // Hook dla sekcji <head>
            !$this->registerHook('displayAfterBodyOpeningTag') || // Hook zaraz po <body>
            !$this->installConfiguration()) {
            return false;
        }
        return true;
    }

    /**
     * Odinstalowanie modułu: wyrejestrowanie hooków i usunięcie konfiguracji.
     */
    public function uninstall()
    {
        if (!parent::uninstall() ||
            !Configuration::deleteByName('MYGTM_CONTAINER_ID')) { // Usuwa globalną konfigurację
            return false;
        }
        // Uwaga: Dla pełnego czyszczenia należałoby usunąć wpisy per sklep.
        return true;
    }

    /**
     * Inicjalizuje domyślną (pustą) konfigurację dla każdego istniejącego sklepu.
     */
    private function installConfiguration()
    {
        $shops = Shop::getShops(true, null, true); // Pobiera ID wszystkich sklepów
        foreach ($shops as $shopId) {
            // Ustawia pustą wartość GTM ID dla każdego sklepu
            Configuration::updateValue('MYGTM_CONTAINER_ID', '', false, null, (int)$shopId);
        }
        return true;
    }

    /**
     * Wyświetla i obsługuje formularz konfiguracji w panelu admina.
     */
    public function getContent()
    {
        $output = '';
        $currentShopId = (int)Shop::getContextShopID(true); // Pobiera ID aktualnie wybranego sklepu w panelu

        // Obsługa zapisu formularza
        if (Tools::isSubmit('submit'.$this->name)) {
            $gtmId = Tools::getValue('MYGTM_CONTAINER_ID');
            // Podstawowa walidacja formatu GTM ID
            if (!empty($gtmId) && preg_match('/^GTM-[A-Z0-9]{6,7}$/', $gtmId)) {
                // Zapisuje GTM ID dla aktualnie wybranego sklepu
                Configuration::updateValue('MYGTM_CONTAINER_ID', $gtmId, false, null, $currentShopId);
                $output .= $this->displayConfirmation($this->trans('Ustawienia zapisane pomyślnie dla sklepu ID: ', [], 'Admin.Notifications.Success') . $currentShopId);
                 $this->_clearCache('*'); // Czyści cache szablonów
            } else if (empty($gtmId)) {
                 Configuration::updateValue('MYGTM_CONTAINER_ID', '', false, null, $currentShopId); // Zapisz pustą wartość, jeśli pole jest puste
                 $output .= $this->displayConfirmation($this->trans('Ustawienie GTM ID usunięte dla sklepu ID: ', [], 'Admin.Notifications.Success') . $currentShopId);
                 $this->_clearCache('*');
            } else {
                $output .= $this->displayError($this->trans('Nieprawidłowy format GTM ID. Oczekiwany format: GTM-XXXXXXX', [], 'Modules.Mygtmmodule.Admin'));
            }
        }

        return $output . $this->renderForm(); // Wyświetla formularz
    }

    /**
     * Generuje formularz konfiguracji za pomocą HelperForm.
     */
    protected function renderForm()
    {
        $currentShopId = (int)Shop::getContextShopID(true);

        $fields_form = [
            'form' => [
                'legend' => [
                    'title' => $this->trans('Konfiguracja Google Tag Manager', [], 'Modules.Mygtmmodule.Admin'),
                    'icon' => 'icon-cogs',
                ],
                'input' => [
                    [
                        'type' => 'text',
                        'label' => $this->trans('ID Kontenera GTM', [], 'Modules.Mygtmmodule.Admin'),
                        'name' => 'MYGTM_CONTAINER_ID',
                        'required' => false, // Może być puste, aby wyłączyć dla danego sklepu
                        'desc' => $this->trans('Wprowadź ID kontenera Google Tag Manager (np. GTM-XXXXXXX). Pozostaw puste, aby wyłączyć GTM dla bieżącego sklepu (ID: ', [], 'Modules.Mygtmmodule.Admin') . $currentShopId . ').',
                        'hint' => $this->trans('Znajdziesz je w swoim panelu Google Tag Manager.', [], 'Modules.Mygtmmodule.Admin'),
                    ],
                ],
                'submit' => [
                    'title' => $this->trans('Zapisz', [], 'Admin.Actions'),
                    'class' => 'btn btn-default pull-right'
                ],
            ],
        ];

        $helper = new HelperForm();
        $helper->module = $this;
        $helper->name_controller = $this->name;
        $helper->token = Tools::getAdminTokenLite('AdminModules');
        $helper->currentIndex = AdminController::$currentIndex . '&configure=' . $this->name;
        $helper->default_form_language = (int)Configuration::get('PS_LANG_DEFAULT');
        $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
        $helper->title = $this->displayName;
        $helper->show_toolbar = true;
        $helper->toolbar_scroll = true;
        $helper->submit_action = 'submit'.$this->name;

        // Ładuje zapisaną wartość GTM ID dla aktualnego kontekstu sklepu
        $helper->fields_value['MYGTM_CONTAINER_ID'] = Configuration::get('MYGTM_CONTAINER_ID', null, null, $currentShopId);

        return $helper->generateForm([$fields_form]);
    }

    /**
     * Hook wywoływany w sekcji <head> strony. Wstrzykuje pierwszą część kodu GTM.
     */
    public function hookDisplayHeader($params)
    {
        $currentShopId = (int)$this->context->shop->id; // Pobiera ID bieżącego sklepu front-office
        $gtmId = Configuration::get('MYGTM_CONTAINER_ID', null, null, $currentShopId); // Pobiera GTM ID dla tego sklepu

        // Jeśli GTM ID nie jest ustawione dla tego sklepu, nic nie rób
        if (empty($gtmId) || !preg_match('/^GTM-[A-Z0-9]{6,7}$/', $gtmId)) {
            return '';
        }

        // Przekazuje GTM ID do szablonu Smarty
        $this->context->smarty->assign([
            'mygtm_id' => $gtmId,
        ]);

        // Wyświetla szablon dla sekcji <head>
        return $this->display(__FILE__, 'views/templates/hook/displayHeader.tpl');
    }

    /**
     * Hook wywoływany zaraz po otwierającym tagu <body>. Wstrzykuje drugą część kodu GTM (noscript).
     * UWAGA: Dostępność i poprawne działanie tego hooka może zależeć od używanego szablonu!
     */
    public function hookDisplayAfterBodyOpeningTag($params)
    {
        $currentShopId = (int)$this->context->shop->id;
        $gtmId = Configuration::get('MYGTM_CONTAINER_ID', null, null, $currentShopId);

        if (empty($gtmId) || !preg_match('/^GTM-[A-Z0-9]{6,7}$/', $gtmId)) {
            return '';
        }

        $this->context->smarty->assign([
            'mygtm_id' => $gtmId,
        ]);

        // Wyświetla szablon dla sekcji <body>
        // Upewnij się, że plik szablonu istnieje
        $templateFile = 'views/templates/hook/displayAfterBodyOpeningTag.tpl';
        if (file_exists(_PS_MODULE_DIR_ . $this->name . '/' . $templateFile)) {
             return $this->display(__FILE__, $templateFile);
        }
        // Zwróć pusty string lub log błędu, jeśli szablon nie istnieje
         PrestaShopLogger::addLog('Szablon GTM body nie znaleziony: ' . $templateFile, 2, null, 'MyGtmModule', null, true);
         return '';
    }
}

Kod Szablonu dla <head> (views/templates/hook/displayHeader.tpl)

{* Google Tag Manager - Head Snippet *}
{if isset($mygtm_id) && $mygtm_id}
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){ldelim}w[l]=w[l]||[];w[l].push({ldelim}'gtm.start':
new Date().getTime(),event:'gtm.js'{rdelim});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);
{rdelim})(window,document,'script','dataLayer','{$mygtm_id|escape:'htmlall':'UTF-8'}');</script>
<!-- End Google Tag Manager -->
{/if}
{*Uwaga: Używamy {ldelim} i {rdelim} do ominięcia przetwarzania nawiasów klamrowych przez Smarty.*}

Kod Szablonu dla <body> (views/templates/hook/displayAfterBodyOpeningTag.tpl)

{* Google Tag Manager - Body Snippet (noscript) *}
{if isset($mygtm_id) && $mygtm_id}
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id={$mygtm_id|escape:'htmlall':'UTF-8'}"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
{/if}

Kluczowe Aspekty Kodu:

  • Obsługa Multistore: Funkcje Shop::getContextShopID() i Configuration::get/updateValue z podanym ID sklepu zapewniają, że konfiguracja jest odczytywana i zapisywana dla właściwego sklepu.
  • Hooki: Używamy displayHeader (standardowy, zawsze dostępny) i displayAfterBodyOpeningTag (może wymagać wsparcia przez szablon) do wstrzyknięcia kodu GTM w odpowiednich miejscach.
  • HelperForm: Ułatwia tworzenie standardowego formularza konfiguracji w panelu admina PrestaShop.
  • Szablony .tpl: Oddzielenie logiki PHP od prezentacji HTML/JS za pomocą plików szablonów Smarty.
  • Czyszczenie Cache: _clearCache('*') jest ważne po zmianie konfiguracji, aby zmiany były widoczne.

Struktura Logiczna Modułu GTM

Poniższa mapa myśli ilustruje główne komponenty i przepływ działania modułu GTM dla PrestaShop Multistore.

mindmap root["Moduł GTM dla PrestaShop Multistore"] id1["Instalacja / Deinstalacja"] id1a["Rejestracja Hooków
(displayHeader, displayAfterBodyOpeningTag)"] id1b["Inicjalizacja Konfiguracji
(puste GTM ID dla każdego sklepu)"] id1c["Usuwanie Konfiguracji"] id2["Konfiguracja (Panel Admina)"] id2a["HelperForm (Generowanie formularza)"] id2b["Pobieranie Kontekstu Sklepu
(Shop::getContextShopID)"] id2c["Zapis/Odczyt GTM ID per Sklep
(Configuration::updateValue/get)"] id2d["Walidacja GTM ID"] id2e["Czyszczenie Cache"] id3["Wstrzykiwanie Kodu GTM (Front-Office)"] id3a["Hook: displayHeader"] id3aa["Pobranie GTM ID dla bieżącego sklepu"] id3ab["Przekazanie ID do szablonu (.tpl)"] id3ac["Renderowanie szablonu
(<script> w <head>)"] id3b["Hook: displayAfterBodyOpeningTag"] id3ba["Pobranie GTM ID dla bieżącego sklepu"] id3bb["Przekazanie ID do szablonu (.tpl)"] id3bc["Renderowanie szablonu
(<noscript> w <body>)"] id4["Zależności"] id4a["PrestaShop Core (Hooks, Configuration, Shop, Module, HelperForm)"] id4b["Szablon Smarty (.tpl)"] id4c["Szablon Sklepu (musi wspierać hook displayAfterBodyOpeningTag)"]

Mapa pokazuje, jak instalacja konfiguruje podstawy, panel administracyjny pozwala zarządzać GTM ID dla każdego sklepu, a hooki w połączeniu z szablonami wstrzykują odpowiedni kod na stronach front-office, uwzględniając kontekst multistore.


Instalacja, Konfiguracja i Testowanie

Kroki Instalacji

  1. Umieść folder modułu (mygtmmodule) w katalogu /modules/ Twojej instalacji PrestaShop.
  2. Zaloguj się do panelu administracyjnego PrestaShop.
  3. Przejdź do sekcji "Moduły" -> "Katalog Modułów" lub "Menedżer Modułów".
  4. Wyszukaj moduł "Mój Moduł GTM Multistore" i kliknij "Instaluj".

Konfiguracja dla Każdego Sklepu

  1. Po instalacji, kliknij "Konfiguruj" przy module.
  2. W górnej części panelu administracyjnego (lub w ustawieniach multistore) wybierz sklep, dla którego chcesz ustawić GTM ID.
  3. W formularzu konfiguracyjnym modułu wprowadź poprawne ID Kontenera GTM (np. GTM-XXXXXXX) dla wybranego sklepu.
  4. Kliknij "Zapisz".
  5. Powtórz kroki 2-4 dla każdego sklepu w Twojej konfiguracji multistore, dla którego chcesz aktywować GTM. Jeśli pozostawisz pole puste, GTM nie zostanie wczytany dla danego sklepu.
Wybór kontekstu sklepu w panelu PrestaShop multistore

Przełączanie kontekstu sklepu w panelu administracyjnym PrestaShop jest kluczowe dla konfiguracji per sklep.

Testowanie Implementacji

  1. Otwórz swoje konto Google Tag Manager.
  2. Kliknij przycisk "Podgląd" (Preview) w prawym górnym rogu.
  3. Wpisz adres URL jednego ze swoich sklepów (dla którego skonfigurowałeś GTM ID) i kliknij "Connect".
  4. Nowa karta przeglądarki otworzy Twój sklep, a okno Tag Assistant połączy się z nią.
  5. Sprawdź, czy w oknie Tag Assistant widzisz swój kontener GTM i czy tagi (jeśli jakieś skonfigurowałeś w GTM) uruchamiają się poprawnie podczas nawigacji po sklepie.
  6. Powtórz testy dla różnych typów stron (główna, kategoria, produkt, koszyk, proces zamówienia) oraz dla każdego sklepu w konfiguracji multistore.
  7. Możesz również użyć rozszerzenia przeglądarki Tag Assistant Companion do szybkiej weryfikacji.

Ten film (choć może dotyczyć konkretnego płatnego modułu) daje ogólne pojęcie o procesie integracji GTM z PrestaShop i korzyściach płynących z używania menedżera tagów.


Tabela Hooków PrestaShop Używanych w Module

Poniższa tabela podsumowuje kluczowe hooki PrestaShop wykorzystane w przykładowym module GTM oraz ich rolę.

Nazwa Hooka Miejsce Wywołania Cel w Module GTM Uwagi
displayHeader Wewnątrz tagu <head> strony HTML Wstrzyknięcie głównego skryptu Google Tag Manager (zalecane umieszczenie jak najwyżej). Standardowy, powszechnie dostępny hook. Niezbędny dla GTM.
displayAfterBodyOpeningTag Bezpośrednio po otwierającym tagu <body> Wstrzyknięcie fragmentu <noscript> GTM, który zapewnia podstawowe śledzenie przy wyłączonym JavaScript. Dostępność tego hooka może zależeć od używanego motywu (szablonu) PrestaShop. Jeśli nie jest dostępny, kod <noscript> może nie zostać dodany lub wymagać modyfikacji szablonu.
actionAdminControllerSetMedia Podczas ładowania zasobów (CSS/JS) w panelu admina (Opcjonalnie) Dodanie niestandardowych stylów CSS lub skryptów JS dla strony konfiguracji modułu. Nie użyty w podstawowym przykładzie, ale przydatny przy bardziej zaawansowanych interfejsach konfiguracji.
actionObjectShopAddAfter / actionObjectShopDeleteAfter Po dodaniu / usunięciu sklepu w multistore (Opcjonalnie) Automatyczne dodanie / usunięcie domyślnej konfiguracji GTM dla nowo utworzonego / usuniętego sklepu. Poprawia zarządzanie konfiguracją w dynamicznym środowisku multistore.

Rozszerzenie Funkcjonalności: Warstwa Danych (DataLayer)

Podstawowy moduł dodaje tylko kod GTM. Aby w pełni wykorzystać potencjał analityki (zwłaszcza Google Analytics 4 eCommerce), potrzebujesz zaimplementować Warstwę Danych (DataLayer). Jest to obiekt JavaScript, który przechowuje dynamiczne informacje o interakcjach użytkownika (np. wyświetlenie produktu, dodanie do koszyka, dane transakcji) i udostępnia je GTM.

Jak Rozbudować Moduł o DataLayer?

  • Dodatkowe Hooki: Zarejestruj hooki wywoływane w kluczowych momentach (np. displayProductAdditionalInfo, displayShoppingCartFooter, displayOrderConfirmation).
  • Pobieranie Danych: W metodach obsługujących te hooki, pobierz odpowiednie dane (np. szczegóły produktu, zawartość koszyka, dane zamówienia) z kontekstu PrestaShop.
  • Formatowanie Danych: Sformatuj pobrane dane zgodnie ze schematem eCommerce Google Analytics 4.
  • Wstrzykiwanie do DataLayer: Wygeneruj kod JavaScript, który dataLayer.push() sformatowane dane przed załadowaniem GTM, lub użyj dedykowanych hooków do wstrzykiwania JS.

Implementacja DataLayer jest znacznie bardziej złożona niż dodanie samego kodu GTM i często jest głównym powodem, dla którego warto rozważyć zakup gotowego, zaawansowanego modułu GTM.


Często Zadawane Pytania (FAQ)

Dlaczego warto używać Google Tag Manager zamiast dodawać tagi bezpośrednio?

GTM upraszcza zarządzanie wieloma tagami marketingowymi i analitycznymi. Zamiast edytować kod strony dla każdego nowego tagu, dodajesz tylko kod GTM, a resztą zarządzasz przez interfejs webowy. To przyspiesza wdrażanie, zmniejsza ryzyko błędów w kodzie strony i daje większą elastyczność marketingowcom bez potrzeby angażowania programistów przy każdej zmianie.

Czy naprawdę potrzebuję obu fragmentów kodu GTM (<head> i <body>)?

Tak. Główny fragment kodu (w <head>) zawiera logikę ładowania GTM i tagów asynchronicznie. Fragment <noscript> (w <body>) działa jako zabezpieczenie – pozwala na podstawowe śledzenie (np. przez niektóre tagi Google) w przeglądarkach z wyłączoną obsługą JavaScript. Pominięcie fragmentu <noscript> może prowadzić do niekompletnych danych.

Jak skonfigurować osobne śledzenie GA4 dla każdego sklepu w multistore?

W Google Tag Manager możesz skonfigurować tag Google Analytics 4 (GA4 Configuration Tag) tak, aby dynamicznie używał innego identyfikatora pomiaru (Measurement ID) w zależności od domeny lub innego identyfikatora sklepu. Możesz stworzyć zmienną w GTM (np. typu Lookup Table lub Custom JavaScript), która na podstawie adresu URL strony (lub wartości z DataLayer, jeśli ją zaimplementowałeś) zwraca odpowiedni Measurement ID dla danego sklepu. Następnie użyj tej zmiennej w polu "Measurement ID" w tagu konfiguracyjnym GA4.

Co jeśli hook `displayAfterBodyOpeningTag` nie działa w moim szablonie?

Jeśli Twój szablon PrestaShop nie implementuje hooka displayAfterBodyOpeningTag, fragment <noscript> GTM nie zostanie automatycznie dodany przez moduł używający tego hooka. Masz kilka opcji:

  1. Modyfikacja szablonu: Ręcznie dodaj wywołanie hooka {hook h='displayAfterBodyOpeningTag'} w pliku szablonu (zwykle `themes/[nazwa_szablonu]/templates/layouts/layout-both-columns.tpl` lub podobnym) zaraz po otwierającym tagu <body>. Jest to rozwiązanie skuteczne, ale może zostać nadpisane podczas aktualizacji szablonu.
  2. Użycie innego hooka: Niektóre moduły próbują wstrzyknąć kod body używając hooka displayBeforeBodyClosingTag, co jest mniej idealne, ale może działać.
  3. Akceptacja braku noscript: Możesz zrezygnować z fragmentu <noscript>, ale stracisz możliwość śledzenia użytkowników z wyłączonym JS.
Najlepszym rozwiązaniem jest modyfikacja szablonu lub wybór szablonu/modułu, który poprawnie obsługuje ten hook.


Polecane Dalsze Zapytania

Referencje


Last updated May 5, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI