# SEO PrestaShop — diagnostyka indeksacji, canonicali i URL-i

> Wykonaj odczyt HTTP i HTML bez zmieniania sklepu. Sprawdź canonical, noindex, przekierowania i linki paginacji, rozpoznaj źródło problemu i przygotuj test poprawki. Procedura z kodem oraz jawnie oznaczonym testem syntetycznym.

Autor: WebAlpha (WebAlpha). Opublikowano: 2026-06-05. Zaktualizowano: 2026-09-07. Kanoniczny adres: https://webalpha.pl/blog/seo-prestashop-poradnik

Około 21 min czytania (szacunek; bez czasu wykonania instrukcji).

SEO PrestaShop zacznij od ustalenia, czy Google może pobrać właściwe strony, jaki canonical otrzymuje i czy produkty da się odkryć przez linki. Poniżej wykonasz odczyt HTTP i HTML jednej kategorii, rozpoznasz błędne wskazanie strony 2 i przygotujesz odbiór poprawki. Dalej znajdziesz decyzje dla filtrów, wariantów, treści i pomiaru. Odczyt nie zmienia konfiguracji sklepu; poprawka w motywie lub module jest osobnym etapem na kopii.

> **Co zostało sprawdzone, a czego ten poradnik nie udaje:** Źródła zweryfikowano 7 września 2026. Polecenie HTTP i parser HTML sprawdzono na kontrolowanych odpowiedziach syntetycznych, nie na uruchomionej instalacji PrestaShop. Wynik tego testu pokazujemy w odpowiedniej sekcji. Nie deklarujemy naprawy sklepu klienta, testu jego motywu ani wzrostu pozycji. Do odczytu potrzebujesz terminala z curl i Pythonem 3; administracyjny dostęp do kopii sklepu jest potrzebny dopiero do lokalizacji oraz wdrożenia poprawki.

<a id="sekcja-od-czego-zaczac-seo-prestashop-krotka-checklista"></a>

## Od czego zacząć SEO PrestaShop — krótka checklista

1. Wybierz kategorię lub produkt ważny dla sprzedaży. Zapisz w GSC jego kliknięcia, wyświetlenia, zapytania i średnie pozycje w pełnym okresie porównawczym.
2. Sprawdź odpowiedź HTTP, możliwość indeksacji oraz canonical zadeklarowany przez sklep i wybrany przez Google. To różne informacje.
3. Przejdź od kategorii do produktu przez zwykłe linki. Sprawdź także stronę 2 listingu, filtr oraz wariant produktu.
4. Porównaj intencję zapytań z zawartością strony: wybór asortymentu, zakup konkretnego modelu czy instrukcja rozwiązania problemu.
5. Zaplanuj jedną grupę poprawek, test na kopii sklepu i odbiór po wdrożeniu. Zapisz datę zmiany, żeby później oddzielić obserwację od domysłu.

> **Nie musisz czekać z SEO do aktualizacji platformy:** Błędny noindex lub niedostępny produkt warto naprawić również w sklepie na PrestaShop 1.7. Plan aktualizacji, bezpieczeństwo i zgodność PHP, modułów oraz motywu oceniaj osobno. Przejście na nowszą wersję samo w sobie nie gwarantuje wzrostu widoczności. Przykłady ustawień panelu poniżej odnoszą się do dokumentacji PrestaShop 8; nazwy i zachowanie sprawdź w swojej wersji.

<a id="sekcja-najpierw-diagnoza-indeksacja-tresc-czy-klikniecia"></a>

## Najpierw diagnoza: indeksacja, treść czy kliknięcia?

**Punkt startowy zależy od objawu, nie od liczby produktów w sklepie**

| Objaw | Co sprawdzić | Dowód do zadania |
| --- | --- | --- |
| Ważna kategoria zniknęła z wyników | Inspekcja URL, status HTTP, noindex, wybrany canonical, ostatnie wdrożenia | Konkretny URL, data zmiany stanu i odpowiedź serwera |
| Nowe produkty nie są odkrywane | Linki z listingu, paginacja, sitemap, logi dostępu Googlebota | Droga dojścia do produktu i ostatni potwierdzony crawl |
| Są wyświetlenia, ale mało kliknięć | Zapytania, intencja wyniku, pozycja, urządzenie, tytuł i oferta konkurencyjnych wyników | Porównywalna grupa query→URL, nie sam średni CTR domeny |
| Ruch nie przekłada się na zamówienia | Dostępność oferty, koszt dostawy, ścieżka zakupu i poprawność pomiaru | Zdarzenia zakupowe oraz zamówienia, nie tylko kliknięcie przycisku |

Do roboczej próby weź ważną kategorię, produkt dostępny, produkt niedostępny, filtr, stronę paginacji i wariant. Jeżeli sklep ma kilka języków lub motywów, dodaj przedstawiciela każdej konfiguracji. To początek diagnozy, nie dowód przebadania całego katalogu. Crawl rozszerzaj według wykrytych problemów i skali adresów.

<a id="sekcja-krok-1-pobierz-http-i-html-kategorii-bez-zmiany-sklepu"></a>

## Krok 1. Pobierz HTTP i HTML kategorii bez zmiany sklepu

Wybierz rzeczywisty publiczny URL strony 2, skopiowany z linku paginacji Twojego sklepu. Nie zgaduj parametru, jeżeli motyw używa innej składni. Zastąp przykładowy adres sklep.example w poleceniu. Uruchom je w terminalu na własnym komputerze, nie w konsoli SQL ani edytorze motywu. Odczyt wykonuje GET bez logowania, nie dodaje produktów i nie zmienia ustawień. Nie podawaj URL-i zamówień, panelu ani adresów z tokenami.

