web-dev-qa-db-fra.com

WP_Query vs get_posts

J'ai lu un nombre de questions sur SE, mais je ne peux toujours pas comprendre la différence exacte par rapport à l'utilisation. Serait-il vrai de dire que j'utiliserais probablement WP_Query pour la majorité des boucles secondaires et n'utiliserais que get_posts si j'ai besoin des résultats retournés dans un tableau, ou le reformuler autrement est la principale différence entre les deux retour tableau/objet , ou y a-t-il un autre facteur majeur dont je devrais être au courant?

7
byronyasgur

La différence entre get_posts et WP_Query

Vous pouvez afficher get_posts() comme un WP_Query réduit. En fait, en regardant la source :

//... prepares query array $r
$get_posts = new WP_Query;
return $get_posts->query($r);

get_posts() utilise WP_Query, mais ne renvoie qu'un tableau de publications - rien de plus. En outre, il définit:

$r['no_found_rows'] = true;

Normalement (par défaut avec l'objet WP_Query) - WordPress demande combien de messages il y a au total - même si vous ne le faites qu'après le premier 10. Il le fait pour pouvoir effectuer la pagination. Donc, get_posts() est en fait (légèrement) plus rapide (il ignore également les posts collants).

Lequel utiliser ...

Si vous avez seulement besoin d’un tableau d’articles, et que besoin de l’objet de requête -use get_posts(). Sinon, si vous avez besoin de l'accès aux méthodes d'objet de requête, à la pagination ou aux publications persistantes en haut, vous devez utiliser WP_Query.

18
Stephen Harris

Une chose importante à noter est que get_posts() a un tas d’arguments par défaut que new WP_Query() n’a pas, qui incluent post_type et post_status. Les valeurs par défaut de la fonction sont configurées pour faciliter l'obtention des publications. Si vous voulez quelque chose de différent, vous devrez indiquer explicitement ces paramètres, alors qu'avec WP_Query(), vous n'auriez pas à le faire.

Par exemple, si vous souhaitez obtenir toutes les publications, quel que soit leur statut, vous devez appeler: get_posts( array( "post_type" => 'any' ) ); (laissant "post_type" vide - ou tout ce que empty() donnerait comme valeur true obligera get_posts() à appliquer sa valeur par défaut de "publish" ").

2
Tom Auger