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 uživatele, a zároveň vysoký výkon a použitelnost na všech zařízeních.
Výchozí 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“ verze). - Stabilní struktura a pořadí položek napříč refreshem, 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 nevznikly nekonečné prostory pro prohledávání.
Rel prev/next: historický kontext a co používat dnes
Historické atributy rel="prev" a rel="next" již nejsou vnímány jako signál pro konsolidaci stránek ve vyhledávačích. Dnes se soustřeď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.
Design URL: stabilita, parametry a indexace
- Jednoduché parametry:
?page=2je čitelný a snadno zpracovatelný. Vyhněte se volitelným, pořadí citlivým a vícená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 počet položek malý (< ~200) a výkon to dovolí, „view-all“ (např.
/kategorie?view=all) může být kanonická cílová verze. Jinak ať je kanonická 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 zkracování (… 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 OK).
- Hreflang: všechny jazykové mutace musí odkazovat na ekvivalentní stránku (
?page=3↔?page=3v jiné mutaci). - Robots meta: obvykle
index,follow. Zvažtenoindex,followpro nízce hodnotné 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+ aktualizujte name a position tak, aby odrážely podstránku (např. „Kategorie – stránka 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:
- Bez JS: uživatel i robot vidí tradiční stránkování s odkazy.
- S JS: nahradíte blok stránkování tlačítkem „Načíst více“ nebo automatickým načítáním přes
IntersectionObserver. - History API: při načtení další „stránky“ zavolejte
history.pushStates URL?page=n, aby uživatel měl záložkovatelnou polohu a robot mohl získat kanonické podstránky. - Permalink na poslední pozici: při obnově stránky obnovte polohu podle query parametru (např.
#p3nebo?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-controlsa oznamujte nové položky přesaria-live="polite". - Umožněte klávesovou navigaci po záznamech; nekonečné scrollování bez „skip links“ je pro čtečky obrazovky frustrující.
- 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 úspora dat
- LCP: první dávku položek renderujte server-side a dodávejte 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-rationebowidth/heightatributů) a placeholderů, aby nedocházelo k poskakování layoutu. - INP/TBT: dávkujte požadavky, udržujte bundle malý, používejte
requestIdleCallbackascheduler.postTask(je-li dostupné). - Lazy-loading médií: použijte
loading="lazy"afetchpriority(hero obrázekhigh, ostatní default).
Crawl budget a faceted navigation
Filtrační a třídicí funkce mohou vytvořit explozi URL. Strategie:
- Indexovatelné vs. neindexovatelné filtry: pouze obchodně významné kombinace nechť jsou indexovatelné (
index,follow), zbyteknoindex,follownebo vůbec neodkazovaný pro roboty. - Kanibalizace: zabraňte tomu, aby více filtrů produkovalo stejný obsah a pořadí; použijte kanonické tagy na primární verzi.
- Sitemap: do XML sitemap přidávejte pouze důležité stránky a stabilní kombinace, nikoliv 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>. Při ú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 vedou na „view-all“.
- Filtrované kombinace: pokud je filtr pouze UX pomůcka (nezakládá nový význam), nechť je canonical na nevyfiltrovanou verzi; pokud jde o entitně relevantní podstránku (např. „pánské-běžecké-boty“), může mít samostatnou kanonickou entitu.
Logika poslední stránky a soft 404
Poslední stránka musí existovat s HTTP 200 stavem i v případě, že obsahuje méně položek. Nevraťte 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í/crawlování.
- 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 mobilních zařízení).
Monitoring: metriky a alerty
- Index coverage stránek 2+ (Search Console), poměr indexovaných k generovaným stránkám.
- Logfile analýza: zjistěte, jak hluboko 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 eventy: scrolldepth, kliknutí na „Načíst více“, bounce 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 konkrétní stav.
- Kanonikalizace všeho na stránku 1: zneviditelníte hluboký obsah a omezíte long-tail.
- Blokování stránek 2+ v 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-skua označenáProductstrukturovaná data pouze na detailu, ne 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
- Bez JS test: vypněte JS a ověřte dostupnost odkazů, obsah, stránkovací blok.
- Stabilita URL: refresh a přechod mezi stránkami nesmí měnit pořadí položek.
- Head tagy: správný
title,meta description,canonical,hreflang(je-li relevantní). - Strukturovaná data: validace
ItemListaBreadcrumbList. - CWV: měření LCP/CLS/INP pro stránku 1 i stránky 3+ (lab i field data).
- 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ě:
- Přidejte serverem renderované podstránky s parametrem
?page=. - Umiestněte na stránku 1 stránkovací blok; nasazení bez JS fallbacku.
- Zapněte „Load more“ a History API; zachovejte odkazy v DOM (přístupné robotům).
- Po indexaci zkontrolujte pokrytí a upravte canonical/hreflang.
Checklist pro SEO-friendly infinite scroll
- Každá dávka obsahu má mapovatelnou URL (
?page=nnebo 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čítání další dávky.
- Přístupnost:
aria-live, správné role, management fokusu po načtení. - Výkon: rezervované prostory, lazy-load,