Co znamená Loop ve WordPress šabloně

Pokud jste se setkali při pročítání Codexu, nebo některého z návodů pro WordPress s pojmem Loop a chcete porozumět, co tento výraz znamená, je tento článek určen vám. Loop je jedním ze základních kamenů WordPress šablony a dá se říci, že bez něj by nebyla práce s tímto redakčním systémem tak jednoduchá.

Jednoduše řečeno, Loop je smyčka, pomocí které se vypisuje příslušný obsah.

WordPress postupuje následujícím způsobem:

  1. Definuj co chceš zobrazit
  2. Začátek loopu
  3. Výpis obsahu, který chceme zobrazit
  4. Ukončení loopu

Pro loop, nebo smyčku, či jakkoli to budeme nazývat má WordPress funkce, které se dají použít uvnitř loop, ale ne mimo něj. Pokud například použijete the_title() mimo smyčku, nezobrazí se vám nic, musíte použít single_post_title.

Základní tvar loopu

S tímto zápisem se zřejmě setkal každý, kdo se podíval na zdrojové soubory šablony:

if (have_post()): while: (have_post()): the_post():
Obsah, který se zobrazuje
else:
Text, který se zobrazí, pokud není obsah k vypsání
endwhile;
endif;

Ze zápisu je zřejmé, jak to funguje, protože pro každý definovaný soubor, jako jsou single.php, page.php, archive.php, nebo categories.php připraví WordPress jiný druh obsahu, nemusíme pro tyto soubory loop nijak upravovat. Stačí použít funkce určené pro výpis obsahu uvnitř loopu.

Rozdíl mezi page.php a archive.php je v tom, že u page máme pouze jeden titulek a jeden obsah, kdežto u archívu těch článku může být i tisíc a loop vypíše článek a protože je v archívu další, vrátí se zpět na začátek a provede smyčku znovu, tak dlouho, dokud bude co vypisovat. Samozřejmě pomocí stránkování se dá počet provedených loopů omezit třeba na 20.

Pokud budeme tedy chtít vypsat články z určité kategorie, tak do souboru categories.php vložíme tento upravený loop:

if (have_post()): while: (have_post()): the_post(): ?>
<h2><?php the_title(); ?></h2>
<?php the_post_thumbnail(); ?>
<?php the_excerpt(); ?>
<a href="<?php the_permalink(); ?>">Celý článek</a>
<?php else: ?>
<h2>Nenalezeno</h2>
<p>Bohužel jsme nenašli to co hledáte.</p>
<?php endwhile;
endif;

Pomocí funkcí uvnitř loopu vypíšeme titulek, náhledový obrázek, krátký výpis příspěvku a zobrazíme odkaz na celý článek. Vidíte, jak je to snadné.

V loopu můžete použít funkce určené pro výpis určité části obsahu, ale i specifické podmiňovací funkce. Některé z nich zde vypíši:

  • the_title() – titulek
  • the_excerpt() – anotace obsahu
  • the_content() – celý obsah
  • the_permalink() – odkaz na detail obsahu
  • next_post_link() – další článek ve výpise
  • previous_post_link – předchozí článek
  • the_author() – autor obsahu
  • the_ID – id obsahu
  • the_category() – kategorie, do které je obsah zařazen

Podmiňovací funkce:

  • is_home()
  • is_page()
  • is_single
  • is_admin
  • is_search()
  • is_author()

Jedná se pouze o část funkcí, které můžete použít, pro kompletní seznam doporučuji Codex.

Úpravy loopu pomocí WP_query, get_posts a query_posts

A nyní se dostáváme do zajímavé části článku. Pokud si tuto část pečlivě přečtete a doplníte znalosti z Codexu, tak budete schopni vyřešit mnoho problémů typu – potřebuji vypsat články z kategorie, podle autora, seřazené dle abecedy, atd…

Všechny tři funkce umožňuji manipulovat s definováním loopu a proto si vysvětlíme, kdy je vhodné jakou použít.

