Strony firmowe, landing page i serwisy w WordPress oraz Next.js — projektowane pod konwersję i widoczność w Google.
Tworzenie stron WWWProjektowanie UX/UIStrony dla firmLanding pageRedesign strony
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.
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.
| 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.
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.
# 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. 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.
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.
# 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| 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 |
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.
<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><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. Poprawne umiejscowienie w head, spójne adresy i relację z innymi sygnałami opisują zasady canonical Google. Nie wklejaj powyższego stałego URL-a do globalnego szablonu: wszystkie kategorie otrzymałyby wtedy ten sam błędny adres.
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.
rg -n --glob '*.tpl' --glob '*.php' \
'page\.canonical|rel=["\x27]canonical|canonical_url' \
themes modules override controllers classesPunkt odniesienia dla warstwy szablonu: zmienne globalne szablonów PrestaShop 8. Mechanizmy konkretnego motywu trzeba zweryfikować lokalnie. Nie podajemy uniwersalnego patcha PHP/Smarty, którego nie uruchomiono na dokładnej wersji sklepu.
| 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.
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.
Podstawa konfiguracji: PrestaShop 8 — SEO and URLs. Zasady spójnego użycia adresów: Google — struktura URL w e-commerce.
Jeżeli wybrany serwer obsługuje Apache i .htaccess, przejdź przez instrukcję przekierowań 301 z mapą URL i testami pętli. 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.
| 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ą.
Szczegóły i ograniczenia: wybór adresu kanonicznego oraz działanie noindex.
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.
| 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. Ustawienia modułu trzeba sprawdzić w wygenerowanych adresach i HTML; nazwa opcji „indeksowanie” nie dowodzi, że steruje indeksem Google.
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ść.
Źródło: Google — paginacja i doładowywanie list.
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.
Przykłady obu architektur i ich wymagania: Google — dane strukturalne wariantów produktów.
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łą.
Dokumentacja: moduł gsitemap oraz budowa i zgłaszanie sitemapy. 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. Osobno kontroluj status ofert w Merchant Center i indeksację kart w Search Console.
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.
Google nie wskazuje wymaganej liczby słów: użyteczne treści. Zobacz również zalecenia dla tytułów wyników i linkowanie w sklepie.
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.
Aktualny punkt odniesienia: Google — rodzaje danych strukturalnych Product. Nie wdrażaj nieaktualnych funkcji tylko dlatego, że wymienia je stary poradnik lub opis modułu.
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. Szczegóły pomiaru i bezpiecznej optymalizacji znajdziesz w poradniku jak przyspieszyć PrestaShop.
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.
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.
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 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.
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 PrestaShopStrony firmowe, landing page i serwisy w WordPress oraz Next.js — projektowane pod konwersję i widoczność w Google.
Tworzenie stron WWWProjektowanie UX/UIStrony dla firmLanding pageRedesign strony
Sklepy na PrestaShop i WooCommerce — wdrożenia, migracje i dedykowane moduły pisane przez zespół senior developerów.
Tworzenie sklepówNowy sklep PrestaShopMigracja na PrestaShopModuły PrestaShopIntegracja z hurtowniami
Pozycjonowanie, SEO techniczne i optymalizacja konwersji — widoczność, kliknięcia i zarejestrowane konwersje porównywane z baseline'em.
SEO dla firmLokalne SEOContent SEOAudyt SEOSEO techniczne
Utrzymanie, aktualizacje i stały rozwój — bierzemy odpowiedzialność za obszar techniczny również po starcie projektu.
Opieka nad stronąAktualizacje i serwerSupport w pakietach godzinRozwój stronyWdrożenia niestandardowe
Bezpłatna konsultacja
Opisz, czego potrzebujesz — zaproponujemy zakres, technologię i realny harmonogram. Bez zobowiązań.
Następny krok
Krótka rozmowa albo wiadomość — wrócimy z konkretną propozycją zakresu.
Formularz kontaktowyOpisz, czego potrzebujesz — strony, sklepu, integracji czy wsparcia technicznego. Odpowiemy z konkretnymi propozycjami i orientacyjną wyceną, zwykle w ciągu 24–48 godzin roboczych.
ul. Henryka Pachońskiego 7a
31-223 Kraków
Biuro czynne: pon.–pt., 9:00–17:00
Webalpha
NIP: 6562340974
REGON: 385895790