curl: zapis nagłówków całego łańcucha oraz końcowego HTML do nowego prywatnego katalogu

```bash
# Terminal na Twoim komputerze. Podstaw publiczny URL własnej strony.
seo_audit_url='https://sklep.example/buty?page=2'
umask 077
seo_audit_dir="$(mktemp -d)" || { printf 'Przerwano: nie można utworzyć prywatnego katalogu.\n' >&2; exit 1; }
[ -n "$seo_audit_dir" ] && [ -d "$seo_audit_dir" ] || { printf 'Przerwano: nieprawidłowy katalog diagnostyczny.\n' >&2; exit 1; }

curl --silent --show-error --location --max-redirs 5 \
  --connect-timeout 10 --max-time 30 --compressed \
  --proto '=https' --proto-redir '=https' \
  --dump-header "$seo_audit_dir/headers.txt" \
  --output "$seo_audit_dir/page.html" \
  --write-out 'status=%{http_code}\nurl=%{url_effective}\nredirects=%{num_redirects}\n' \
  "$seo_audit_url" || { printf 'Przerwano: błąd pobrania HTTP.\n' >&2; exit 1; }

# Kolejne bloki dotyczą kolejnych odpowiedzi w łańcuchu przekierowań.
sed -n '1,180p' "$seo_audit_dir/headers.txt"
printf 'Pliki diagnostyczne: %s\n' "$seo_audit_dir"
```

Oczekiwany wynik dla dostępnej strony 2 to status=200 i końcowy URL tej strony. redirects=0 oznacza brak przekierowań; inny wynik wymaga obejrzenia każdego Location. Plik headers.txt zawiera odpowiedzi pośrednie, a page.html — dokument końcowy. Nie ustawiliśmy opcji ukrywającej treść błędu HTTP: 404 lub 500 może zostać zapisane mimo poprawnego zakończenia transferu. Sprawdzaj więc status, a nie tylko brak komunikatu curl. Przy błędzie DNS, TLS, timeout lub przekroczeniu limitu przekierowań zatrzymaj analizę niepełnego pliku.

Z końcowej odpowiedzi zanotuj Content-Type, X-Robots-Tag i ewentualny nagłówek Link z rel=canonical. Status 200 z ekranem logowania lub ochrony antybotowej nie jest HTML-em kategorii. Nie wyłączaj zabezpieczeń sklepu globalnie, aby uzyskać odczyt; uzgodnij z administratorem bezpieczny dostęp diagnostyczny. Polecenie celowo nie pozwala przejść z HTTPS do HTTP.

