web-dev-qa-db-fra.com

Alternative à query_posts pour la boucle principale?

Duplicate possible:
Quand utiliser WP_query (), query_posts () et pre_get_posts

Je viens de remarquer aujourd’hui que la documentation de query_posts () mentionne certains "inconvénients" de l’utilisation de query_posts pour modifier la boucle principale, notamment: "provoque des requêtes SQL supplémentaires".

Cela semble impliquer qu'il existe un autre moyen/un meilleur moyen. Évidemment, il y a get_posts () et WP_Query pour les boucles secondaires, mais je ne les vois pas pour remédier aux "inconvénients" énumérés dans la documentation du Codex.

Je peux voir qu’en attendant d’être dans le modèle pour exécuter query_posts, WordPress a déjà lancé une requête une fois. Il s’agit maintenant d’une seconde requête qui masque la première (la première étant fondamentalement ignorée). Cela sonne vraiment inefficace (mais peut-être pas un gros problème, qui sait?)

Ma question est la suivante: existe-t-il une alternative à query_posts qui N'Ajoute PAS "de requêtes SQL supplémentaires" ou la documentation du Codex est-elle simplement trompeuse?

15
Tom Auger

Lorsque j'ai ajouté les inconvénients au Codex, je pensais principalement à utiliser le filtre "request" comme alternative à query_posts ().

Ce filtre n'est exécuté que pour la requête principale, ce qui résout le problème de 'pre_get_posts', qui se déclenche pour chaque requête.

L'inconvénient est que vous n'avez pas accès aux indicateurs de requête tels que is_single (), etc.

Voici un moyen d’y accéder sans passer par les requêtes SQL:

function alter_the_query( $request ) {
    $dummy_query = new WP_Query();  // the query isn't run if we don't pass any query vars
    $dummy_query->parse_query( $request );

    // this is the actual manipulation; do whatever you need here
    if ( $dummy_query->is_home() )
        $request['category_name'] = 'news';

    return $request;
}
add_filter( 'request', 'alter_the_query' );
19
scribu