Incluso si esta pregunta es antigua, la pondré aquí en caso de que alguien que venga de una Búsqueda de Google necesite una respuesta más flexible.
Con el tiempo, desarrollé una solución para ser WP_Query
independiente de la consulta global. Cuando usa una costumbre WP_Query
, está limitado a usar solo include
o require
poder usar las variables en su $custom_query
, pero en algunos casos (¡lo cual es la mayoría de los casos para mí!), Las partes de la plantilla que creo algunas veces se usan en una consulta global (como plantillas de archivo) o de forma personalizadaWP_Query
(como consultar un tipo de publicación personalizada en la página principal). Eso significa que necesito un contador para ser accesible globalmente, independientemente del tipo de consulta. WordPress no hace que esto esté disponible, pero a continuación se explica cómo hacerlo posible gracias a algunos ganchos.
Coloque esto en sus 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, cuando ingrese una consulta personalizada y regrese al bucle general, se restablecerá en el contador correcto de cualquier manera. Mientras esté dentro de una consulta (que siempre es 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;