WordPress – tvorba šablony od A do Z – 16.díl – WP_Query detailně


Po dlouhé pauze přicházím s dalším dílem mého seriálu. Byl jsem 10 dní na dovolené (letos první a pravděpodobně zase na rok poslední) a po návratu jsem měl kupu věcí k dohánění. Tím se vám tedy omlouvám za delší promlku od předchozího dílu. Dneska bych se s vámi chtěl podívat trochu více detailně na objekt WP_Query, který nám umožňuje velmi efektivně pracovat s daty v podobě postů (i vlastního post_typu). Objekt je navržen na selekci dat, filtraci a jejich výpis. Z počátku jsem byl k objektu trochu skeptický, ale postupem času jsem si k němu našel cestu a dnes bych si bez něj nedokázal představit vývoj složitějších projektů nad WordPressem.

Co to WP_Query vůbec je?

Naprosto dokonale sepsaná dokumentace k objektu je umístěna na samotném WordPress Codexu, kde najdete rozhodně úplně všechno. Informací je tam poměrně dost, takže bych rád udělal selekci několika základních a dost často opakovaných (alespoň pro mne) metod, jak data potřebuji z DB selektovat. WP_Query je připravený objekt, kde na základě definovaného asociativního pole Wordpessu říkáme, jakou sadu dat chceme od něj vrátit. Zde bych chtěl podotknout, že se jedná pouze o SELECT z tabulky wp_posts a vrácena kolekce dat jsou pouze objekty typ wp_post. Objekt WP_Query toho obsahuje mnohem více, ale pro nás bude nejdůležitější samotná kolekce dat.

Zde je několik tipů, na které se dnes podíváme

  • Kombinace více Termů (rubrik) a Taxonomy(čísleník termů) dohromady.
  • Selekce skupiny příspěvků na základě přidaných metatagů
  • Výběr příspěvků vybraného autora nebo autorů

Určitě bychom parametrů, které lze použít, mohli vyjmenovat více, WordPress jich má opravdu mnoho, ale to, co jsem výše popsal, používám dnes a denně. Rád bych Vám tak na praktických věcech ukázal, jak se to pomocí objektu WP_Query dělá. Další vymýšlení a rozšiřování vašich selectů bude na vás.

Pojďme si ukázat nějaké jednoduché použití:

Dejme tomu, že v mé šabloně mám založený vlastní typ obsahu „auta“. Pojďme si udělat základní Query na vrácení 10 naposledy přidaných aut:

<?php

$parametry = array(
	'post_type' => 'auto',
	'posts_per_page' => 10
);

$auta = new WP_Query($parametry);

if($auta->have_posts()) :
	while($auta->have_posts()) : $auta->the_post();
		get_template_part('loops/loop', 'auto');
	endwhile;
endif;

wp_reset_postdata();

Trochu vysvětlím kód: Před založením objektu si připravím pole s parametry, na základě kterých chci vrátit data. Při založení objektu WP_Query parametry předám a pak již zpracuji běžnou WordPress Loop. Protože nevím, zda za mou Loopou bude ještě probíhat další zpracování dat, raději zavolám funkci wp_reset_postdata(), který nastaví potřebné parametry zpět na základní loop pro globální proměnnou $post.

Pojďme si nyní ukázat modelové příklady, v dalším kódu budu již měnit a ukazovat pole parametrů. Loopa zůstává stejná, jen přidáváme nebo ubíráme filtry dat.

Kombinace několika termů z jedné a více taxonomy



<?php

// V případě, že nám bude stačit jednoduchý filtr, stačí tento zápis
// Tím říkáme, že chceme pouze ty auta, které mají term "skoda" z taxonomy "znacka"
$parametry = array(
	'post_type' => 'auto',
	'posts_per_page' => 10,
	'znacka' => 'skoda'
);

// Pokud chceme jít do většího důsledku a s termy více pracovat můžeme i takto

$parametry = array(
	'post_type' => 'auto',
	'posts_per_page' => 10,
	'tax_query' => array(
		array(
			'taxonomy' => 'znacka',
			'field' => 'slug',
			'terms' => array('skoda', 'renault', 'fiat')
		)
	)
);

