web-dev-qa-db-fra.com

Fractionner la requête principale en plusieurs boucles avec query_posts et/ou pre_get_posts?

J'ai un type de message personnalisé "événements", auquel j'ai associé une taxonomie personnalisée "calendrier". Le calendrier comporte 12 trimestres fixes, pour chaque mois de l'année ("août", "octobre", "novembre", etc.).

Je suis en train de créer la page d'archive pour le type de message 'events'. Je pensais afficher 12 listes différentes de maximum 10 posts chacune, pour chaque mois de l'année == termes dans la taxonomie du "calendrier".

Comme il s’agirait d’une page d’archive, Wordpress aurait déjà interrogé la base de données pour connaître le type de post "événements". J'étais sur le point d'utiliser query_posts pour modifier la requête principale, mais je me suis soudainement demandé s'il existait un meilleur moyen d'optimiser l'utilisation de la requête par défaut. query_posts jetterait essentiellement la requête principale et avec 12 listes à générer, cela entraînerait plus de hits dans la base de données.

Quelle est la meilleure pratique pour ce cas?

Souhaitez-vous simplement exécuter 12 instances de query_posts, une pour chaque liste, ou préférez-vous faire autre chose, c'est-à-dire avec pre_get_posts ou quelque chose?

merci de partager vos idées

2
unfulvio

N'utilisez pas query_posts(). Ne modifiez pas la requête de la boucle principale à partir du modèle.

Vous pouvez pouvoir obtenir une requête unique pour vous fournir ce dont vous avez besoin (par exemple, en filtrant pre_get_posts et groupby), mais vous devrez probablement itérer 12 boucles personnalisées à l'aide de WP_Query(). Peut-être quelque chose comme ça:

// Get all the months
$months = get_terms( $calendar );

// Set up the base query args
$events_query_args = array(
    'post_type' => 'events',
    'post_per_page' => 10,
    'tax_query' => array(
        array(
            'taxonomy' => 'calendar',
            'field' => 'slug',
            'terms' => ''
        )
    )
);

// Loop through the months, and
// output a custom query and loop
// for each
foreach ( $months as $month ) {

    // Add $month to the query args
    $events_query_args['tax_query']['terms'] = $month['slug'];

    // Build the query
    $events_query = new WP_Query( $events_query_args );

    // Open the query loop
    if ( $events_query->have_posts() ) : while ( $events_query->have_posts() ) : $events_query->the_post();

        // YOUR LOOP CODE GOES HERE

    // Close the loop
    endwhile; endif;

    // Clean up
    $events_query = null;
    wp_reset_postdata()
}

Vous devrez bien sûr ajouter le balisage de sortie de boucle réel.

2
Chip Bennett

Je ne peux trouver aucune raison pour laquelle vous ne voudriez pas interroger la base de données 12 fois si vous avez besoin de 12 ensembles de publications individuels, sauf lorsque vous utilisez un site comme CNN ou NYT, où les chiffres importants comptent. Vous pouvez exécuter une requête unique pour toutes les publications de cette taxonomie et utiliser PHP pour les diviser par catégorie, mais au final, cela ne semble pas une bonne idée car ce n'est tout simplement pas ce que PHP est pour.

Si les ressources vous inquiètent: utilisez l’API transitoires pour mettre en cache votre requête. ( Exemple )

Si vous souhaitez modifier la boucle principale: appelez simplement wp_reset_query après avoir terminé.

1
Jan Beck