Même si cette question est ancienne, je la poserai ici au cas où quelqu'un provenant d'une recherche Google aurait besoin d'une réponse plus flexible.
Au fil du temps, j'ai développé une solution WP_Query
agnostique pour être ou requête globale. Lorsque vous utilisez une personnalisation WP_Query
, vous êtes limité à utiliser uniquement include
ou require
à pouvoir utiliser les variables sur votre $custom_query
, mais dans certains cas (ce qui est le plus souvent le cas pour moi!), Les parties de modèle que je crée sont parfois utilisées dans une requête globale (tels que les modèles d'archives) ou dans un format personnalisé WP_Query
(comme interroger un type de message personnalisé sur la première page). Cela signifie que j'ai besoin d'un compteur pour être globalement accessible quel que soit le type de requête. WordPress ne le rend pas disponible, mais voici comment y arriver grâce à certains crochets.
Placez ceci dans vos fonctions.php
/**
* Create a globally accessible counter for all queries
* Even custom new WP_Query!
*/
// Initialize your variables
add_action('init', function(){
global $cqc;
$cqc = -1;
});
// At loop start, always make sure the counter is -1
// This is because WP_Query calls "next_post" for each post,
// even for the first one, which increments by 1
// (meaning the first post is going to be 0 as expected)
add_action('loop_start', function($q){
global $cqc;
$cqc = -1;
}, 100, 1);
// At each iteration of a loop, this hook is called
// We store the current instance's counter in our global variable
add_action('the_post', function($p, $q){
global $cqc;
$cqc = $q->current_post;
}, 100, 2);
// At each end of the query, we clean up by setting the counter to
// the global query's counter. This allows the custom $cqc variable
// to be set correctly in the main page, post or query, even after
// having executed a custom WP_Query.
add_action( 'loop_end', function($q){
global $wp_query, $cqc;
$cqc = $wp_query->current_post;
}, 100, 1);
La beauté de cette solution est que, lorsque vous entrez dans une requête personnalisée et revenez dans la boucle générale, elle va être réinitialisée sur le bon compteur de toute façon. Tant que vous êtes dans une requête (ce qui est toujours le cas dans WordPress, vous ne le saviez pas), votre compteur va être correct. C'est parce que la requête principale est exécutée avec la même classe!
Exemple :
global $cqc;
while(have_posts()): the_post();
echo $cqc; // Will output 0
the_title();
$custom_query = new WP_Query(array('post_type' => 'portfolio'));
while($custom_query->have_posts()): $custom_query->the_post();
echo $cqc; // Will output 0, 1, 2, 34
the_title();
endwhile;
echo $cqc; // Will output 0 again
endwhile;