# DataFirefly All in One SEO: kompletna dokumentacja

> Kompletna dokumentacja modułu DataFirefly All in One SEO dla PrestaShop 8 i 9: instalacja, szablony meta, schematy JSON-LD, sitemapa XML, przekierowania, monitoring 404, robots.txt, tracking GA4/GTM, analizator treści.

- Strona: <https://www.datafirefly.com/pl/documentation/dfallinoneseo/>
- Język: pl
- Zaktualizowano: 2026-08-05
- Inne języki: [fr](https://www.datafirefly.com/documentation/dfallinoneseo/index.md), [en](https://www.datafirefly.com/en/documentation/dfallinoneseo/index.md), [es](https://www.datafirefly.com/es/documentation/dfallinoneseo/index.md), [de](https://www.datafirefly.com/de/documentation/dfallinoneseo/index.md), [it](https://www.datafirefly.com/it/documentation/dfallinoneseo/index.md), [pt](https://www.datafirefly.com/pt/documentation/dfallinoneseo/index.md), [nl](https://www.datafirefly.com/nl/documentation/dfallinoneseo/index.md)
- Indeks: <https://www.datafirefly.com/pl/documentation/llms.txt>

Premium pakiet SEO wszystko w jednym dla PrestaShop 8 i 9: szablony dynamicznych meta, kompletne schematy JSON-LD, wielojęzyczna sitemapa XML, przekierowania, monitoring 404, Open Graph i Twitter Cards, GA4 i GTM, inteligentny robots.txt z blokadą crawlerów AI oraz analizator treści, wszystko w jednym module.

## Wymagania

- **PrestaShop**: 8.0 do 9.x
- **PHP**: 8.1 lub nowsze (zalecane 8.2 i 8.3)
- **MySQL**: 5.7+ lub MariaDB 10.3+
- **Moduł productcomments** (oficjalny PrestaShop): opcjonalny, wymagany tylko dla AggregateRating na produktach
- **mod_rewrite** włączony na serwerze Apache (lub odpowiednik Nginx) dla przepisanych URL-i

Moduł jest natywnie świadomy kontekstu multisklepowego: wszystkie tabele są ograniczone przez `id_shop`. Możesz mieć całkowicie różne konfiguracje per sklep.

## Instalacja

1. Pobierz plik `dfallinoneseo-vX.Y.Z.zip` ze swojego konta klienta DataFirefly.
2. Zaloguj się do back-office PrestaShop.
3. Przejdź do **Moduły / Menedżer modułów**.
4. Kliknij **Zainstaluj moduł** w prawym górnym rogu.
5. Przeciągnij i upuść plik ZIP lub kliknij **Wybierz plik**.
6. Instalacja automatycznie tworzy 11 tabel SQL, rejestruje hooki i dodaje menu **Ulepszenia / DataFirefly SEO**.

Po instalacji otwórz **Pulpit** modułu, aby zobaczyć globalny score SEO i punkty do poprawy w pierwszej kolejności.

## Pierwsza konfiguracja w 10 minut

Ta szybka ścieżka pozwala skonfigurować najważniejsze elementy przed pierwszym crawlem Google.

1. **Ustawienia / Ogólne**: aktywuj moduł, wprowadź nazwę witryny i etykietę „Strona główna" dla okruszków.
2. **Meta i szablony**: zdefiniuj minimum szablon _Produkt_ i szablon _Kategoria_ (zobacz dedykowaną sekcję).
3. **Schema / Tożsamość organizacji**: wprowadź logo, telefon, e-mail, adres i adresy profili społecznościowych (`sameAs`).
4. **Sitemapa**: aktywuj sitemapę i kliknij **Regeneruj teraz**.
5. **Tracking**: dodaj swój GA4 Measurement ID i/lub GTM ID.
6. **Tracking / Weryfikacje**: wklej wartość weryfikacji Google Search Console.
7. **Robots.txt**: kliknij **Wczytaj domyślne (PS + blokada AI)**, aby zacząć od zdrowej bazy.

## Szablony meta

Moduł zastępuje ręczne wprowadzanie `meta_title` i `meta_description` dynamicznymi szablonami per typ encji. Przy zapisie karty z pustymi meta odpowiedni szablon jest stosowany automatycznie.

### Obsługiwane typy encji

- **Produkt**: karty produktów (wszystkie typy, w tym wirtualne i pakiety)
- **Kategoria**: strony kategorii
- **Strona CMS**: strony treści statycznych
- **Marka / Producent**: strony producenta
- **Dostawca**: strony dostawcy
- **Strona główna**: strona główna sklepu
- **Strony generyczne**: `/contact`, `/sitemap` itd.

### Dostępne tokeny

Tokeny są zastępowane rzeczywistymi wartościami podczas renderowania strony. Nie wszystkie tokeny są dostępne dla wszystkich typów encji.

- `{shop_name}`: nazwa sklepu
- `{sep}`: separator (domyślnie `|`)
- `{product_name}`: nazwa produktu (bieżący język)
- `{product_reference}`: referencja wewnętrzna
- `{product_sku}`: alias referencji
- `{product_ean13}`: kod kreskowy EAN13
- `{product_brand}`, `{brand}`: marka/producent
- `{category}`: kategoria domyślna (produkt) lub nazwa kategorii (strona kategorii)
- `{category_parent}`: nazwa kategorii nadrzędnej
- `{category_description}`: krótki opis (maks. 160 znaków)
- `{short_description}`: krótki opis produktu (maks. 160 znaków)
- `{price}`: cena brutto sformatowana z walutą
- `{price_tax_excl}`: cena netto sformatowana
- `{title}`: tytuł strony CMS
- `{summary}`: fragment treści CMS (maks. 160 znaków)

### Bloki warunkowe

Aby nie wyświetlać pustego tokenu, użyj składni warunkowej:

```
{?product_brand}{product_brand} | {/?}{product_name} - {shop_name}
```

Jeśli `product_brand` jest pusty (produkt bez marki), cały blok między `{?token}` a `{/?}` jest usuwany. W przeciwnym razie jego zawartość jest renderowana, a tokeny wewnątrz są zastępowane normalnie.

### Przykłady zalecanych szablonów

**Produkt**:

```
Title : {?product_brand}{product_brand} {/?}{product_name} - {category} | {shop_name}
Description : Odkryj {product_name}{?product_brand} od {product_brand}{/?}. {short_description} Szybka dostawa w {shop_name}.
```

**Kategoria**:

```
Title : {category} - {?category_parent}{category_parent} - {/?}{shop_name}
Description : Wszystkie produkty z kategorii {category} w {shop_name}. {category_description}
```

**Strona główna**:

```
Title : {shop_name} - Sklep internetowy
Description : Witamy w {shop_name}. Odkryj nasz katalog, szybka dostawa, bezpieczne płatności.
```

### Nadpisywanie per encja

Aby nadpisać konkretną kartę (na przykład produkt flagowy), kliknij ikonę **Nadpisanie meta** w menu **Edycja masowa** lub użyj adresu:

```
?controller=AdminDfSeoMeta&entity=product&entity_id=42
```

Strona nadpisania pozwala zdefiniować `meta_title`, `meta_description`, dyrektywę robots (na przykład `noindex,follow`) oraz własny canonical per język.

Dyrektywa robots zdefiniowana na konkretnej encji ma pierwszeństwo przed globalnymi ustawieniami indeksacji. Używaj jej oszczędnie, aby przypadkowo nie zdeindeksować najlepszych stron.

## Schematy JSON-LD

Moduł generuje pojedynczy blok `@graph` grupujący wszystkie schematy bieżącej strony, walidowany przez Google Rich Results Test.

### Schematy generowane automatycznie

- **Organization**: na wszystkich stronach, tożsamość firmy
- **WebSite**: na stronie głównej, z `SearchAction` aktywującym sitelinks search box
- **LocalBusiness**: jeśli wprowadzono adres fizyczny
- **BreadcrumbList**: okruszki nawigacyjne
- **Product**: na kartach produktów, z `offers`, `priceValidUntil`, `gtin13`/`isbn`/`mpn`
- **AggregateRating**: agregowana z oficjalnego modułu productcomments
- **Article**: na stronach CMS
- **FAQPage**: z bloków FAQ produktu lub strony

### Tożsamość organizacji

Zakładka **Schema / Tożsamość organizacji**. Pola do wypełnienia:

- **Typ**: Organization, Corporation, LocalBusiness, Store, OnlineStore, OnlineBusiness
- **Logo**: adres absolutny (zalecane minimum 600x60, proporcje kwadratowe lub poziome)
- **Telefon**, **E-mail**: używane w `contactPoint`
- **Adres pocztowy**: ulica, kod pocztowy, miasto, kraj (ISO-2)
- **sameAs**: jeden adres na linię (Facebook, Instagram, LinkedIn, Twitter/X itd.)

### Ważność ofert produktowych

Pole _Ważność ofert produktowych (dni)_ steruje wartością `priceValidUntil` w `Product.offers`. Domyślnie: 60 dni. Google wymaga tego pola, aby wyświetlić cenę w wynikach wzbogaconych.

### Schematy własne

Zakładka **Schema / Schematy własne**. Pozwala dodać bloki JSON-LD na miarę (HowTo, Recipe, Event, JobPosting, VideoObject, Course itd.) w określonym zakresie:

- **global**: wszystkie strony
- **home**: tylko strona główna
- **product**: wszystkie strony produktów
- **product_id**: konkretny produkt (używa pola ID)
- **category**, **category_id**: analogicznie dla kategorii
- **cms**, **cms_id**: analogicznie dla strony CMS

Zmienne dostępne we własnym JSON: `{shop_name}`, `{base_url}`, `{entity_id}`, `{entity_type}`.

Własny JSON-LD jest wstawiany bez zmian do `@graph`. Zwaliduj go narzędziem [Rich Results Test](https://search.google.com/test/rich-results) przed publikacją. Nieprawidłowy JSON jest odrzucany po cichu.

## Sitemapa XML

Moduł generuje sitemapę XML zgodną ze [specyfikacją sitemaps.org](https://www.sitemaps.org/protocol.html), z hreflang na każdym URL i obsługą obrazów. Architektura: jeden _sitemap index_ per sklep, następnie jedna sitemapa per typ encji x język, podzielona na chunki.

### Konfiguracja

Zakładka **Sitemapa**. Aktywuj sitemapę, a następnie zaznacz treści do uwzględnienia:

- Produkty (domyślnie wszystkie aktywne produkty)
- Kategorie
- Strony CMS
- Marki / Producenci
- Dostawcy
- Obrazy (dodaje `image:image` do każdego URL produktu)
- Wideo (jeśli obecne na kartach)

Opcje dodatkowe:

- **Wyklucz braki magazynowe**: usuwa produkty out-of-stock
- **Gzip**: generuje także warianty `.xml.gz` (zmniejsza 5 do 10 razy rozmiar pobierany przez crawlery)
- **Liczba URL-i na plik**: rozmiar chunka (zalecane 5000-10000, maks. 50000 wg specyfikacji XML)

### Regeneracja

Regeneracja jest ręczna z poziomu admina, aby uniknąć nieprzewidzianego obciążenia serwera. Kliknij **Regeneruj teraz**.

Aby zautomatyzować, zaplanuj crona wywołującego poniższy skrypt (co 6 lub 12 godzin, w zależności od częstotliwości aktualizacji katalogu):

```
0 */6 * * * php /var/www/html/index.php fc=module&module=dfallinoneseo&controller=sitemap&action=rebuild
```

### Zgłaszanie do wyszukiwarek

Kliknij **Pinguj wyszukiwarki**, aby powiadomić Google i Bing (endpointy legacy, ale nadal aktywne). Dla Google Search Console zgłoś adres sitemap index raz na zawsze w GSC / Sitemapy. GSC ponownie crawluje automatycznie przy każdej modyfikacji.

Adres sitemap index: `https://twoj-sklep.pl/sitemap.xml`

## Publiczna sitemapa HTML

Czytelna dla ludzi sitemapa HTML jest generowana automatycznie pod adresem `/plan-du-site`. Agreguje kategorie (drzewo), strony CMS, marki, dostawców i 200 ostatnich produktów. Przydatna dla linkowania wewnętrznego i dostępności.

## Przekierowania

Moduł obsługuje przekierowania HTTP 301 (trwałe), 302 (tymczasowe), 307, 308 i 410 (Gone) z trzema typami dopasowania.

### Typy dopasowania

- **Dokładne**: adres źródłowy musi zgadzać się dokładnie (bez query string)
- **Prefiks**: adres źródłowy jest prefiksem żądanego adresu. Sufiks jest zachowywany w adresie docelowym, jeśli zaznaczono _Zachowaj query string_. Przydatne do migracji całych katalogów (`/stary-katalog/` na `/nowy-katalog/`).
- **Regex**: wyrażenie regularne PHP (tryb `~...~i` wrażliwy/niewrażliwy na wielkość liter). Grupy przechwytujące są dostępne w adresie docelowym przez `$1`, `$2` itd.

### Tworzenie ręczne

Zakładka **Przekierowania / Nowe przekierowanie**. Pola:

- **Adres źródłowy**: ścieżka bez domeny (np. `/stara-strona`)
- **Adres docelowy**: ścieżka lub adres absolutny. Pozostaw puste dla kodu 410.
- **Typ dopasowania**, **Kod HTTP**, **Zachowaj query string**

### Import / eksport CSV

Oczekiwany format CSV (z nagłówkiem):

```
source,destination,type,code
/stary-produkt,/nowy-produkt,exact,301
/stary-katalog/,/nowy-katalog/,prefix,301
/old-(.*),/new-$1,regex,301
```

Eksport CSV obejmuje przekierowania aktualnie przefiltrowane na liście.

### Automatyczne przekierowanie przy zmianie sluga

Jeśli opcja **Ustawienia / Monitoring / Automatyczne 301 przy zmianie adresu** jest zaznaczona, moduł tworzy 301 automatycznie, gdy modyfikujesz slug produktu, kategorii, strony CMS, marki lub dostawcy. Pole `created_by` jest wtedy oznaczane jako `auto:urlchange` dla rozróżnienia.

Ta opcja eliminuje większość klasycznych błędów 404 związanych z przebudową treści. Aktywuj ją od razu po instalacji.

## Monitoring 404

Zakładka **Monitor 404**. Przechwytuje wszystkie adresy zwracające błąd 404 przez PrestaShop, z deduplikacją, liczeniem trafień, wykrywaniem botów i hashowaniem adresów IP (sól `COOKIE_KEY` PrestaShop dla zgodności z RODO).

### Dostępne filtry

- **Nierozwiązane**: adresy bez pokrywającego przekierowania (widok domyślny)
- **Rozwiązane**: adresy, dla których utworzono przekierowanie po fakcie
- **Boty**: trafienia z user-agentów zidentyfikowanych jako boty
- **Wszystkie**

### Tworzenie przekierowania jednym kliknięciem

W każdym wierszu przycisk **Przekieruj** otwiera formularz inline, który wstępnie wypełnia źródło. Wprowadź cel, wybierz kod HTTP, zatwierdź. Błąd 404 jest automatycznie oznaczany jako rozwiązany.

### Czyszczenie i utrzymanie

Menu **Ustawienia / Monitoring** udostępnia próg _Maksymalna liczba przechowywanych wpisów 404_ (domyślnie 5000). Powyżej tej wartości przycisk **Wyczyść stare 404** usuwa najstarsze nierozwiązane wpisy.

## Dynamiczny robots.txt

Moduł serwuje plik `/robots.txt` generowany dynamicznie przy każdym żądaniu, na podstawie reguł zdefiniowanych w **Robots.txt**.

### Presety PrestaShop i blokada AI

Przycisk **Wczytaj domyślne (PS + blokada AI)** nadpisuje wszystkie bieżące reguły i wczytuje zdrowy preset, który:

- Blokuje wrażliwe katalogi PrestaShop (`/admin*/`, `/cache/`, `/classes/` itd.)
- Blokuje strony techniczne (`/cart`, `/order`, `/my-account` itd.)
- Blokuje główne niegrzeczne crawlery AI: **GPTBot**, **ClaudeBot**, **CCBot**, **Google-Extended**, **anthropic-ai**
- Wskazuje sitemapę (`Sitemap: /sitemap.xml`)

### Reguły własne

Każda reguła ma user-agenta, dyrektywę (`Allow`, `Disallow`, `Crawl-delay`), wartość i pozycję (kolejność w pliku). Włącz lub wyłącz regułę bez usuwania jej przez przełącznik ON/OFF.

### Podgląd na żywo

Blok **Podgląd wygenerowanego pliku** na dole strony renderuje robots.txt dokładnie tak, jak będzie serwowany, przed publikacją.

## Natywny plik llms.txt

Moduł serwuje plik `/llms.txt` zgodny ze [specyfikacją llmstxt.org](https://llmstxt.org/). Plik wylistowuje w markdown główne sekcje witryny dla grzecznych crawlerów AI, które oczekują ustrukturyzowanego widoku zamiast scrapowania całego HTML.

Żadna konfiguracja nie jest wymagana: moduł generuje plik automatycznie z Twojego drzewa kategorii, stron CMS i marek.

## Open Graph i Twitter Cards

Zakładka **Social**. Moduł wstrzykuje znaczniki `og:*` i `twitter:*` na wszystkich stronach.

### Ustawienia

- **Aktywuj Open Graph i Twitter Cards**: przełącznik główny
- **Automatyczny og:locale**: obliczany z języka kontekstu (np. `pl_PL`)
- **Domyślny obraz OG**: adres absolutny obrazu 1200x630 (używany, gdy strona nie ma dedykowanego obrazu)
- **og:site_name**, domyślny **og:type**
- **Twitter @handle** i typ karty (`summary` lub `summary_large_image`)
- **fb:app_id**: Facebook App ID

Dla kart produktów moduł automatycznie używa głównego obrazu karty. Dla pozostałych stron używany jest domyślny obraz OG, jeśli nie zdefiniowano żadnego obrazu.

## Tracking: GA4, GTM, piksele

### GA4 i Enhanced Ecommerce

Pole **GA4 Measurement ID**: format `G-XXXXXXXXXX`. Automatyczna walidacja formatu.

Zaznacz **Enhanced Ecommerce**, aby aktywować zdarzenia `view_item`, `view_item_list`, `add_to_cart`, `remove_from_cart`, `begin_checkout`, `add_payment_info`, `purchase`.

Zaznacz **Respektuj Consent Mode v2**, aby anonimizować trafienia do momentu wyraźnej zgody (zgodne ze standardowymi CMP).

### Google Tag Manager

Pole **GTM ID**: format `GTM-XXXXXXX`. Moduł wstrzykuje snippet GTM w sekcji head oraz fallback `noscript` tuż po otwarciu body.

### Piksele reklamowe

- **Facebook Pixel ID**: 15 cyfr
- **TikTok Pixel ID**: alfanumeryczny

Jeśli Consent Mode v2 jest aktywny, te piksele uruchamiają się dopiero po zgodzie.

### Weryfikacje własności

Wklej wartości znaczników weryfikacyjnych (bez pełnego znacznika meta, wyłącznie zawartość atrybutu `content`):

- Google Search Console
- Bing Webmaster Tools
- Yandex Webmaster
- Pinterest
- Baidu

### Kod własny w head i na końcu body

Dwa dowolne pola przyjmują arbitralny HTML/JS:

- **Kod wstrzykiwany w head**: dla skryptów zewnętrznych, dodatkowych meta
- **Kod wstrzykiwany tuż przed zamknięciem body**: idealny dla widżetów czatu, późnego retargetingu, skryptów asynchronicznych

Te pola nie przeprowadzają żadnej walidacji. Błąd składni HTML może zepsuć renderowanie strony. Przetestuj na preprodukcji przed publikacją.

## Analizator treści

Zakładka **Analizator**. Prześlij produkt, kategorię, stronę CMS lub surowy HTML do analizatora, aby otrzymać globalny score SEO i szczegół metryk.

### Obliczane metryki

- **Globalny score SEO** (0-100): ważona punktacja kontroli
- **Czytelność Flescha**: przybliżenie wielojęzyczne (zliczanie sylab przez grupy samogłosek)
- **Liczba słów**, **liczba zdań**
- **Gęstość głównego słowa kluczowego** (w %)
- **Linki wewnętrzne / zewnętrzne / nofollow**
- **Obrazy bez atrybutu alt**
- **Struktura nagłówków H1 do H6**
- Obecność słowa kluczowego w **slugu** i **pierwszym akapicie**

### Kontrole (checks)

Analizator zwraca listę kontroli ze statusem `good` / `warn` / `bad`:

- Długość title (50-60 znaków)
- Długość meta description (140-160 znaków)
- Obecność i długość sluga
- Długość treści (minimum 300 słów)
- Obecność co najmniej jednego obrazu z alt
- Słowo kluczowe w title, w pierwszym akapicie, w slugu
- Gęstość słowa kluczowego między 0,5 % a 2,5 %
- Co najmniej jeden H1 i kilka H2/H3

Analizator jest przewodnikiem, nie prawdą absolutną. Score 80+ jest doskonały. Poniżej 50 przejrzyj strukturę i sformułowania. Nigdy nie poświęcaj jakości redakcyjnej dla score'u.

## Edycja masowa

Zakładka **Edycja masowa**. Stronicowana siatka (30 wpisów na stronę) z filtrami do szybkiej modyfikacji `meta_title`, `meta_description` i `link_rewrite` na produktach, kategoriach lub stronach CMS.

### Dostępne filtry

- **Wszystkie**
- **Bez title**: wyłącznie wpisy z pustym meta_title
- **Bez description**: wyłącznie wpisy z pustym meta_description
- **Wyszukiwanie po nazwie**

### Masowe stosowanie szablonów

Przycisk **Zastosuj szablony** automatycznie stosuje szablon zdefiniowany dla bieżącego typu encji do kart odpowiadających filtrom. Zaznacz **Stosuj wyłącznie do pustych pól**, aby nie nadpisywać już wprowadzonych meta.

## Metabox SEO na karcie produktu

Na stronie edycji produktu w back-office dodawany jest panel **DataFirefly SEO** zawierający:

- **Score SEO na żywo** (7 kontroli: długość title, description, slug, treść, obraz, EAN13, marka)
- **Wierny podgląd SERP Google**
- Wykryte główne słowo kluczowe

## Ustawienia zaawansowane

### Indeksacja

Zakładka **Ustawienia / Indeksacja**:

- **Wielojęzyczny hreflang**: generuje znaczniki `link rel="alternate"` na wszystkich stronach
- **Strategia x-default**: _Język domyślny_ (zalecane), _Angielski_ lub _Wyłączone_
- **Adres canonical**: wstrzykuje `link rel="canonical"`
- **Canonical na paginacjach**: _Na bieżącej stronie_ (zalecane), _Zawsze na stronie 1_ lub _Bez canonical_
- **Automatyczne noindex**: strony /search, koszyk, moje konto, nowości, bestsellery, promocje, fasety
- **Canonical do strony-matki na fasetach**: eliminuje duplicate content nawigacji fasetowej

### Obrazy

- **Automatyczne generowanie atrybutów alt**: przy zapisie obrazu bez alt stosuje szablon
- **Szablon alt**: domyślnie `{product_name} - {shop_name}`
- **Natywny lazyload obrazów**: dodaje `loading="lazy"` i `decoding="async"` do wszystkich obrazów, z fallbackiem IntersectionObserver dla obrazów `data-src`

### Utrzymanie

- **Wyczyść cache**: czyści cache Smarty i cache PrestaShop
- **Wyczyść stare 404**: stosuje skonfigurowany próg
- **Eksportuj wszystkie dane (JSON)**: pobiera plik JSON ze wszystkimi tabelami SEO bieżącego sklepu (przydatne przy migracji między środowiskami lub backupie przed deinstalacją)

## Multisklep

Wszystkie funkcje są ograniczone przez `id_shop`. Przełączając się między sklepami przez selektor kontekstu PrestaShop, widzisz i modyfikujesz wyłącznie dane danego sklepu.

Przypadki szczególne, o których warto wiedzieć:

- **Szablony**: jeden szablon na parę (typ encji, sklep). Zdefiniuj szablony jawnie dla każdego sklepu.
- **Sitemapa**: osobny sitemap_index per sklep, dostępny pod `https://sklep-1.pl/sitemap.xml`, `https://sklep-2.pl/sitemap.xml` itd.
- **Robots.txt**: reguły per sklep, serwowane na odpowiedniej domenie
- **Przekierowania**: per sklep
- **Schematy własne**: per sklep

## Rozwiązywanie problemów

### Sitemapa się nie generuje

- Sprawdź, czy katalog `modules/dfallinoneseo/sitemaps/` jest zapisywalny przez PHP
- Sprawdź uprawnienia: `chmod 755 modules/dfallinoneseo/sitemaps/`
- Zwiększ `max_execution_time` w php.ini, jeśli masz ponad 50 000 produktów

### Schematy JSON-LD się nie pojawiają

- Sprawdź, czy moduł jest aktywny (**Ustawienia / Ogólne**)
- Sprawdź, czy dany typ schematu jest aktywny (**Schema / Typy generowanych schematów**)
- Wyczyść cache PrestaShop
- Sprawdź źródło HTML: schematy są wstrzykiwane w bloku `script type="application/ld+json"`

### Przekierowania 301 nie działają

- Sprawdź, czy moduł jest zainstalowany i aktywny
- Sprawdź, czy przekierowania są oznaczone jako **aktywne** (przełącznik ON)
- Dla regex przetestuj wyrażenie na [regex101.com](https://regex101.com/) w trybie PCRE
- Kolejność priorytetów to: dokładne, prefiks, regex (wg malejącego `hit_count`)

### GA4 / GTM się nie wstrzykuje

- Sprawdź format ID (`G-XXXXXXX` lub `GTM-XXXXXXX`)
- Jeśli Consent Mode v2 jest aktywny, snippet jest domyślnie w trybie „denied" do momentu zgody. Sprawdź warstwę CMP.
- Sprawdź sekcję head strony: snippet GA4/GTM jest wstrzykiwany tuż przed jej zamknięciem

### Robots.txt się nie zmienia

- Sprawdź, czy w katalogu głównym witryny nie istnieje statyczny plik `robots.txt` (miałby pierwszeństwo przed modułem). Usuń go.
- Moduł serwuje robots.txt przez trasę PrestaShop: sprawdź, czy _przepisane adresy URL_ są włączone

### Błąd przy tworzeniu tabel SQL podczas instalacji

- Sprawdź, czy użytkownik MySQL ma uprawnienia `CREATE` i `ALTER`
- Sprawdź kodowanie: MySQL musi obsługiwać `utf8mb4` z kolacją `utf8mb4_unicode_ci`
- Jeśli własny prefiks tabel PrestaShop przekracza 5 znaków, niektóre nazwy indeksów mogą przekroczyć limit MySQL 64 znaków. Skontaktuj się ze wsparciem.

## Referencja techniczna

### Używane hooki

Moduł rejestruje 18 hooków:

- `displayHeader`: wstrzykiwanie znaczników meta, canonical, hreflang, OG, Twitter, JSON-LD, GA4/GTM, weryfikacji
- `displayBeforeBodyClosingTag`: wstrzykiwanie GTM noscript, FB Pixel noscript, własnego kodu na końcu body
- `displayBackOfficeHeader`: CSS/JS back-office
- `displayAdminProductsExtra`: metabox SEO na karcie produktu
- `actionDispatcherBefore`, `actionDispatcherAfter`: routing przekierowań i przechwytywanie 404
- `actionObjectProductAddAfter`, `actionObjectProductUpdateAfter`: automatyczne wypełnianie meta i automatyczne 301
- `actionObjectCategoryAddAfter`, `actionObjectCategoryUpdateAfter`: analogicznie dla kategorii
- `actionObjectCmsAddAfter`, `actionObjectCmsUpdateAfter`: analogicznie dla CMS
- `actionObjectManufacturerUpdateAfter`, `actionObjectSupplierUpdateAfter`: automatyczne 301 przy zmianie sluga
- `actionAdminControllerSetMedia`, `actionFrontControllerSetMedia`: zasoby CSS/JS
- `displayProductExtraContent`: zarezerwowany na przyszłe zastosowania
- `moduleRoutes`: trasy `/sitemap.xml`, `/plan-du-site`, `/robots.txt`, `/llms.txt`

### Dodane tabele SQL

Wszystkie tabele używają prefiksu `df_seo_`, charsetu `utf8mb4` i kolacji `utf8mb4_unicode_ci`:

- `df_seo_meta`, `df_seo_meta_lang`: nadpisania meta per encja
- `df_seo_template`, `df_seo_template_lang`: szablony per typ
- `df_seo_redirect`: przekierowania 301/302/307/308/410
- `df_seo_404`: dziennik błędów 404
- `df_seo_score`: migawki score (analizator)
- `df_seo_keyword`: focus keywords
- `df_seo_robots_rule`: reguły robots.txt
- `df_seo_schema_custom`: własne schematy JSON-LD
- `df_seo_log`: wewnętrzny log diagnostyczny

### Deinstalacja

Deinstalacja usuwa hooki i zakładki back-office, ale **zachowuje tabele SQL i dane**. Aby wyczyścić całkowicie:

```
DROP TABLE ps_df_seo_meta, ps_df_seo_meta_lang, ps_df_seo_template, ps_df_seo_template_lang,
           ps_df_seo_redirect, ps_df_seo_404, ps_df_seo_score, ps_df_seo_keyword,
           ps_df_seo_robots_rule, ps_df_seo_schema_custom, ps_df_seo_log;
DELETE FROM ps_configuration WHERE name LIKE 'DFSEO_%';
```

Przed deinstalacją użyj **Ustawienia / Utrzymanie / Eksportuj wszystkie dane (JSON)**, aby zachować kompletne archiwum. Format JSON pozwala ponownie zaimportować przekierowania, szablony i schematy na innej instalacji.

## Aktualizacje i wsparcie

- **Aktualizacje**: 12 miesięcy w cenie od zakupu. Opcjonalne odnowienie roczne za 49 euro.
- **Wsparcie**: 12 miesięcy przez e-mail, odpowiedź do 48h roboczych.
- **Changelog** i pobieranie najnowszych wersji na [Twoim koncie klienta DataFirefly](https://www.datafirefly.com/pl/produkt/dfallinoneseo/).
