Anche se questa domanda è vecchia, la poserò qui nel caso in cui qualcuno proveniente da una Ricerca Google abbia bisogno di una risposta più flessibile.
Nel corso del tempo, ho sviluppato una soluzione WP_Query
o agnostica globale per le query. Quando usi un'abitudine WP_Query
, sei limitato a usare solo include
o require
a essere in grado di usare le variabili sul tuo $custom_query
, ma in alcuni casi (che sono la maggior parte dei casi per me!), Le parti del modello che creo vengono talvolta utilizzate in una query globale (come i modelli di archivio) o personalizzati WP_Query
(come richiedere un tipo di post personalizzato in prima pagina). Ciò significa che ho bisogno di un contatore per essere accessibile a livello globale indipendentemente dal tipo di query. WordPress non lo rende disponibile, ma ecco come farlo accadere grazie ad alcuni hook.
Inseriscilo nel tuo function.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);
Il vantaggio di questa soluzione è che, quando si inserisce una query personalizzata e si ritorna nel ciclo generale, verrà ripristinato sul contatore corretto in entrambi i modi. Finché sei all'interno di una query (che è sempre il caso di WordPress, poco lo sapevi), il tuo contatore sarà corretto. Questo perché la query principale viene eseguita con la stessa classe!
Esempio :
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;