Il semble que la moitié des didacticiels du Codex et de la blogosphère soient utilisés query_posts()
et utilisés à moitié WP_Query
. Quel est le problème?
wp-query
query-posts
query
get-posts
Dan Gayle
la source
la source
Réponses:
query_posts()
est trop simpliste et une façon problématique de modifier la requête principale d’une page en la remplaçant par une nouvelle instance de la requête. Il est inefficace (ré-exécute les requêtes SQL) et échouera carrément dans certaines circonstances (particulièrement lorsqu'il s'agit de pagination de messages). Tout code WP moderne devrait utiliser des méthodes plus fiables, comme l’utilisation dupre_get_posts
crochet, à cette fin. TL; DR n'utilise jamais query_posts () .get_posts()
son utilisation est très similaire et accepte les mêmes arguments (avec quelques nuances, comme des valeurs par défaut différentes), mais renvoie un tableau de publications, ne modifie pas les variables globales et peut être utilisée n'importe où.WP_Query
est la classe qui alimente les deux dans les coulisses, mais vous pouvez également créer et travailler avec votre propre instance. Un peu plus complexe, moins de restrictions, également sûr à utiliser n'importe où.la source
query_posts()
est une fonction d'emballage minusculeWP_Query
, sa seule chose supplémentaire à faire (comme le montre l'organigramme) est de remplacer tout le monde$wp_query
query_posts()
parWP_Query
ne fera aucune différence en termes de performances, la requête de la page d'origine sera toujours exécutée car elle fait partie de la charge principale. Ces requêtes seront exécutées même si votre fichier de modèle n'a aucune boucle.query_posts
ne pas modifier la boucle principale du tout, il remplace ce après avoir déjà exécuté. La meilleure façon de modifier la boucle principale consiste àpre_get_posts
utiliser un filtre. developer.wordpress.com/2012/05/14/…query_posts
- Vous ne devriez jamais utiliserquery_posts
. Mis à part ce que @Rarst a dit, le problème le plus gravequery_posts
est qu'il casse l'objet de requête principal (stocké dans$wp_query
). Un grand nombre de plugins et de code personnalisé reposent sur l'objet de requête principal. Par conséquent, le fait de casser l'objet de requête principal signifie que vous cassez les fonctionnalités des plugins et du code personnalisé. Une de ces fonctions est la très importante fonction de pagination. Par conséquent, si vous cassez la requête principale, vous cassez la pagination.Pour prouver à quel point
query_posts
un modèle est mauvais , procédez comme suit et comparez les résultatsget_posts
etWP_Query
constituent le moyen approprié de créer des requêtes secondaires ( telles que des publications connexes, des curseurs, du contenu en vedetteet du contenu sur des pages de couverture statiques) avec. Il convient de noter que vous ne devez utiliser aucun des deux en faveur de la requête principale sur la page d'accueil, une page unique ou tout type de page d'archive, car cela casserait la fonctionnalité de la page. Si vous devez modifier la requête principale, utilisezpre_get_posts
pour cela, et non une requête personnalisée. ( UPDATE: pour les pages de garde statiques et les pages vraies, voir Utilisation de pre_get_posts sur les pages vraies et les pages de couverture statiques *)Essentiellement,
WP_Query
est utilisé par la requête principale et est également utilisé parget_posts
, mais bien que desget_posts()
utilisationsWP_Query
, il y a quelques différencesget_posts
sont plus rapides queWP_Query
. La marge dépend du nombre total de messages du site. La raison en est,get_posts
passe'no_found_rows' => true
par défaut àWP_Query
qui saute / légalement rompt la pagination. Avec'no_found_rows' => true
,WP_Query
obtient le nombre de messages demandés, puis abandonne. Par défaut, il recherche davantage tous les messages correspondant à la requête afin de calculer la pagination.Pour cette raison,
get_posts()
ne devrait être utilisé que pour les requêtes non paginées. Paginerget_posts
est vraiment un gros bazar.WP_Query
devrait être utilisé pour toutes les requêtes paginéesget_posts()
ne sont pas influencés par lesposts_*
filtres là où ilsWP_Query
sont influencés. La raison en est queget_posts
, par défaut, passe'suppress_filters' => true
àWP_Query
get_posts
a quelques paramètres supplémentaires commeinclude
,exclude
,numberposts
etcategory
. Ces paramètres sont modifiés en paramètres validesWP_Query
avant d'être passés àWP_Query
.include
se transforme enpost__in
,exclude
enpost__not_in
,category
encat
etnumberposts
enposts_per_page
. Juste une note, tous les paramètres qui peuvent être passés àWP_Query
fonctionne avecget_posts
, vous pouvez ignorer et ne pas utiliser les paramètres par défaut deget_posts
get_posts
renvoie uniquement la$posts
propriété deWP_Query
whileWP_Query
renvoie l'objet complet. Cet objet est très utile quand il s’agit de conditions, de pagination et d’autres informations utiles pouvant être utilisées dans la boucle.get_posts
n'utilise pas la boucle, mais uneforeach
boucle pour afficher les messages. En outre, aucune balise de modèle n'est disponible par défaut.setup_postdata( $post )
doit être utilisé pour rendre les balises de modèle disponibles.WP_Query
utilise la boucle et les balises de modèle sont disponibles par défautget_posts
passe'ignore_sticky_posts' => 1
àWP_Query
, doncget_posts
ignore par défaut les posts collantsSur la base de ce qui précède, utilisez-vous
get_posts
ouWP_Query
décidez-vous et qu'avez-vous besoin de la requête? Ce qui précède devrait vous guider dans votre choixla source
La différence fondamentale est qu’il
query_posts()
s’agit en réalité uniquement de modifier la boucle en cours. Une fois que vous avez terminé, il est nécessaire de réinitialiser la boucle et de l’envoyer en joyeux chemin. Cette méthode est aussi un peu plus facile à comprendre, tout simplement parce que votre "requête" est essentiellement une chaîne d’URL que vous transmettez à la fonction, comme ceci:D'autre part,
WP_Query
c'est plus un outil à usage général et ressemble plus à l'écriture directe de requêtes MySQL que cequery_posts()
n'est le cas. Vous pouvez également l'utiliser n'importe où (pas seulement dans la boucle) et cela n'interfère pas avec les requêtes post en cours d'exécution.J'ai tendance à utiliser
WP_Query
plus souvent, comme cela arrive. Vraiment, cela dépendra de votre cas particulier.la source
Il n'y a tout simplement pas besoin d'utiliser
query_posts()
. Tout ce qu'il fait, c'est instancier un nouvel objet WP_Query et le réaffecterglobal wp_query
.Pour référence, ce qui suit est cette
query_posts()
fonction réelle .Instanciez votre propre objet WP_Query si vous souhaitez créer un script de requête personnalisé détaillé. Ou utilisez
get_posts()
si tout ce que vous avez à faire est une légère manipulation ici et là.Dans les deux cas, je vous recommande vivement vous faire une faveur et d' aller
wp_includes/query.php
et lisant attentivement laWP_Query
classe.la source
Assurez-vous que vous utilisez
wp_reset_query()
après avoir utilisé,query_posts()
car cela affectera également le résultat de la requête.la source
Si je me souviens bien d'avoir lu, l'essentiel est "la boucle"
WP_Query
dans les fichiers de base, mais d'une manière plus facile à comprendre.la source
la source
Je dirais ne pas utiliser
get_posts()
dans un plugin. Il impose des filtres très restrictives dans certains cas (set desuppress_filters
,ignore_sticky_posts
, etc.) doivent être utilisés probablement dans un thème quand vous voulez quelque chose rapide.la source