Poměrně jednoduchá (a přesto velmi mocná) funkce query_posts() je mezi uživateli WordPressu velmi oblíbená, protože si mohou s její pomocí snadno (a téměř libovolně) upravit výpisy příspěvků na svém webu. Bohužel ale není vždy používána zcela správně a může tak v některých případech způsobovat různé problémy, nebo nejsou některé její vlastnosti na první pohled zcela zřejmé, což je i případ častých problémů s nefunkčním stránkováním.
Pokud si pamatujete na náš starší článek o jednoduchém využití funkce query_posts() a zkoušeli jste popisované řešení použít, tak vám patrně nefunguje stránkování příspěvků. Není to však tím, že by byl námi uvedený příklad zcela špatně, ale pouze se stránkováním nepočítal. Celá problematika se bez probrání základů fungování výpisů ve WordPressu obtížně vysvětluje, takže se zkusíme podívat WordPressu trochu pod pokličku. Nebudeme zabíhat do detailů fungování celého cyklu (loop) ve WordPressu, ale osvětlíme si pouze s naším problémem související části.
Při zobrazení každé webové stránky (např. příspěvek, rubrika, atd.) WordPress automaticky zjišťuje všechny parametry, které jsou mu předávány v URL adrese, což zajišťuje funkce parse_request() (naleznete ji v souboru wp-inludes/classes.php). Každá zobrazená stránka tedy generuje nějaké parametry (např. /?p=123 pro WordPress znamená, že má zobrazit příspěvek, jehož ID je 123) a další hodnoty jsou ještě přidány z různých uživatelských nastavení (např. zobrazení 10 příspěvků na stránku). Všechny tyto získané informace jsou shromážděny v proměnné query_vars, která je posílána dále ke zpracování. Pokud se budeme držet našeho problému se stránkováním, tak když zobrazíte např. úvodní stránku a kliknete na odkaz “Starší příspěvky”, URL se změní na /?paged=2 (samozřejmě jde o příklad bez použití hezkých odkazů) a WordPress se tak automaticky dozví, že má vypsat až druhou stránku příspěvků (a příspěvky stránkovat podle počtu zadaného v administraci). Jinak řečeno se při zobrazení druhé stránky příspěvků do proměnné query_vars uložil parametr paged, jehož hodnota je 2.
WordPress už podle URL adresy také ví, co by měl na stránce zobrazovat (jaký typ obsahu) a vše tedy samozřejmě probíhá podle pokynů v příslušném souboru šablony, kdy úvodní stránka (homepage) je obvykle zobrazena na základě souboru index.php či home.php a WordPress se dotáže na nenovější příspěvky. Samotný příspěvek je pak zobrazován podle pokynů v souboru single.php a dotaz bude směřovat na konkrétní příspěvek. Rubrika je často zobrazována na základě souboru archive.php a dotaz směřuje na nejnovější příspěvky zařazené do této rubriky (pro podrobnosti si prostudujte kompletní přehled souborů).
Výpis konkrétních příspěvků pak probíhá ve chvíli, kdy se v šabloně objeví následující kód (aneb začátek cyklu):
if(have_posts()) : while(have_posts()) : the_post();
A zde také přichází naše chvíle, kdy můžeme s pomocí funkce query_posts() přepsat hodnoty uložené v proměnné query_vars, protože podle nich pak bude zobrazen příslušný obsah. Proto se funkce query_posts() používá právě před zápisem začátku cyklu. Přepsání hodnot lze provést efektněji i jiným způsobem (např. využitím filtru request), ale k tomu se vrátíme zase někdy příště.
A teď se už konečně vrátíme zpět k našemu problému se stránkováním. Pokud totiž použijeme funkci query_posts(), tak výchozí parametry získané z URL adresy a uložené v proměnné query_vars neupravíme, ale rovnou přepíšeme (pouze některé hodnoty přebírané z administrace zůstanou zachovány, např. počet příspěvků na stránku). Proč? Protože se funkce query_posts() používá k různým účelům (nejen odebrání nějaké rubriky z výpisu na úvodní stránce jako v našem případě, ale třeba i k zobrazení jednoho vybraného příspěvku, atd.), tak je stránkování příspěvků v případě použití této funkce defaultně vypnuté a musíte ho ručně zapnout. WordPress o existenci stránkování sice ví podle parametru paged v URL adrese, ale už ho nepředává dále do výpisu příspěvků, protože ten už je modifikován funkcí query_posts(). A záleží tedy na uživateli, jestli tento parametr vůbec bude ve svém upraveném výpisu potřebovat. Mnoho uživatelů o tom ale bohužel neví, takže jim pak stránkování logicky nefunguje, protože ho nemají zapnuté.
A co s tím? Řešení je naštěstí poměrně jednoduché, můžete si dokonce zvolit některou ze tří různých variant. Asi nejjednodušší je využít globální proměnnou $paged, kdy do funkce query_posts() doplníte parametr pro stránkování s názvem “paged” a přiřadíte mu dynamickou hodnotu této globální proměnné, která je automaticky získávána ze zobrazené URL adresy.
global $paged; query_posts('author=-3&cat=-3&paged='.$paged);
Po této úpravě by už mělo stránkování v pořádku fungovat. Ukázka se vztahuje stále k našemu předchozímu příkladu, jak na úvodní stránce vynechat příspěvky, které napsal autor, jehož ID je 3, a jsou zařazené do rubriky, jejíž ID je také 3.
A nakonec ještě jedno malé upozornění, funkce query_posts() by se měla používat pouze v případě úprav výchozího výpisu na zobrazované stránce, jinak je lepší použít obdobnou funkci WP_Query(). Pokud tedy na úvodní stránce chcete zobrazovat všechny příspěvky kromě jedné rubriky, tak je toto řešení v pořádku. Ale pokud pod tímto výpisem (nebo v sidebaru) chcete udělat ještě další výpis příspěvků, např. podle nějakého štítku, tak už použití funkce query_posts() není vhodné. Ale to už je povídání na celý další článek…
Nejoblíbenější hosting pro WordPress WEDOS.cz
Je ještě jedna funkce, která stránkování query_posts($query_string . ‘&cat=-IDRUBRIKY’); neovlivní. Blíže popsaná, zde: http://zivot.cekuj.net/ze-zivota-na-internetu/wp-nezobrazovani-prispevku/ Žádný rozdíl ve funkcionalitě jsem nenašel….
JSifalda: Ano, díky za doplnění. Globální proměnná $query_string uchovává všechny parametry získané z URL webu (tedy i případné stránkování). Takže jejím použitím ve funkci query_posts() zůstane stránkování také správně zachováno.