Get_posts je funkce, která vypíše články, dle přesně definovaných argumentů. Jedná se o template tag, takže se jedná pouze o výpis článků dle parametrů, funkce nijak nemanipuluje s defaultním loopem, na rozdíl od druhých dvou funkcí. Tím se dostávám k využití funkce. Get_posts můžete v podstatě definovat kde chcete v šabloně, nijak tím neovlivníte další výpisy. Toto je poměrně častý problém a get_posts je řešením.

Použití:

$posts_array = get_posts( $args );

Seznam argumentů:

$args = array(
	'posts_per_page'   => 5,
	'offset'           => 0,
	'category'         => '',
	'orderby'          => 'post_date',
	'order'            => 'DESC',
	'include'          => '',
	'exclude'          => '',
	'meta_key'         => '',
	'meta_value'       => '',
	'post_type'        => 'post',
	'post_mime_type'   => '',
	'post_parent'      => '',
	'post_status'      => 'publish',
	'suppress_filters' => true );

Často se můžete setkat se zápisem argumentů přímo v závorkách, ale to je prostě fujky a nedá se v tom pořádně vyznat.

Příklad použití:

$args= array(
             'posts_per_page' => 5, 
             'category'       => 1
);
 
$myposts = get_posts( $args );
foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
<a href="<?php the_permalink(); ?>">Celý článek</a>
<?php endforeach; 
wp_reset_postdata();?>

Tento příklad vypíše 5 posledních článků z kategorie s ID 1.

Query_post

Query_post je funkce, která je podobná get_posts, má podobné, nebo stejné argumenty pro zobrazování článků, rozdíl je v tom, že query_post již manipuluje se základním loopem, proto je třeba používat funkci wp_reset_query(), která nastaví loop na defaultní hodnotu. Pro příklad, chcete mít nad každou stránkou mít box s výpisem posledních tří článků. Pokud použijete query_post, ovlivní argumenty i výpis stránky a vám se pak bude zobrazovat trochu něco jiného, než jste měli v záměru.

Použití:

$args = array(
	'cat'      => 2,
	'order'    => 'ASC'
);
query_posts( $args );
while ( have_posts() ) : the_post();
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
<a href="<?php the_permalink(); ?>">Celý článek</a>
endwhile;
wp_reset_query();

Takto použitá funkce vám vypíše všechny články z kategorie s ID 2, seřazené vzestupně. Jak vidíte, na rozdíl od get_posts neprocházíme pole $myposts, ale upravili jsme přímo výpis loopu. Na konci jsme vrátili výchozí hodnoty pomocí wp_reset_query.

WP_query

WP_query je třída, pomocí které můžete definovat výpis obsahu v šabloně. dá se říci, že použití je podobné query_posts, ale WP_query má mnoho argumentů, pomocí kterých zobrazíte vše co budete chtít, od článků z kategorie, až po výpis custom post type, dle taxonomies. Přestože, se muže na první pohled zdát práce s třídou složitá, není tomu tak a základní použití je snadné.

Příklad:

$args = array(
'post_type' => 'post',
'cat' => 2
);
 
$query = new WP_Query( $args );
 
if ( $the_query->have_posts() ) : 
while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<h1><?php the_title() ;?></h1>			
<?php the_excerpt(); ?>
 
<?php endwhile; 
wp_reset_postdata();
else: ?>
 
>p>Nenalezeno</p>
 
<?php endif; ?>

Jak vidíte použití je téměř identické, jako query_posts, ale možnosti třídy jsou daleko větší, viz Codex. Já osobně query_posts vůbec nepoužívám, protože WP_query nabízí větší možnosti.

Závěr

Nyní již můžete upravovat výpis obsahu v šabloně jak budete potřebovat a věřte, že mnoho problémů, na které narážím na diskuzích, nebo mne někdo prosí o pomoc, se dají vyřešit pomocí správného použití těchto dvou funkcí a jedné třídy.
Díky get_posts lehce vytvoříte výpis posledních článků z kategorie do sidebaru a pomocí WP_query si z hlavní strany můžete klidně magazín.

About The Author

Zajímá mne Wordpress, responsivní šablony a zkrátka vše kolem tohoto skvělého redakčního systému.

Související články

Přidejte komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *