SEO stránkování

Proč řešit stránkování a nekonečné načítání z pohledu SEO

Stránkování (pagination) a nekonečné načítání (infinite scroll) jsou základní vzory navigace seznamů produktů, článků či recenzí. Nesprávná implementace vede k plýtvání crawl budgetem, slabému indexování hlubokých stránek, problémům s výkonem (LCP/INP) a ke zhoršení přístupnosti. Cílem SEO-friendly implementace je zajistit: indexovatelné a prolinkované stránky s unikátními URL, stabilní rozhraní pro roboty i lidi a zároveň vysoký výkon a použitelnost na všech zařízeních.

Východiska: principy SEO-friendly stránkování

  • Unikátní URL pro každou stránku seznamu (např. /kategorie?page=2), které lze načíst bez JavaScriptu.
  • Viditelné odkazy <a href> na předchozí/následující stránku a na klíčové stránky (1, 2, 3, …, poslední).
  • Samokanonikalizace: každá stránka má <link rel="canonical" href="aktuální-URL">, nikoli kanonikalizaci všech stránek na stránku 1 (výjimkou je prokazatelně lepší „view-all“).
  • Stabilní struktura a pořadí položek napříč obnovami stránky, aby robot i uživatel viděli konzistentní výsledky.
  • Limity: rozumný počet stránek (např. max. 100) a dostupné filtrační kombinace, aby nevznikaly nekonečné prostory pro procházení.

Rel prev/next: historický kontext a co používat dnes

Historické atributy rel="prev" a rel="next" už nejsou považovány za signál pro konsolidaci stránek u vyhledávačů. Dnes se zaměřte na: samostatné URL, kvalitní interní navigaci odkazy, správné kanonické tagy a jasnou informační architekturu. Prohlížeče a roboti musí bez JS najít odkazy na další stránky.

URL design: stabilita, parametry a indexace

  • Jednoduché parametry: ?page=2 je čitelný a snadno zpracovatelný. Vyhněte se volitelným, pořadí-citlivým a mnohonásobným parametrům (např. ?p=2&sort=pop&ref=...), které generují duplicitní kombinace.
  • Pořadí filtrů: definujte deterministické pořadí parametrů (např. ?brand=nike&color=black&page=3), aby nevznikaly duplicity se stejným obsahem.
  • „View-all“ varianta: pokud je součet položek malý (< ~200) a výkon to umožňuje, může být „view-all“ (např. /kategorie?view=all) kanonickou cílovou verzí. Jinak ať je canonical každá stránka sama na sebe.

Interní prolinkování: náhledová navigace a paginy

Na místě seznamu zobrazte stránkovací blok s odkazy: 1, 2, 3, …, poslední; plus Předchozí a Další. Doporučení:

  • Vždy zobrazujte odkaz na stránku 1 (kotva autority) a na následující stránku.
  • Pro hluboké stránky používejte zkrácení (… 10, 11, 12, 13, 14 … 50) s klikacími čísly.
  • Nezakrývejte odkazy za JS – odkaz musí být <a href> s reálnou URL i bez JS.

Meta a head: canonical, hreflang, robots

  • Canonical: na každé stránce na sebe; při „view-all“ strategii nastavte canonical všech stránek na „view-all“ vyhrazenou URL (pouze pokud je obsah 1:1 zahrnut a výkon je v pořádku).
  • Hreflang: všechny jazykové mutace musí odkazovat na ekvivalentní stránku (?page=3?page=3 v jiné mutaci).
  • Robots meta: běžně index,follow. Zvažte noindex,follow pro nízkohodnotné kombinace filtrů, ale ponechte crawl pro objev produktových detailů.

Strukturovaná data: ItemList a BreadcrumbList

Na seznamových stránkách implementujte ItemList s itemListElement (ListItem s position a url). Pro hierarchii použijte BreadcrumbList. Na stránkách 2 a více aktualizujte name a position tak, aby odrážely podstranu (např. „Kategorie – strana 3“ v <title> i v meta name="og:title").

„Load more“ a infinite scroll: SEO-friendly progresivní vylepšení

