it-swarm.dev

Kdy byste měli použít WP_Query vs query_posts () vs get_posts ()?

Zdá se, že je to polovina tutoriálů v Codexu a kolem blogosphere use query_posts() a polovičního použití WP_Query . O co jde?

412
Dan Gayle
  • query_posts() je příliš zjednodušující a problematický způsob, jak změnit hlavní dotaz na stránku nahrazením nové instance dotazu. Je neefektivní (znovu spouští dotazy SQL) a za určitých okolností bude zcela neúspěšné (obzvláště často, když se jedná o stránkování stránek). Jakýkoli moderní WP kód by měl pro tento účel používat spolehlivější metody, jako je použití pre_get_posts hook. TL; DR nepoužívejte query_posts () ever .

  • get_posts() je velmi podobný v použití a přijímá stejné argumenty (s některými nuancemi, jako jsou různé výchozí hodnoty), ale vrací pole příspěvků, nemění globální proměnné a je bezpečné používat kdekoli.

  • WP_Query je třída, která pohání oběma scénami, ale můžete také vytvořit a pracovat s vlastní instancí. Trochu složitější, méně omezení, také bezpečné použití kdekoli.

  

658
Rarst

query_posts - Nikdy byste neměli nikdy používat query_posts. Kromě toho, co @Rarst řekl, je opravdu velký problém s query_posts, že rozbije hlavní objekt dotazu (uložený v souboru $wp_query). Spousta zásuvných modulů a vlastního kódu se opírá o hlavní objekt dotazu, takže porušování hlavního objektu dotazu znamená, že porušujete funkce zásuvných modulů a vlastní kód. Jen jedna taková funkce je důležitá funkce stránkování, takže pokud rozbijete hlavní dotaz, zlomíte stránkování.

Chcete-li prokázat, jak špatné query_posts je na jakékoli šabloně, proveďte následující a porovnejte výsledky

var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );

get_posts a WP_Query jsou správným způsobem konstruování sekundární dotazy (jako související příspěvky, posuvníky, doporučený obsah a obsah na statických předních stránkách) s. Je třeba poznamenat, že byste neměli používat žádný ze dvou ve prospěch hlavního dotazu na domovské stránce, jedné stránce nebo na jakémkoli typu archivní stránky, protože bude porušovat funkčnost stránky. Pokud potřebujete změnit hlavní dotaz, použijte pre_get_posts, a ne vlastní dotaz. (UPDATE:Pro statické přední stránky a pravé stránky viz Použití pre_get_posts na pravdivých stránkách a statických titulních stránkách *)

WP_Query je v podstatě používán hlavním dotazem a je také používán get_posts, ale i když get_posts() používá WP_Query, existuje několik rozdílů

  • get_posts jsou rychlejší než WP_Query. Marže závisí na celkovém počtu příspěvků webu. Důvodem je get_posts předává 'no_found_rows' => true standardně WP_Query, které přeskakuje/legálně přerušuje stránkování. S 'no_found_rows' => true, WP_Query dostane množství dotazů dotazovaných, pak odejde, kde ve výchozím nastavení vyhledává všechny příspěvky odpovídající dotazu za účelem výpočtu stránkování.

    Z tohoto důvodu by get_posts() mělo být použito pouze pro nestigované dotazy. Paginování get_posts je opravdu jeden velký nepořádek. WP_Query by měl být použit pro všechny stránkované dotazy

  • get_posts() nejsou ovlivňovány filtry posts_*, kde WP_Query ovlivňují tyto filtry. Důvodem je, že get_posts standardně předává 'suppress_filters' => true do WP_Query

  • get_posts má několik dalších parametrů, jako je include, exclude, numberposts a category. Tyto parametry se změní na platné parametry pro WP_Query předtím, než jsou předány WP_Query. include se změní na post__in, exclude do post__not_in, category do cat a numberposts do posts_per_page. Pouze poznámka all parametrů, které mohou být předány WP_Query pracuje s get_posts, vy can ignore a nepoužívejte výchozí parametry get_posts

  • get_posts vrátí pouze vlastnost $postsWP_Query, zatímco WP_Query vrátí celý objekt. Tento objekt je velmi užitečný, pokud jde o podmínky, stránkování a další užitečné informace, které lze použít uvnitř smyčky.

  • get_posts nepoužívá smyčku, ale smyčku foreach k zobrazení příspěvků. Ve výchozím nastavení nejsou také k dispozici žádné značky šablon. setup_postdata( $post ) musí být použito pro zpřístupnění tagů šablony. WP_Query používá značky smyčky a šablony jsou ve výchozím nastavení k dispozici

  • get_posts předá 'ignore_sticky_posts' => 1 do WP_Query, takže get_posts implicitně ignoruje sticky posts

Na základě výše uvedeného, ​​zda použít get_posts nebo WP_Query, záleží na vás a na tom, co ve skutečnosti potřebujete z dotazu. Výše uvedené by vás mělo vést ve vašem výběru

60
Pieter Goosen

Základní rozdíl je v tom, že query_posts() je opravdu jen pro úpravu aktuální smyčky. Jakmile budete hotovi, je nutné resetovat smyčku a poslat ji na její veselé cestě. Tato metoda je také o něco snazší pochopit, jednoduše proto, že váš "dotaz" je v podstatě řetězec URL, který předáte funkci, jako je:

query_posts('meta_key=color&meta_value=blue'); 

Na druhou stranu, WP_Query je spíše nástrojem pro obecné účely a je spíše jako přímo psát MySQL dotazy než query_posts() je. Můžete ji také použít kdekoli (nejen v Loopu) a nenarušuje žádné momentálně spuštěné dotazy.

Mám tendenci používat WP_Query častěji, jak se to děje. Opravdu, bude to jít do vašeho konkrétního případu.

31
nickmjones

query_posts() prostě není třeba používat. Jediné, co dělá, je vytvoření nového objektu WP_Query a přiřazení nového objektu k global wp_query.

Pro informaci je následující skutečná query_posts() funkce.

 function query_posts($query) {
        $GLOBALS['wp_query'] = new WP_Query();
        return $GLOBALS['wp_query']->query($query);
    }

Instantiate vlastního objektu WP_Query, pokud chcete vytvořit skript vlastního hloubkového dotazu. Nebo použijte get_posts() pokud vše, co potřebujete udělat, je lehká manipulace sem a tam.

V obou případech vřele doporučuji udělat si laskavost a jít do wp_includes/query.php a prohlédnout si třídu WP_Query.

15
RebelPhoenix

Ujistěte se, že používáte wp_reset_query() po použití query_posts() protože to ovlivní i další výsledek dotazu.

14

Pokud si vzpomínám, že čtení vpravo, v podstatě "smyčka" dělá WP_Query v základních souborech, ale ve snazším pochopení.

10
tw2113
  • query_posts () : může být použito v jednom případě, pokud potřebujete změnit hlavní dotaz. Nastavuje mnoho globálních proměnných;
  • get_posts () : je velmi podobný v mechanice a přijímá stejné argumenty, ale vrací pole příspěvků
  • WP_Query : můžete vytvořit a pracovat s vlastním objektem. Bit složitější, méně omezení, je bezpečné používat kdekoli.
6
dalveer