Il y a deux query_posts()
fonctions techniquement parlant. L'un query_posts()
est en fait WP_Query::query_posts()
et l'autre est dans l'espace mondial.
Demande de raison:
Si global query_posts()
est ce "mal", pourquoi n'est-il pas déconseillé?
Ou pourquoi n'est pas marqué comme _doing_it_wong
.
query-posts
prosti
la source
la source
Réponses:
Question essentielle
La fouille Let dans le trio:
::query_posts
,::get_posts
etclass WP_Query
de comprendre::query_posts
mieux.La pierre angulaire pour obtenir les données dans WordPress est la
WP_Query
classe. Les deux méthodes::query_posts
et::get_posts
utilisent cette classe.Comprendre le
WP_Query
Voici la
WP_Query
structure:WP_Query
est le couteau suisse.Quelques points sur
WP_Query
:pre_get_posts
crochet pratiqueJe ne peux pas expliquer tout cela, mais certains d'entre eux sont délicats, alors fournissons de courts conseils.
WP_Query
est quelque chose que vous pouvez contrôler via les arguments que vous passezCe serait l'exemple minimal de création de l'
WP_Query
objet à partir des arguments:WP_Query
est gourmandCréés sur l'idée, les
get all you can
développeurs WordPress ont décidé d'obtenir toutes les données possibles le plus tôt possible, car cela est bon pour les performances . C'est pourquoi par défaut, lorsque la requête prend 10 articles de la base de données, elle obtiendra également les termes et les métadonnées de ces articles via des requêtes distinctes. Les termes et métadonnées seront mis en cache (prélecture).Vous pouvez désactiver la mise en cache si vous définissez
update_post_meta_cache
etupdate_post_term_cache
surfalse
lors de la définition desWP_Query
arguments. Lorsque la mise en cache est désactivée, les données ne seront demandées à la base de données que sur demande.Pour la majorité des blogs WordPress, la mise en cache fonctionne bien, mais il peut arriver que vous désactiviez la mise en cache.
WP_Query
utilise des classes d'assistanceSi vous avez coché les
WP_Query
champs, vous avez les trois suivants:Vous pouvez imaginer en ajouter de nouveaux à l'avenir.
WP_Query
détient la substance pour bouclerDans ce code:
vous remarquerez peut-être la
WP_Query
substance que vous pouvez parcourir. Les méthodes d'assistance existent également. Vous venez de définir lawhile
boucle.WP_Query
primaire et secondaireDans WordPress, vous avez une requête principale et zéro ou plusieurs requêtes secondaires .
Requête principale connue sous le nom de requête principale ou requête régulière . La requête secondaire est également appelée requête personnalisée .
WordPress utilise la
WP_Rewrite
classe tôt pour créer les arguments de requête basés sur l'URL. Sur la base de ces arguments, il stocke les deux objets identiques dans l'espace global. Les deux contiendront la requête principale.Lorsque nous disons requête principale, nous pensons à ces variables. D'autres requêtes peuvent être appelées secondaires ou personnalisées.
WP_Query
a lepre_get_posts
crochet pratique .Ceci est le crochet d'action. Il s'appliquera à toute
WP_Query
instance. Vous l'appelez comme:Ce crochet est génial et il peut modifier tous les arguments de requête.
Voici ce que vous pouvez lire :
Ce crochet est donc le gestionnaire d'arguments mais ne peut pas créer de nouveaux
WP_Query
objets. Si vous aviez une requête principale et une requête secondaire,pre_get_posts
vous ne pouvez pas créer la troisième. Ou si vous venez d'avoir un primaire, il ne peut pas créer le secondaire.WP_Query
prend en charge les boucles imbriquéesVoici l'exemple de vitrine WordPress a des fonctions d'assistance même pour les boucles imbriquées:
La sortie sera comme ceci depuis que j'ai installé les données de test d'unité de thème :
Même si j'ai demandé 5 messages dans la requête $ personnalisée, il m'en retournera six, car le message collant ira de pair. S'il n'y en a pas
wp_reset_postdata
dans l'exemple précédent, la sortie sera comme ceci, car elle$GLOBALS['post']
ne sera pas valide.WP_Query
a unewp_reset_query
fonctionC'est comme un bouton de réinitialisation.
$GLOBALS['wp_the_query']
devrait être gelé tout le temps, et les plugins ou les thèmes ne devraient jamais le modifier.Voici ce que
wp_reset_query
font:Remarques sur
get_posts
get_posts
ressemble àIl est juste un wrapper autour
WP_Query
que le rendement des messages de l' objet de la requête.La valeur
ignore_sticky_posts
true signifie que les poteaux collants peuvent apparaître uniquement dans une position naturelle. Il n'y aura pas de poteaux collants à l'avant. L'autre valeurno_found_rows
true signifie que l'API de base de données WordPress ne sera pas utiliséeSQL_CALC_FOUND_ROWS
pour implémenter la pagination, réduisant ainsi la charge sur la base de données pour exécuter le nombre de lignes trouvées .C'est pratique lorsque vous n'avez pas besoin de pagination. Nous comprenons maintenant que nous pouvons imiter cette fonction avec cette requête:
Voici la requête SQL correspondante:
Comparez ce que nous avons maintenant avec la requête SQL précédente où elle
SQL_CALC_FOUND_ROWS
existe.La demande sans
SQL_CALC_FOUND_ROWS
sera plus rapide.Remarques sur
query_posts
query_posts()
estWP_Query
wrapper. Il renvoie la référence à l'WP_Query
objet principal et en même temps, il définit leglobal $wp_query
.En PHP4, tout, y compris les objets, était passé par valeur.
query_posts
était comme ça:Veuillez noter que dans un scénario typique avec une requête principale et une requête secondaire, nous avons ces trois variables:
Disons que chacun de ces trois prend 1M de mémoire. Le total serait de 3 m de mémoire. Si nous utilisons
query_posts
,$GLOBALS['wp_query']
sera non défini et créé à nouveau.PHP5 + devrait être intelligent en vidant l'
$GLOBALS['wp_query']
objet, tout comme en PHP4 nous l'avons fait avec leunset($GLOBALS['wp_query']);
Par conséquent,
query_posts
consomme 2M de mémoire au total, tandis queget_posts
consomme 3 M de mémoire.Notez que
query_posts
nous ne retournons pas l'objet réel, mais une référence à l'objet.Voici un exemple
Résultera:
Essayez de réinitialiser la requête:
Résultera:
Vous pouvez créer des problèmes même si vous utilisez
WP_Query
Bien sûr, la solution serait de réutiliser la
wp_reset_query
fonction.C'est pourquoi je pense que cela
query_posts
peut être mieux du point de vue de la mémoire. Mais vous devriez toujours faire deswp_reset_query
tours.la source
Je viens de créer un nouveau ticket trac, ticket # 36874 , pour proposer la dépréciation de
query_posts()
. Que ce soit ou non accepté reste une bonne question.Le vrai gros problème avec
query_posts()
, c'est qu'il est encore largement utilisé par les plugins et les thèmes, même s'il y a eu de très bons écrits sur le pourquoi de JAMAIS JAMAIS l' utiliser. Je pense que le post le plus épique ici sur WPSE est le suivant:suppression de deprecation! == , donc obsolète
query_posts()
n'empêchera pas son utilisation par les développeurs de mauvaise qualité et les personnes en général qui ne connaissent pas WordPress et qui utilisent des tutoriels de mauvaise qualité comme lignes directrices. Tout comme une preuve, combien de questions recevons-nous encore là où les gens utilisentcaller_get_posts
dansWP_Query
? Il est obsolète depuis de nombreuses années maintenant.Les fonctions et arguments obsolètes peuvent cependant être supprimés à tout moment que les développeurs principaux jugent opportun, mais cela ne se produira probablement jamais avec
query_posts()
car cela entraînera la rupture de millions de sites. Alors oui, nous ne verrons probablement jamais la suppression totale dequery_posts()
- ce qui pourrait conduire au fait qu'il ne sera probablement jamais obsolète.C'est un point de départ, mais il faut se rappeler que la dépréciation de quelque chose dans WordPress n'arrête pas son utilisation.
MISE À JOUR 19 mai 2016
Le ticket que j'ai soulevé est maintenant fermé et marqué comme dupliqué sur un ticket de 4 ans , qui a été fermé comme wontfix et a été rouvert et reste ouvert et non résolu.
Il semble que les développeurs principaux s'accrochent à ce vieux petit mal fidèle. Tout le monde est intéressé, voici le ticket de 4 ans en double
la source
[un peu coup de gueule]
C'est la philosophie de base à ce stade que rien n'est vraiment déconseillé. L'avis de dépréciation, bien qu'il soit agréable à avoir, sera simplement ignoré si la fonction ne sera pas supprimée à un moment donné. Il y a beaucoup de gens qui ne se développent pas avec
WP_DEBUG
et ne remarqueront pas l'avis s'il n'y aura pas de rupture réelle.OTOH part, cette fonction est comme une
goto
déclaration. Personnellement, je n'ai jamais (pour une définition plus petite que prévu) utiliségoto
mais je peux comprendre les arguments pointant vers une situation dans laquelle ce n'est pas mal par défaut. Il en va de mêmequery_posts
, c'est un moyen simple de configurer tous les globaux requis pour faire une boucle simple, et peut être utile dans le contexte ajax ou rest-api. Je ne l'emploierais jamais dans ces contextes aussi, mais je peux voir que là, c'est plus une question de style de codage qu'une fonction étant mauvaise en soi.En allant un peu plus loin, le principal problème est que les globaux doivent être définis. C'est le problème principal, pas la seule fonction qui aide à les définir.
la source
query_posts
plus lent qu'une requête secondaire (lire: pas la requête principale).query_posts
lui - même mais la requête inutile qui a été faite lors du chargement de WP