Užitečné pluginy, návody a šablony pro WordPress CMS

Více výpisů článků najednou (Multiple loops)

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&amp;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&amp;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#…

Vnořené výpisy článků: http://codex.wordpress.org/The_Loop#…

Reference funkce query_posts: http://codex.wordpress.org/…/query_posts

Popis objektu WP_Query: http://codex.wordpress.org/…nce/WP_Query


Celý příspěvek »

 

OVX.cz 2003 | Přihlásit se
Bez cookies už dnes těžko provozovat plnohodnotný web. Setrváním zde tudíž vyjadřujete souhlas s jejich používáním. Více informací. | Zavřít.