Parametry location, dump-header, output, write-out oraz ograniczenia protokołu opisuje [oficjalna instrukcja curl](https://curl.se/docs/manpage.html). Odpowiedź może zawierać Set-Cookie i identyfikatory — katalog jest prywatny, ale przed przekazaniem plików usuń dane sesji oraz inne informacje poufne. Odczyt curl nie potwierdza dostępu prawdziwego Googlebota.

<a id="sekcja-krok-2-odczytaj-canonical-robots-i-linki-z-zapisanego-html"></a>

## Krok 2. Odczytaj canonical, robots i linki z zapisanego HTML

Uruchom poniższy parser w tej samej sesji terminala. Korzysta z biblioteki standardowej Pythona, nie instaluje paczek i nie wykonuje JavaScriptu ze strony. Wydobywa deklaracje canonical i robots z head, tytuł, H1 oraz linki zawierające parametr page. Nie przepisuje HTML ani nie wysyła go do usługi zewnętrznej.

Parser diagnostyczny dla HTML UTF-8 — zapisany dokument, bez renderowania JavaScriptu

```bash
# Ta sama sesja terminala, po udanym pobraniu page.html.
python3 - "$seo_audit_dir/page.html" <<'PY'
import json
import sys
from html.parser import HTMLParser
from pathlib import Path
from urllib.parse import parse_qs, urlsplit

class Signals(HTMLParser):
    def __init__(self):
        super().__init__(convert_charrefs=True)
        self.in_head = False
        self.in_title = False
        self.in_h1 = False
        self.title = []
        self.canonical = []
        self.base = []
        self.robots = []
        self.h1 = []
        self.pagination = []

    def handle_starttag(self, tag, attrs):
        attrs = dict(attrs)
        if tag == 'head':
            self.in_head = True
        if tag == 'title' and self.in_head:
            self.in_title = True
        if tag == 'h1':
            self.in_h1 = True
            self.h1.append('')
        if self.in_head and tag == 'base':
            self.base.append(attrs.get('href'))
        if self.in_head and tag == 'link':
            if 'canonical' in (attrs.get('rel') or '').lower().split():
                self.canonical.append(attrs.get('href'))
        if self.in_head and tag == 'meta':
            name = (attrs.get('name') or '').lower()
            if name in ('robots', 'googlebot'):
                self.robots.append({'name': name, 'content': attrs.get('content')})
        if tag == 'a' and attrs.get('href'):
            href = attrs['href']
            try:
                if 'page' in parse_qs(urlsplit(href).query):
                    self.pagination.append(href)
            except ValueError:
                pass

    def handle_endtag(self, tag):
        if tag == 'head':
            self.in_head = False
        if tag == 'title':
            self.in_title = False
        if tag == 'h1':
            self.in_h1 = False

    def handle_data(self, data):
        if self.in_title:
            self.title.append(data)
        if self.in_h1:
            self.h1[-1] += data

parser = Signals()
parser.feed(Path(sys.argv[1]).read_text(encoding='utf-8'))
parser.close()
print(json.dumps({
    'title': ' '.join(''.join(parser.title).split()),
    'canonical_w_head': parser.canonical,
    'base_href': parser.base,
    'robots_w_head': parser.robots,
    'h1': [' '.join(text.split()) for text in parser.h1],
    'linki_z_parametrem_page': list(dict.fromkeys(parser.pagination)),
}, ensure_ascii=False, indent=2))
PY
```

**Jak zamienić wynik na decyzję**

| Wynik | Znaczenie | Następny krok |
| --- | --- | --- |
| canonical_w_head ma jeden adres strony 2 | Deklaracja zgadza się z odrębną stroną listingu | Sprawdź nagłówek Link, treść, linki i wybór Google w GSC |
| canonical_w_head wskazuje stronę 1 | Potencjalnie błędne scalenie innych produktów | Porównaj zawartość obu stron i ustal generator canonicala |
| Dwa adresy canonical | Więcej niż jedno źródło deklaracji | Znajdź motyw/moduł dodający drugi tag; nie dodawaj trzeciego |
| robots zawiera noindex lub none | Żądany dokument ma regułę wykluczającą indeksację | Ustal, czy to świadoma decyzja; sprawdź też X-Robots-Tag |
| Puste robots | Brak tych dwóch nazw meta w odczytanym head | To nie dowód indeksowalności: sprawdź nagłówki, robots.txt i GSC |
| Puste linki_z_parametrem_page | Nie znaleziono linków w tej składni | Sprawdź inną składnię URL i wyrenderowany DOM; nie orzekaj automatycznie braku paginacji |
| base_href nie jest puste | Adresy względne mogą być rozwiązywane względem innej bazy | Porównaj pełne adresy w DOM; do canonicala preferuj URL bezwzględny |

> **Parser nie jest Googlebotem ani pełnym audytem HTML:** To mały odczyt sygnałów, nie walidator indeksowalności. Nie wykonuje JavaScriptu, nie interpretuje robots.txt, nie ocenia treści produktów ani wybranego canonicala Google. Parser HTMLParser nie naprawia błędnego dokumentu tak jak silnik przeglądarki. Przy nieprawidłowym zagnieżdżeniu lub tagach dodawanych przez JS porównaj źródło z DOM oraz przetestowaną stroną w inspekcji GSC. Skrypt zakłada UTF-8; przy innym kodowaniu najpierw ustal je z odpowiedzi.

<a id="sekcja-krok-3-przyklad-bledu-canonicala-strony-2-i-jego-odbioru"></a>

## Krok 3. Przykład błędu canonicala strony 2 i jego odbioru

Poniższy fragment jest syntetycznym przypadkiem dydaktycznym: strona /buty?page=2 ma inne produkty niż /buty, ale deklaruje adres pierwszej strony. Nie jest to zrzut z PrestaShop ani błąd potwierdzony w Twoim sklepie. Taki przypadek pozwala sprawdzić, czy odczyt rozróżnia zmianę canonicala od samego statusu 200.

Przed poprawką: nieprawidłowy canonical w kontrolowanym przykładzie

```html
<head>
  <title>Buty — strona 2</title>
  <link rel="canonical" href="https://sklep.example/buty">
  <meta name="robots" content="index,follow">
</head>
<body>
  <h1>Buty</h1>
  <a href="/buty?page=1">Poprzednia strona</a>
  <a href="/buty?page=3">Następna strona</a>
</body>
```

Po poprawce: oczekiwany pojedynczy tag w head strony 2

```html
<link rel="canonical" href="https://sklep.example/buty?page=2">
```

W kontrolowanym teście parser zwrócił przed zmianą canonical_w_head = [https://sklep.example/buty], a po zmianie = [https://sklep.example/buty?page=2]. Status pozostał 200. Dodatkowa próba wykryła dwa tagi canonical, a odpowiedź przekierowująca pozwoliła odczytać końcowy HTML. To potwierdzenie działania narzędzia diagnostycznego na fixture, nie wykonania poprawki w instalacji PrestaShop ani jej efektu rankingowego.

Google zaleca własny canonical dla każdej strony sekwencji, nie kierowanie całej paginacji do pierwszej: [paginacja w e-commerce](https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading). Poprawne umiejscowienie w head, spójne adresy i relację z innymi sygnałami opisują [zasady canonical Google](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls). Nie wklejaj powyższego stałego URL-a do globalnego szablonu: wszystkie kategorie otrzymałyby wtedy ten sam błędny adres.

<a id="sekcja-krok-4-znajdz-zrodlo-bledu-w-motywie-lub-module"></a>

## Krok 4. Znajdź źródło błędu w motywie lub module

Dalsza część wymaga kopii sklepu, dostępu do kodu i umiejętności odczytu Smarty/PHP. Zapisz dokładne wydania PrestaShop, motywu rodzica/potomnego i modułów SEO. Zachowaj wersję konfiguracji oraz plików sprzed zmiany. Nie naprawiaj problemu przez dopisanie drugiego canonicala, globalny noindex lub regenerację całego robots.txt.

Odczyt plików kopii sklepu; uruchom z jej katalogu głównego, jeśli masz narzędzie rg

```bash
rg -n --glob '*.tpl' --glob '*.php' \
  'page\.canonical|rel=["\x27]canonical|canonical_url' \
  themes modules override controllers classes
```

1. Znajdź w wyniku blok generujący tag head aktywnego motywu i ewentualne nadpisanie motywu potomnego. Wyszukanie jest tylko początkiem: dynamiczna składnia może nie pasować do wzorca, a kod nieużywanego motywu nie musi mieć wpływu na odpowiedź.
2. Sprawdź, skąd pochodzi wartość w tagu. Dokumentacja Smarty PrestaShop 8 opisuje zmienną page.canonical, ale konkretny motyw lub moduł może ją zastąpić. Jeśli źródło wartości jest nieprawidłowe, sama zamiana tagu HTML nie naprawi generatora.
3. Jeżeli drugi tag dodaje moduł, porównaj ustawienia i jego dokumentację. Testuj jedną zmianę na kopii, bez deinstalowania w ciemno: deinstalacja może usuwać dane. Jeśli problem leży w kodzie, popraw generator zgodnie z wersją, zamiast budować canonical z dowolnych parametrów bieżącego żądania.
4. Po zmianie wyczyść właściwy cache poprzez mechanizm wspierany w danej wersji. Sprawdź ponownie anonimowy GET, HTML i nagłówki. Nie usuwaj rekurencyjnie przypadkowych katalogów ani nie restartuj produkcji jako metody szukania przyczyny.
5. Powtórz próbę dla kategorii 1 i 2, produktu, wariantu, filtra, języka i nieistniejącego numeru strony. Na kopii sprawdź nawigację, dodanie do koszyka i ceny. Dopiero komplet zgodnych wyników uzasadnia zaplanowanie produkcyjnego wdrożenia.

Punkt odniesienia dla warstwy szablonu: [zmienne globalne szablonów PrestaShop 8](https://devdocs.prestashop-project.org/8/themes/reference/templates/variables/). Mechanizmy konkretnego motywu trzeba zweryfikować lokalnie. Nie podajemy uniwersalnego patcha PHP/Smarty, którego nie uruchomiono na dokładnej wersji sklepu.

<a id="sekcja-krok-5-odbierz-poprawke-i-oddziel-ja-od-wyniku-w-google"></a>

## Krok 5. Odbierz poprawkę i oddziel ją od wyniku w Google

**Minimalny protokół odbioru dla przykładu paginacji**

| Próba | Warunek techniczny | Jeśli nie przechodzi |
| --- | --- | --- |
| Kategoria 1 oraz 2 | Każda zwraca właściwy fragment produktów i swój uzgodniony canonical | Zatrzymaj wdrożenie; ustal, czy generator zachowuje numer strony |
| Linki paginacji | Linki a[href] prowadzą do dostępnych adresów, nie samych fragmentów # | Napraw nawigację, nie tylko meta tagi |
| Produkt, wariant i język | Adres, cena i zawartość są zgodne z ustaloną architekturą | Cofnij zmianę powodującą regresję i wróć do kopii |
| Filtr i błędna strona | Polityka indeksacji filtra jest zachowana; nieistniejąca strona nie udaje 200 | Rozdziel reguły paginacji od filtrów i obsługi błędów |
| Produkcja po wdrożeniu | Te same testy HTTP/HTML przechodzą w rzeczywistym środowisku | Uruchom uzgodniony rollback, następnie powtórz odczyty |
| Inspekcja GSC po kolejnym crawlu | Sprawdzone daty pobrania i zadeklarowany oraz wybrany canonical | Nie uznawaj starego odczytu Google za rezultat nowej poprawki |

Do zadania zapisz URL, datę, stan przed/po, plik lub ustawienie będące przyczyną, testy i sposób wycofania. Przy zmianie samych szablonów zachowaj poprzednie wydanie i konfigurację; jeśli modyfikacja dotyka bazy, wymaga też spójnej kopii i planu dla nowych zamówień. Nie cofaj całej bazy produkcji tylko po to, żeby cofnąć tag canonical. Sukces techniczny kończy ten test; indeksację i kliknięcia ocenisz później w finalnych danych GSC.

<a id="sekcja-przyjazne-url-e-czy-trzeba-usuwac-id-z-prestashop"></a>

## Przyjazne URL-e: czy trzeba usuwać ID z PrestaShop?

Nie traktuj liczbowego ID jako błędu SEO. Adres /buty/123-buty-trekkingowe.html może być czytelny i stabilny. Dokumentacja PrestaShop 8 opisuje przyjazne adresy zachowujące identyfikatory; ich usunięcie nie jest domyślną opcją. Nie przebudowuj działających URL-i wyłącznie po to, by usunąć numer lub końcówkę .html.

- W PrestaShop 8 sprawdź Shop Parameters → Traffic & SEO → SEO & URLs. Pola produktu znajdują się w jego edycji. Tłumaczenie menu i układ mogą różnić się między wydaniami.
- Przed włączeniem przyjaznych adresów potwierdź obsługę przepisywania URL przez serwer. .htaccess dotyczy konfiguracji zgodnych z Apache; nie zastępuje reguł Nginx.
- Jeśli zmiana adresu jest uzasadniona, przygotuj mapę stary→nowy, stałe przekierowanie do odpowiednika i aktualizację linków, canonicali oraz sitemapy. Testuj produkt z wariantami i kilka języków.
- Przykład odbioru: stary /123-model-a.html przekierowuje bezpośrednio do /123-model-b.html, który odpowiada 200. Sprawdź też link w kategorii i URL w feedzie — nie tylko stronę po ręcznym otwarciu.

Podstawa konfiguracji: [PrestaShop 8 — SEO and URLs](https://docs.prestashop-project.org/v.8-documentation/user-guide/configuring-shop/shop-parameters/traffic/seo-and-urls). Zasady spójnego użycia adresów: [Google — struktura URL w e-commerce](https://developers.google.com/search/docs/specialty/ecommerce/designing-a-url-structure-for-ecommerce-sites).

Jeżeli wybrany serwer obsługuje Apache i .htaccess, przejdź przez [instrukcję przekierowań 301 z mapą URL i testami pętli](https://webalpha.pl/blog/przekierowanie-301-htaccess). Reguły ze środowiska demonstracyjnego trzeba dopasować do istniejącego routingu sklepu. Nie zastępuj nimi całego pliku generowanego przez PrestaShop; zachowaj jego kopię i sprawdź karty produktów, parametry oraz checkout.

<a id="sekcja-canonical-noindex-i-robots-txt-robia-rozne-rzeczy"></a>

## Canonical, noindex i robots.txt robią różne rzeczy

**Najpierw określ cel, potem wybierz mechanizm**

| Cel | Mechanizm | Ważne ograniczenie |
| --- | --- | --- |
| Wskazać preferowaną wersję takich samych lub bardzo podobnych stron | rel=canonical; przy trwałej zmianie adresu — przekierowanie | Canonical jest sygnałem, nie nakazem. Porównaj go z wyborem Google. |
| Usunąć publiczną stronę z wyników, pozostawiając ją użytkownikom | noindex w HTML lub X-Robots-Tag w odpowiedzi HTTP | Crawler musi mieć dostęp, aby odczytać tę regułę. |
| Ograniczyć pobieranie niepotrzebnych adresów | Dopasowane reguły robots.txt | Blokada crawla nie gwarantuje usunięcia samego URL z wyników. |
| Chronić konto klienta, zamówienia lub dane integracji | Uwierzytelnienie i kontrola dostępu | Robots.txt i noindex nie zabezpieczają danych. |

Nie łącz mechanizmów automatycznie. Jeśli chcesz, żeby Google odczytał noindex, nie odcinaj jednocześnie crawla tego URL-a. Canonical do kategorii nie zastąpi decyzji o wykluczeniu strony o innej zawartości. Na preferowanej stronie sprawdź jeden spójny self-canonical, czyli wskazanie na jej własny docelowy adres, zgodne z linkowaniem i sitemapą.

> **Bez kopiowania gotowego robots.txt:** Nie blokuj całego /modules/ bez sprawdzenia potrzebnych plików CSS, JavaScript i endpointów. Regeneracja robots.txt w PrestaShop może nadpisać własne reguły. Zachowaj kopię i przetestuj zarówno adresy przeznaczone do zablokowania, jak i produkty, zasoby renderowania oraz pliki potrzebne integracjom.

Szczegóły i ograniczenia: [wybór adresu kanonicznego](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls) oraz [działanie noindex](https://developers.google.com/search/docs/crawling-indexing/block-indexing).

<a id="sekcja-filtry-prestashop-ktore-strony-maja-sens-w-google"></a>

## Filtry PrestaShop: które strony mają sens w Google?

Zbierz rzeczywiste adresy tworzone przez zainstalowany moduł filtrów. Ten sam parametr może mieć inne znaczenie w innym sklepie. Wybraną kombinację przeznacz do indeksacji dopiero wtedy, gdy odpowiada odrębnemu zapytaniu zakupowemu i ma użyteczny asortyment. Nie każda marka zasługuje na nową stronę i nie każdy rozmiar jest bezwartościowy.

**Przykłady poglądowe — składnię i treść sprawdź w swoim sklepie**

| Przypadek | Decyzja robocza | Test |
| --- | --- | --- |
| /buty-trekkingowe-damskie | Osobna indeksowalna kategoria, jeśli ma potwierdzoną intencję i ofertę | Odrębność od kategorii nadrzędnej, linki i self-canonical |
| Filtr ceny lub przypadkowa kombinacja bez celu w wyszukiwarce | Ograniczenie generowanych linków i crawla; istniejącą indeksację rozpatrz osobno | Reguła nie odcina wartościowych kombinacji ani produktów |
| ?order=price.asc | Jeżeli zmienia tylko kolejność tego samego zbioru, nie twórz z niego kolejnej strony SEO | Rzeczywista zawartość, szczególnie przy połączeniu sortowania z paginacją |
| Niemożliwy zestaw filtrów lub nieistniejący numer strony | Odpowiedź 404 pod żądanym adresem z czytelnym komunikatem | Brak pozornego 200 i przekierowania do wspólnej strony błędu |

Jeżeli filtrowane adresy nie są potrzebne w wyszukiwarce, Google zaleca ograniczenie ich crawlowania. Sam canonical nie jest równie skutecznym sterowaniem pobieraniem. Zobacz [zalecenia dotyczące nawigacji fasetowanej](https://developers.google.com/crawling/docs/faceted-navigation). Ustawienia modułu trzeba sprawdzić w wygenerowanych adresach i HTML; nazwa opcji „indeksowanie” nie dowodzi, że steruje indeksem Google.

<a id="sekcja-paginacja-strona-2-nie-jest-kopia-strony-1"></a>

## Paginacja: strona 2 nie jest kopią strony 1

Lista /buty?page=2 pokazuje inne produkty niż /buty. Zachowaj dla niej odrębny, dostępny URL i własny canonical. Nie kieruj całej paginacji do pierwszej strony i nie nakładaj noindex od arbitralnego numeru. Parametr ?page=1 można ujednolicić z pierwszą stroną, jeśli faktycznie zwraca tę samą zawartość.

- Połącz kolejne strony linkami <a href>. Sam przycisk „Pokaż więcej” lub scroll nie wystarczy jako droga odkrycia produktów.
- Sprawdź, czy produkt z dalszej części listingu jest osiągalny bez wpisywania zapytania w wewnętrznej wyszukiwarce.
- Numer strony w tytule może pomóc użytkownikowi, ale jego brak nie oznacza automatycznie błędu. Google nie wymaga unikalnych tytułów w całej sekwencji.
- Google nie używa rel=next/prev do rozpoznawania paginacji; te znaczniki nie zastępują linków.

Źródło: [Google — paginacja i doładowywanie list](https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading).

<a id="sekcja-warianty-produktu-jedna-karta-czy-odrebne-strony"></a>

## Warianty produktu: jedna karta czy odrębne strony?

Dostępny URL wariantu nie oznacza obowiązku indeksowania każdego rozmiaru. W modelu jednej karty np. /kurtka?kolor=zielony wybiera wariant, a główny adres /kurtka reprezentuje grupę jako canonical. W modelu wielostronicowym odrębne karty wariantów mogą być równorzędne — nie przenoś na nie automatycznie reguły jednej strony.

- Otwórz adres wariantu bez wcześniejszych cookies: musi wybrać właściwy produkt, zdjęcie, cenę i dostępność.
- Jeżeli wariant ma być rozpoznawalny jako odrębny URL, nie opieraj jego adresu wyłącznie na fragmencie po #.
- Porównaj URL oferty w feedzie i danych strukturalnych z kartą. Nie wysyłaj klienta szukającego zielonej kurtki na losowy kolor.
- ProductGroup i powiązane Product pozwalają opisać grupę oraz warianty. Model danych i canonicali musi odpowiadać rzeczywistemu sposobowi działania kart, nie tylko unikalności opisu.

Przykłady obu architektur i ich wymagania: [Google — dane strukturalne wariantów produktów](https://developers.google.com/search/docs/appearance/structured-data/product-variants).

<a id="sekcja-sitemap-prestashop-i-feed-merchant-center-to-nie-to-samo"></a>

## Sitemap PrestaShop i feed Merchant Center to nie to samo

Sitemap zgłasza adresy, które chcesz udostępnić wyszukiwarce. Feed przekazuje dane ofert, np. ceny i dostępność, do określonej integracji. Publikacja pliku XML nie oznacza automatycznie, że powstała indeksowana kopia całego sklepu. Nie blokuj wszystkich XML-i jedną regułą.

- Sprawdź, co rzeczywiście generuje sitemapę. Oficjalny moduł to gsitemap; ps_googleanalytics służy analityce, nie generowaniu mapy.
- Zgłaszaj docelowe, kanoniczne adresy przeznaczone do indeksacji. Usuń z mapy niezamierzone przekierowania, błędy i strony noindex.
- Zweryfikuj odświeżanie mapy po zmianie katalogu. lastmod powinien oznaczać rzeczywistą istotną aktualizację; Google ignoruje priority i changefreq.
- Pojedyncza sitemap ma limit 50 000 URL-i lub 50 MB przed kompresją. Większy zbiór podziel na pliki i ewentualny indeks map.

Dokumentacja: [moduł gsitemap](https://github.com/PrestaShop/gsitemap) oraz [budowa i zgłaszanie sitemapy](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap). Mapa pomaga w odkrywaniu URL-i, lecz nie gwarantuje ich indeksacji.

Dla Merchant Center sprawdź udane pobranie feedu, datę aktualizacji oraz zgodność linku, ceny, waluty i dostępności z kartą produktu. Jeśli publiczny eksport nie ma pojawiać się jako samodzielny wynik, rozważ X-Robots-Tag: noindex dla tego zasobu i sprawdź jego obsługę przez odbiorcę. Nie blokuj przy tym pobierania przez potrzebną integrację. Eksport zawierający poufne dane wymaga kontroli dostępu, nie samego noindex.

Feed oraz dane strukturalne mogą się uzupełniać — [jak Google wykorzystuje dane produktów](https://developers.google.com/search/docs/specialty/ecommerce/share-your-product-data-with-google). Osobno kontroluj status ofert w Merchant Center i indeksację kart w Search Console.

<a id="sekcja-kategorie-opisy-i-meta-tagi-dopasowanie-do-zakupu"></a>

## Kategorie, opisy i meta tagi: dopasowanie do zakupu

Dla grupy zapytań wskaż stronę, która najlepiej pomaga kupić lub wybrać produkt. Kategoria powinna porządkować wybór, karta opisywać konkretną ofertę, a poradnik odpowiadać na pytania przed zakupem. Dwa URL-e widoczne na tę samą frazę nie są jeszcze dowodem szkodliwej kanibalizacji.

- Przykład kategorii: zamiast dopisywać tekst do limitu znaków, wyjaśnij różnice między butami na jednodniowy szlak a ciężkim trekkingiem i połącz odpowiednie podkategorie.
- Przykład produktu: zachowaj prawdziwe parametry producenta, dodaj pomocne informacje o dopasowaniu, kompatybilności, zestawie i ograniczeniach. Nie twórz pozornie unikalnego opisu przez zamianę synonimów.
- Tytuł powinien jasno nazywać stronę, np. „Buty trekkingowe damskie — niskie i za kostkę | Marka sklepu”, jeżeli taki asortyment jest dostępny. Unikaj obietnic niepotwierdzonych ofertą.
- Opis meta traktuj jako propozycję fragmentu wyniku, nie gwarancję jego wyglądu. Google może wybrać inną treść; nie ma jednego limitu znaków zapewniającego pełne wyświetlenie na każdym urządzeniu.
- Linkuj z poradnika do pasującej kategorii lub produktu i zapewnij dostęp do kart przez nawigację. Nie twórz automatycznie kolejnych landingów dla każdej odmiany frazy.

Google nie wskazuje wymaganej liczby słów: [użyteczne treści](https://developers.google.com/search/docs/fundamentals/creating-helpful-content). Zobacz również [zalecenia dla tytułów wyników](https://developers.google.com/search/docs/appearance/title-link) i [linkowanie w sklepie](https://developers.google.com/search/docs/specialty/ecommerce/help-google-understand-your-ecommerce-site-structure).

<a id="sekcja-dane-strukturalne-i-moduly-seo-jak-je-odebrac"></a>

## Dane strukturalne i moduły SEO — jak je odebrać?

Najpierw sprawdź, co już generują motyw i moduły. Dodatkowa wtyczka może powielić canonical lub wystawić sprzeczne ceny w kilku blokach JSON-LD. Moduł dobieraj do brakującej funkcji i zgodności z wersją sklepu; ocena „SEO score” nie zastępuje sprawdzenia wyniku w HTML i GSC.

- Na karcie z zakupem sprawdź wymagania merchant listings; wymagania product snippets nie są identycznym zestawem pól.
- Porównaj nazwę, cenę, walutę, dostępność i URL oferty z treścią widoczną dla klienta. Opinie i oceny oznaczaj tylko wtedy, gdy rzeczywiście istnieją i spełniają wytyczne.
- Uruchom Rich Results Test na reprezentatywnych kartach, także po wyborze wariantu i zmianie promocji. Po wdrożeniu sprawdź właściwe raporty produktów w Search Console.
- Odbiór oznacza poprawną i zgodną implementację. Nie jest gwarancją rozszerzonego wyniku, wzrostu CTR ani pozycji.

Aktualny punkt odniesienia: [Google — rodzaje danych strukturalnych Product](https://developers.google.com/search/docs/appearance/structured-data/product). Nie wdrażaj nieaktualnych funkcji tylko dlatego, że wymienia je stary poradnik lub opis modułu.

<a id="sekcja-wydajnosc-i-wersje-jezykowe-dwa-osobne-testy"></a>

## Wydajność i wersje językowe: dwa osobne testy

Dla wydajności oddziel wyniki laboratoryjne od danych rzeczywistych użytkowników. Zmierz LCP, INP i CLS osobno dla mobile i desktop, jeśli dane są dostępne; brak danych terenowych nie oznacza zaliczenia testu. Sprawdź kategorię, produkt i ścieżkę zakupową. Dobry Lighthouse nie dowodzi wzrostu SEO, a wolna odpowiedź serwera wymaga diagnozy, nie automatycznego włączenia każdego rodzaju cache.

Znaczenie jakości strony opisuje [Google — page experience](https://developers.google.com/search/docs/appearance/page-experience). Szczegóły pomiaru i bezpiecznej optymalizacji znajdziesz w poradniku [jak przyspieszyć PrestaShop](https://webalpha.pl/blog/optymalizacja-prestashop-jak-przyspieszyc-sklep).

Hreflang służy odpowiednikom językowym lub regionalnym, nie każdemu multistore. Dwa niezależne polskie sklepy nie wymagają wzajemnego hreflang tylko dlatego, że korzystają z jednej instalacji. Dla rzeczywistych odpowiedników sprawdź kody języków, adresy, wskazania na siebie i linki zwrotne. Canonical powinien być spójny z daną wersją językową, a nie kierować wszystkie tłumaczenia do polskiej strony.

Wybierz jeden utrzymywalny sposób publikacji oznaczeń: HTML, nagłówki HTTP albo sitemapę. x-default może wskazywać stronę dla niedopasowanych języków; nie jest obowiązkowym tagiem każdego sklepu. Źródło: [Google — wersje językowe i regionalne](https://developers.google.com/search/docs/specialty/international/localized-versions).

<a id="sekcja-co-zrobic-z-niedostepnym-lub-wycofanym-produktem"></a>

## Co zrobić z niedostępnym lub wycofanym produktem?

Oddziel chwilowy brak od trwałego wycofania. Przy planowanym powrocie zachowaj przydatną kartę i zaktualizuj dostępność, opis oraz feed. Przy trwałym wycofaniu oceń zapytania, linki i istnienie rzeczywistego następcy. Przekierowanie 301 ma sens do odpowiednika, nie do losowej kategorii. Użyteczne archiwum może pozostać; adres bez zastępczej wartości może zwracać 404 lub 410.

<a id="sekcja-jak-mierzyc-wynik-i-odebrac-poprawki-seo"></a>

## Jak mierzyć wynik i odebrać poprawki SEO?

1. Zapisz baseline przed wdrożeniem: daty, URL-e, query, urządzenia, kliknięcia, wyświetlenia, pozycje oraz stan indeksacji. Użyj pełnych okresów z finalnymi danymi GSC.
2. Do każdego zadania dopisz oczekiwany stan techniczny. Przykład: strona 2 kategorii ma własny canonical i dostępne linki do produktów — bez deklaracji, że awansuje o określoną liczbę pozycji.
3. Po publikacji powtórz crawl i testy tych samych przypadków. Sprawdź także zamówienie, warianty, ceny i pobieranie feedu, jeżeli zmiana ich dotyczy.
4. Porównaj pełne okresy, np. 28 dni przed i po zmianie, z uwzględnieniem sezonowości i innych wdrożeń. Przy kilku kliknięciach wydłuż obserwację; pojedyncze kliknięcie nie wyznacza stabilnego CTR.
5. Oddziel dotychczasowe zapytania od nowych. Gorsza średnia pozycja może towarzyszyć wejściu nowych fraz; wyższa może wynikać ze zniknięcia słabszych wyników.
6. Połącz ocenę SEO z pomiarem sprzedaży lub kwalifikowanych zapytań. Ruch z GSC nie jest liczbą klientów, a kliknięcie telefonu nie dowodzi odbytej rozmowy.

> **Najpierw poprawny pomiar, potem wniosek:** Nie utożsamiaj sumy ujawnionych zapytań z całym ruchem strony. Sprawdź zakres i kompletność eksportów, zanim policzysz CTR per urządzenie. Nie zmieniaj jednocześnie tytułów całego sklepu i nie ogłaszaj wyniku testu na podstawie kilku wyświetleń. Termin kontroli nie jest obietnicą indeksacji ani wzrostu.

<a id="sekcja-kiedy-przejsc-od-checklisty-do-audytu-prestashop"></a>

## Kiedy przejść od checklisty do audytu PrestaShop?

Audyt ma sens, gdy nie potrafisz rozstrzygnąć przyczyny problemu, zmiana dotyczy wielu szablonów albo przygotowujesz migrację. Do rozmowy wystarczą na początek domena, wersja sklepu, opis problemu i kilka adresów. Dostęp do analityki przekazuj przez nadanie uprawnień, nie wysyłając hasła.

Na stronie [audytu SEO sklepu PrestaShop](https://webalpha.pl/sklep/audyt-seo-sklepu-prestashop) znajdziesz zakres analizy, warunki oraz aktualną cenę. Ten poradnik pomaga wykonać wstępną diagnozę; oferta dotyczy analizy konkretnego sklepu. Wdrożenie zaleceń i stałe pozycjonowanie są odrębnym zakresem.

## Nie wiesz, co ogranicza widoczność Twojego PrestaShop?

Przygotuj adres sklepu, wersję PrestaShop i przykłady problematycznych kategorii lub produktów. Ustalimy zakres audytu i sposób odbioru zaleceń; wdrożenie poprawek wymaga osobnego uzgodnienia.

[Sprawdź zakres audytu SEO PrestaShop](https://webalpha.pl/sklep/audyt-seo-sklepu-prestashop)

## Najczęstsze pytania (FAQ)

### Czy mogę samodzielnie poprawić SEO PrestaShop?

Tak, zacznij od jednej ważnej kategorii: sprawdź GSC, indeksację, adresy i dopasowanie treści. Edycja tytułu to inna skala ryzyka niż zmiana routingu lub robots.txt. Zmiany obejmujące cały sklep testuj na kopii i przygotuj sposób wycofania.

### Czy usunięcie ID z URL poprawi pozycje PrestaShop?

Sama obecność ID nie uzasadnia przebudowy adresów. Czytelny URL może zawierać numer produktu. Na działającym sklepie najpierw oceń korzyść zmiany i jej koszt; nie ma podstaw, by obiecywać wzrost po samym usunięciu ID.

### Czy wszystkie filtry powinny mieć noindex?

Nie. Wybrane kombinacje mogą odpowiadać osobnym intencjom zakupowym. Dla pozostałych rozdziel ograniczenie crawla od wykluczenia z wyników; nie stosuj jednej reguły bez sprawdzenia adresów i zawartości.

### Czy canonical strony 2 kategorii powinien wskazywać stronę 1?

Nie, jeśli pokazuje inny fragment listy. Poszczególne strony paginacji powinny mieć własne adresy kanoniczne i odkrywalne linki. Dotyczy to również list z przyciskiem doładowywania, które wymagają dostępnej dla crawlera ścieżki.

### Czy potrzebuję płatnego modułu SEO?

Nie do każdej poprawki. Najpierw sprawdź funkcje panelu i motywu oraz ustal, czego brakuje. Moduł ma sens dla konkretnej potrzeby, po weryfikacji kompatybilności i wygenerowanego HTML. Nie kupuj go wyłącznie dla obietnicy wyższych pozycji.

### Czy przed SEO trzeba zaktualizować PrestaShop 1.7?

Plan aktualizacji jest ważny dla utrzymania, ale nie jest warunkiem naprawy każdego błędu SEO. Sprawdź bezpieczeństwo i kompatybilność osobno; przypadkowy noindex, błędne linki czy nieprawdziwy opis produktu można diagnozować przed migracją.

### Ile trwa poprawa widoczności po wdrożeniu?

Nie ma jednego terminu. Najpierw odbierz zmianę techniczną, później obserwuj ponowny crawl, indeksację i ruch w porównywalnych okresach. Konkurencja, popyt i skala danych wpływają na ocenę; poprawny test techniczny nie gwarantuje wzrostu sprzedaży.