Konstruujte nekonečné načítání jako progresivní vylepšení nad pevnou stránkovací architekturou:

  1. Bez JS: uživatel i robot vidí tradiční stránkování s odkazy.
  2. S JS: nahradíte blok stránkování tlačítkem „Načíst více“ nebo automatickým načítáním přes IntersectionObserver.
  3. History API: při načtení další „stránky“ zavolejte history.pushState s URL ?page=n, aby měl uživatel záložkovatelnou pozici a robot mohl získat kanonické podstránky.
  4. Permalink na poslední pozici: při obnově stránky obnovte polohu podle query parametru (např. #p3 nebo ?page=3), čímž zlepšíte UX i crawl.

Přístupnost: ARIA a klávesová navigace

  • Tlačítko „Načíst více“ označte role="button", aria-controls a oznamujte nové položky přes aria-live="polite".
  • Umožněte klávesovou navigaci po záznamech; nekonečné scrollování bez „skip links“ je pro čtečky obrazovky frustrativní.
  • Poskytněte odkaz „Zpět na začátek“ a „Přejít na další stránku“ jako klasický <a>.

Výkon: LCP, CLS, INP a šetření dat

  • LCP: první porci položek renderujte server-side a dodejte kritické CSS, aby LCP zůstalo stabilní. Další dávky lazy-loadujte.
  • CLS: rezervujte výšku karty/obrázku pomocí poměru stran (např. aspect-ratio nebo width/height atributů) a placeholderů, aby se layout neskočil.
  • INP/TBT: dávkujte požadavky, udržujte bundle malý, používejte requestIdleCallback a scheduler.postTask (pokud je k dispozici).
  • Lazy-loading médií: použijte loading="lazy" a fetchpriority (hero obrázek high, ostatní defaultní).

Crawl budget a faceted navigace

Filtrační a řadicí funkce mohou vytvořit výbuch URL. Strategie:

  • Indexovatelné vs. neindexovatelné filtry: pouze obchodně významné kombinace nechť jsou indexovatelné (index,follow), zbytek noindex,follow nebo vůbec neodkazovaný pro roboty.
  • Kanibalizace: zabraňte tomu, aby více filtrů produkovalo stejné pořadí a obsah; používejte kanonické tagy pro primární verzi.
  • Sitemap: do XML sitemap přidávejte pouze důležité stránky a stabilní kombinace, nikoli všechny stránky stránkování.

Vzor implementace: kombinované stránkování + „Load more“

Základ HTML (bez JS):

<nav class="pagination" aria-label="Stránkování"> <a href="/kategorie?page=1">1</a> <a href="/kategorie?page=2" rel="next">2</a> <a href="/kategorie?page=3">3</a> … <a href="/kategorie?page=50">50</a> </nav>

Po aktivaci JS skryjete číselníky a zobrazíte tlačítko: <button id="load-more" aria-controls="list">Načíst více</button>. Po úspěšném načtení další stránky proveďte history.pushState({}, "", "?page=3") a doplňte položky do #list. Nezapomeňte na <noscript> fallback s klasickým stránkováním.

Canonical a stránkování: nejčastější scénáře

  • Klasické stránkování: každá stránka canonical na sebe (autonomně indexovatelná).
  • „View-all“ vítězí: všechny stránky canonical na „view-all“ + interní odkazy směřují na „view-all“.
  • Filtrované kombinace: pokud je filtr pouze UX pomůcka (nezakládá nový význam), ať je canonical na nefiltrovanou verzi; pokud vytváří entitně relevantní podstránku (např. „pánské-běžecké-boty“), může existovat samostatná kanonická entita.

Logika poslední stránky a soft 404

Poslední stránka musí existovat s HTTP stavem 200, i když obsahuje méně položek. Nevydávejte prázdnou stránku s 200 (soft 404). Pokud je seznam dočasně prázdný, zobrazte doporučené kategorie/produkty a smysluplný nadpis.

Serverové hlavičky a cache

  • ETag/Last-Modified: umožněte 304 odpovědi pro opakované procházení/obnovy.
  • Cache-Control: krátký max-age (např. 60–300 s) pro stránky s vysokou rotací položek; delší pro stabilní stránky.
  • Preload/prefetch: pro další stránku můžete použít <link rel="prefetch" href="?page=2"> pro rychlejší UX (pozor na datové limity u mobilů).

Monitoring: metriky a alerty

  • Index coverage stránek 2+ (Search Console), poměr indexovaných vs. generovaných.
  • Logfile analýza: zjistěte, kam robot skutečně chodí a zda neplýtvá na bezcenné kombinace filtrů.
  • Core Web Vitals: porovnejte LCP/CLS/INP mezi stránkou 1 a hlubšími stránkami.
  • UX události: hloubka skrolování, kliky na „Načíst více“, odchod po n-té dávce.

Anti-patterny, kterým se vyhnout

  • Pouze infinite scroll bez URL a odkazů: robot nevidí hlubší obsah, uživatel nemůže odkazovat na stav.
  • Kanonikalizace všeho na stránku 1: zneviditelníte hluboký obsah a omezíte long-tail.
  • Blokování stránek 2+ pomocí robots.txt: ztratíte interní signály a možnost indexace hodnotných položek.
  • Dynamický obsah se změnou pořadí při každém načtení: způsobí zbytečný recrawl a nekonzistentní hodnocení.

Specifika e-commerce vs. obsahové weby

  • E-commerce: silná faceted navigace – pečlivě definujte, které kombinace jsou indexovatelné; produktové karty musí mít stabilní data-sku a označené Product strukturované data pouze na detailech, nikoliv v seznamu.
  • Mediální weby: časové řazení; dbejte na archivaci (roční/měsíční paginace) s pevnou URL a přehledným prolinkováním.

Testovací protokol před nasazením

  1. Bez JS test: vypněte JS a ověřte dostupnost odkazů, obsah, stránkovací blok.
  2. Stabilita URL: obnovení stránky a přechod mezi stránkami nesmí měnit pořadí položek.
  3. Head tagy: správný title, meta description, canonical, hreflang (je-li relevantní).
  4. Strukturovaná data: validace ItemList a BreadcrumbList.
  5. CWV: měření LCP/CLS/INP pro stránku 1 i stránku 3+ (lab i field data).
  6. Log/robot: test fetchování hlubších stránek (např. 1, 2, 10) a jejich statusů/hlaviček.

Migrace: z čistě nekonečného scrollu na hybrid

Postupujte inkrementálně:

  1. Přidejte serverově renderované podstránky s parametrem ?page=.
  2. Umístěte na stránku 1 stránkovací blok; nasazení s JS fallbackem.
  3. Zapněte „Load more“ a History API; zachovejte odkazy v DOM (přístupné robotům).
  4. Po indexaci zkontrolujte pokrytí a upravte canonical/hreflang.

Checklist pro SEO-friendly infinite scroll

  • Každá dávka obsahu má mapovatelnou URL (?page=n nebo fragment).
  • Existuje ne-JS stránkování s odkazy.
  • Obsah lze prolinkovat (interní odkazy z detailů odkazují na správné kategorie/stránky).
  • History API aktualizuje adresní řádek při načtení další dávky.
  • Přístupnost: aria-live, správné role, řízení fokusu po načtení.
  • Výkon: rezervované prostory, lazy-load, malé