Mesmo se essa pergunta for antiga, colocarei isso aqui caso alguém proveniente de uma Pesquisa do Google precise de uma resposta mais flexível.
Ao longo do tempo, desenvolvi uma solução para que WP_Query
as consultas globais ou sejam agnósticas. Quando você usa um costume WP_Query
, fica confinado a usar apenas include
ou require
poder usar as variáveis no seu $custom_query
, mas, em alguns casos (que são a maioria dos casos para mim!), As partes do modelo que eu crio são algumas vezes usadas em uma consulta global (como modelos de arquivo morto) ou em um personalizado WP_Query
(como consultar um tipo de postagem personalizado na primeira página). Isso significa que eu preciso de um contador para estar globalmente acessível, independentemente do tipo de consulta. O WordPress não disponibiliza isso, mas veja como fazê-lo graças a alguns ganchos.
Coloque isso em suas funções.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);
A vantagem desta solução é que, ao inserir uma consulta personalizada e retornar ao loop geral, ela será redefinida para o contador certo de qualquer maneira. Contanto que você esteja dentro de uma consulta (que é sempre o caso do WordPress, pouco você sabia), seu contador estará correto. Isso ocorre porque a consulta principal é executada com a mesma classe!
Exemplo:
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;