Question

Il semble que la moitié des tutoriels dans le Codex et autour de l'utilisation de la blogosphère query_posts() et l'utilisation moitié WP_Query . Quel est le problème?

Était-ce utile?

La solution

  • query_posts() est trop simpliste et un moyen problématique pour modifier la requête principale d'un page en le remplaçant par nouvelle instance de la requête. Il est inefficace (rediffusions des requêtes SQL) et l'échec pur et simple dans certaines circonstances (en particulier souvent lorsqu'ils traitent avec des messages de pagination). Tout code WP moderne doit utiliser des méthodes plus fiables, comme faisant usage de la pre_get_posts crochet, à cet effet. TL; DR. ne pas utiliser query_posts () jamais

  • get_posts() est très similaire dans l'usage et accepte les mêmes arguments (avec quelques nuances , comme les différents paramètres par défaut), mais retourne un tableau de messages, ne modifie pas les variables globales et est sûr à utiliser partout.

  • WP_Query est la classe qui alimente à la fois dans les coulisses, mais vous pouvez aussi créer et travailler avec votre propre instance. Un peu plus complexe, moins de restrictions, aussi sûr à utiliser partout.

Autres conseils

query_posts - Vous devez jamais utiliser query_posts. En dehors de ce @Rarst a dit, la question vraiment grande avec query_posts est, il casse le principal objet de requête (stocké dans $wp_query). Beaucoup de plugins et du code personnalisé repose sur l'objet principal de la requête, rompant ainsi le principal moyen d'objets de requête que vous violez les fonctionnalités de plug-ins et le code personnalisé. Juste une telle fonction est la toute fonction importante pagination, donc si vous cassez la requête principale, vous cassez la pagination.

Pour prouver à quel point query_posts est, sur un modèle, procédez comme suit et comparer les résultats

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

get_posts et WP_Query sont la bonne façon de construire secondaires requêtes ( comme messages connexes, curseurs, contenu en vedette et le contenu sur les pages avant statique ) avec. Il convient de noter, vous ne devriez pas utiliser l'un des deux en faveur de la requête principale sur la page d'accueil, une seule page ou tout autre type de page archives, car cela casserait la fonctionnalité de page. Si vous devez modifier la requête principale, utilisez pre_get_posts de le faire, et non pas une requête personnalisée. ( Mise à jour: Pour les pages statiques avant et vraies pages, voir Utilisation de pre_get_posts sur les pages vraies et * de pages statiques avant)

En substance, WP_Query est utilisé par la requête principale et est également utilisé par get_posts, mais bien que get_posts() utilise WP_Query, il y a quelques différences

  • get_posts sont plus rapides que WP_Query. La marge dépend du montant de tous les messages du site. La raison est, get_posts passe 'no_found_rows' => true par défaut à WP_Query qui skips / casse légalement la pagination. Avec 'no_found_rows' => true, WP_Query obtient la quantité de messages interrogés, puis renfloue, où par défaut, il recherche supplémentaire pour tous les messages correspondant à la requête pour la pagination de calcul.

    Pour cette raison, get_posts() doit être utilisé pour les requêtes non paginés seulement. Pagination get_posts est vraiment un grand désordre. WP_Query doit être utilisé pour toutes les requêtes paginé

  • get_posts() ne sont pas influencés par les filtres posts_* où se WP_Query influencés par ces filtres. La raison est que get_posts, par défaut, passe 'suppress_filters' => true à WP_Query

  • get_posts a quelques paramètres supplémentaires comme include, exclude, numberposts et category. Ces paramètres ne soient modifiés dans les paramètres valides pour WP_Query avant d'être passé à WP_Query. include se transforme en post__in, exclude en post__not_in, category dans cat et numberposts en posts_per_page. Juste une remarque, tous des paramètres qui peuvent être transmis à des œuvres de WP_Query avec get_posts, vous peut ignorer et ne pas utiliser les paramètres par défaut de get_posts

  • retourne get_posts juste la propriété de $posts de WP_Query tandis que WP_Query retourne l'objet complet. Cet objet est très utile en ce qui concerne, conditionals et d'autres informations de pagination utiles qui peuvent être utilisés dans la boucle.

  • get_posts ne pas utiliser la boucle, mais une boucle de foreach à des postes d'affichage. En outre, aucune balise de modèle sont disponibles par défaut. setup_postdata( $post ) doit être utilisé pour fabriquer les balises de modèle disponibles. WP_Query utilise les balises de boucle et de modèle sont disponibles par défaut

  • get_posts passe 'ignore_sticky_posts' => 1 à WP_Query, donc get_posts par défautPost-it Post ignore les

Sur la base de ce qui précède, que ce soit à l'utilisation get_posts ou WP_Query est à vous et qu'est-ce que vous avez réellement besoin de la requête. Il devrait être ainsi vous guider dans votre choix

La différence fondamentale est que query_posts() est vraiment seulement pour modifier la boucle de courant. Une fois que vous avez terminé, il est nécessaire de réinitialiser la boucle et l'envoyer sur son chemin joyeux. 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 passez à la fonction, comme suit:

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

Par contre, WP_Query est plus d'un outil d'usage général, et est plus comme écrire directement des requêtes MySQL que query_posts() est. Vous pouvez également l'utiliser partout (et pas seulement dans la boucle) et il ne gêne pas les requêtes poste en cours d'exécution.

Je tendance à utiliser plus souvent WP_Query, comme il arrive. Vraiment, il va descendre à votre cas spécifique.

Il est tout simplement pas besoin d'utiliser query_posts(). Tout ce qu'il fait est instancie un nouvel objet WP_Query et réaffecte ce nouvel objet à global wp_query.

Pour référence, ce qui suit est que la fonction query_posts() réelle.

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

Instantiate votre propre objet WP_Query si vous souhaitez créer un dans le script de requête de profondeur personnalisée. Ou utilisez get_posts() si tout ce que vous devez faire est une manipulation de lumière ici et là.

Dans les deux cas, je vous recommande vivement vous faire une faveur et aller à wp_includes/query.php et lisant attentivement la classe WP_Query.

Assurez-vous que vous utilisez wp_reset_query() après avoir utilisé query_posts() car elle aura une incidence sur les autres résultats de la requête également.

Si je me souviens avoir lu droit, essentiellement « la boucle » fait WP_Query dans les fichiers de base, mais un moyen plus facile de comprendre la manière.

      
  • query_posts () : peut être utilisé dans un seul cas et si vous avez besoin de modifier principale requete . Il met beaucoup de variables globales;
  •   
  • get_posts () : il est très similaire en mécanique et accepte mêmes arguments, mais revient tableau des messages
  •   
  • WP_Query : vous pouvez créer et travailler avec son propre objet. Peu plus complexe, moins de restrictions, il est sûr d'utiliser partout.

Je dirais que ne pas utiliser get_posts() dans un plug-in. Il impose très filtres restrictifs dans certains cas (l'ensemble de suppress_filters de, ignore_sticky_posts, etc.) et doit être utilisé probablement dans un thème quand vous voulez quelque chose rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top