Incluso si esta pregunta es antigua, pondré esto aquí en caso de que alguien proveniente de una Búsqueda de Google necesite una respuesta más flexible.
A lo largo del tiempo, desarrollé una solución para ser WP_Query
o agnóstico de consultas globales. Cuando usa un WP_Query
personalizado, está limitado a usar solo include
o require
para poder usar las variables en su $custom_query
, pero en algunos casos (¡en la mayoría de los casos para mí!), Las partes de la plantilla que creo se usan algunas veces en una consulta global (como las plantillas de archivo) o en un WP_Query
personalizado (como consultar un tipo de publicación personalizada en la página frontal). Eso significa que necesito un contador para poder acceder a todo el mundo independientemente del tipo de consulta. WordPress no lo hace disponible, pero aquí hay cómo hacerlo gracias a algunos ganchos.
Coloca esto en tus funciones.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 belleza de esta solución es que, al ingresar en una consulta personalizada y regresar al ciclo general, se reiniciará en el contador correcto de cualquier manera. Mientras esté dentro de una consulta (lo cual siempre fue el caso en WordPress, poco sabía), su contador será correcto. ¡Esto se debe a que la consulta principal se ejecuta con la misma clase!
Ejemplo:
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;