Proč někdo potřebuje více výpisů článků (dále již jen multiple loops)? WordPress codex odpovídá v tomto duchu:
Odpověď na tuto otázku je, v zásadě taková, že chceme udělat s jednou skupinou článků něco jiného, než s druhou skupinou článk, ale přitom chceme obě skupiny vypsat na jedné stránce zároveň. „Něco jiného“ může znamenat prakticky cokoli. Limitovaní jste pouze vašemi znalostmi PHP a vaší představivostí.
Stručný popis základního cyklu pro výpis příspěvků
Než se pustíme do multiple loops, je dobré vědět něco o základní cyklu pro výspis článků. Tento vypadá takto:
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<!-- do stuff ... -->
<?php endwhile; ?>
<?php endif; ?>
Nejprve se ujistíme, že je co vypisovat (první řádek). Na stránce archivu či kategorie (soubory archive.php či category.php) jde o to, jestli jsou v daném archivu (dle měsíce, data, roku, autora, štítku) či kategorii nějaké články. Určení okruhu článků (výběr kategorie či archivu) je provedeno z url adresy. Pakliže máme články, které splňují kritéria, vezme kód každý jednotlivý článek a provede s ním to, co mu řekneme.
Zpracování stejného souboru článku dvakrát
No a nyní se již můžeme pustit do více výpisů takových článků. Nejdříve si předvedeme jak zpracovat stejný okruh článků znovu. Čili ještě jednou provést výpis stejných článků, ovšem třeba s jiným formátováním výstupu.
Jde o celkem jednoduchou operaci. Stačí použít funkci rewind_posts(). Ta přetočí pomyslné počítadlo vypsaných článků zpět na začátek a další výpis začně znovu, pěkně od začátku.
<?php if ( have_posts() ) : ?>
<?php while (have_posts()) : the_post(); ?>
<!-- Do stuff... -->
<?php endwhile; ?>
<?php rewind_posts(); ?>
<?php while (have_posts()) : the_post(); ?>
<!-- Do another stuff... -->
<?php endwhile; ?>
<?php endif; ?>
Dva různé soubory článků
Pokud ovšem chceme mít na stránce dva různé soubory článků, bude již operace trochu složitější, ovšem stále jde celkem o banalitu, kterou se lze snadno naučit.
Poumůže nám funkce query_posts(), která vytvoří nový objekt s články a přetočí jej na začátek, přičemž stávající smaže a nelze jej dále znovu použít. Na stránce popisu funkce query_posts() se dočtete možnosti, jak specifikovat jaké články chcete vybrat.
Použití je poté následující:
// nejprve proběhne výpis tradičních článků
<?php if ( have_posts() ) : ?>
<?php while (have_posts()) : the_post(); ?>
<!-- Do stuff... -->
<?php endwhile;?>
<?php endif; ?>
// a poté vybereme posledních 5 článků z kategorie nezařazené
// parametr category_name využívá název url tzv. slug, nikoli název
<?php query_posts('category_name=nezarazene&posts_per_page=5'); ?>
<?php if ( have_posts() ) : ?>
<?php while (have_posts()) : the_post(); ?>
<!-- Do nezarazene stuff... -->
<?php endwhile;?>
<?php endif; ?>
Dva různé soubory článků se zachováním původního souboru
Výše uvedené řešení, jak bylo napsáno, nezachovává původní soubor článků. To může být někdy na škodu, jelikož s ním třeba chceme také ještě pracovat. Původní soubor lze ovšem zachovat. Řešení je následující:
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<!-- Do stuff... -->
<?php endwhile;?>
<?php endif; ?>
<?php $muj_soubor = new WP_Query('category_name=nezarazene&posts_per_page=5'); ?>
<?php if ( $muj_soubor-have_posts() ) : ?>
<?php while ($muj_soubor->have_posts()) : $muj_soubor->the_post(); ?>
<!-- Do nezarazene stuff... -->
<?php endwhile; ?>
<?php endif; ?>
// pro pochopení toho,že původní soubor byl zachován přidávám jeho přetočení a nový výpis původního souboru
<?php rewind_posts(); ?>
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<!-- Do puvodni soubor another stuff -->
<?php endwhile; ?>
<?php endif; ?>
Jak vidíte v kódu, nemáte přístup, v novém souboru, k funkcím have_posts či the_post přímo. Ale skrze název vámi vytvořeného objektu muj_soubor. Na to je nutné pamatovat. A zároveň platí, že uvnitř cyklu while již máte přístup ke všem funkcím (the_content, the_title, the_permalink a podobně) přímo, bez reference na objekt.
Objekt typu WP_Query() přijímá stejné parametry jako funkce query_posts().
Vnořené soubory článků (nested loops)
Také se může stát, že potřebujete ještě před dokončením jednoho výpisu článků vypsat další soubor. I toto je řešitelné, ovšem má to svá specifika, na která je nutné myslet. Je zde opět nutnost vytvořit nový objekt a na konci výpisu je nutné zavolat funkci wp_reset_postdata()
// vybereme články z kategorie s ID 3
$muj_soubor = new WP_Query( "cat=3" );
if ( $muj_soubor->have_posts() ) {
while ( $muj_soubor->have_posts() ) {
$muj_soubor->the_post();
the_content(); //výpis obsahu již probíhá bez reference na objekt muj_soubor
}
}
wp_reset_postdata(); // tento řádek je nesmírně důležitý a u vnořených výpisů nesmí chybět!
Informace o této problematice na WordPress codex (anglicky):
http://codex.wordpress.org/The_Loop#Multiple_Loops
Vnořené výpisy článků: http://codex.wordpress.org/The_Loop#Nested_Loops
Reference funkce query_posts: http://codex.wordpress.org/Function_Reference/query_posts
Popis objektu WP_Query: http://codex.wordpress.org/Function_Reference/WP_Query