// Pokud bychom chtěli vytvořit kombinace několika taxonomy dohromady
// poslední pole taxonomy - stav-vozidla je použit s operatorem NOT IN. Tím říkám, že
// nechci žádné auto, které by jednu z těchto taxonomy mělo

$parametry = array(
	'post_type' => 'auto',
	'posts_per_page' => 10,
	'tax_query' => array(
		'relation' = 'AND'
		array(
			'taxonomy' => 'znacka',
			'field' => 'slug',
			'terms' => array('skoda', 'renault', 'fiat')
		),
		array(
			'taxonomy' => 'prevodovka',
			'field' => 'slug',
			'terms' => 'automaticka'
		),
		array(
			'taxonomy' => 'vybava',
			'field' => 'slug',
			'terms' => array('klimatizace', 'kozene-calouneni', 'ABS', 'EPS', 'vyhrivane-sedacky')
		),
		array(
			'taxonomy' => 'stav-vozidla',
			'field' => 'slug',
			'terms' => array('bourane', 'leasing')
			'operator' => 'NOT IN'
		)
	)
);

Jak vidíte, můžeme mít poměrně efektivní nástroj na hledání a filtrování třeba pro stránky autobazaru. Doporučím se ještě více podívat na WordPress Codexu na parametr „relation“ a „operator“ – Jsou zde prakticky všechny SQL kombinace, které by Vás mohly napadnout.

Selekce postů na základě post_meta

 



<?php

// Dejme tomu, že chceme vybrat vozy, které mají v post_meta (custom_fields)
// zavedenou hodnotu s názvem "odpocet_dph" = 'ano';

$parametry = array(
	'post_type' => 'auto',
	'posts_per_page' => 10,
	'meta_key' => 'odpocet_dph',
	'meta_value' => 'ano'
);

// Můžeme parametry i porovnávat v případě, že se jedná třeba o číslo

$parametry = array(
	'post_type' => 'auto',
	'posts_per_page' => 10,
	'meta_key' => 'auto_cena',
	'meta_value_num' => '100000'
	'meta_compare' => '>'
);

// A můžeme samozřejmě provádět i kombinace

$parametry = array(
	'post_type' => 'auto',
	'posts_per_page' => 10,
	'meta_query' => array(
		array(
			'key' => 'auto_cena',
			'value' => '100000'
			'compare' => '>'
		),
		array(
			'key' => 'auto_najeto_km',
			'value' => array(0, 70000)
			'compare' => 'BETWEEN'
		)
	)
);

Výběr dat na základě autora

Zde se již jedná o poměrně jednoduché zavedení, ale ukázat jsem to chtěl z toho důvodu, že to velmi často používám při výpisu něčeho, co uživatel sám zavedl – „Moje inzeráty“.



<?php

// Všechny zavedené auta uživatele s ID 6
$parametry = array(
	'post_type' => 'auto',
	'posts_per_page' => 10,
	'author' => 6
);

$parametry = array(
	'post_type' => 'auto',
	'posts_per_page' => 10,
	'author_name' => 'admin'
);

Objekt WP_Querey nám toho nabízí v selekci opravdu hodně. Stačí se trochu věnovat codexu a za chvíli v tom budete poměrně schopní.

Závěrem

Dnešním dílem jsem chtěl demonstrovat, jak efektivně pracovat se selekcí dat. Díky WP_Query se dají dělat velmi jednoduše různé filtrační prvky, vyhledávače, nebo výběr požadovaného druhu zboží či jiných entit. Pomocí tohoto objektu se dá prakticky selektovat každá kombinace dat.

Tomáš Kocifaj, KTStudio.cz

, , ,

  1. #1 dakarin 19.2.2014 - 08:51

    …tak toto už mi připomíná klasické programování ;-)
    učení pomocí příkladů vždy o trochu méně bolí (aspoň mě :-)
    děkuji tímto autorovi…

Komentáře jsou uzavřeny.