Даже если этот вопрос старый, я уложу его здесь на тот случай, если кому-то из поиска Google понадобится более гибкий ответ.
Со временем я разработал решение, которое будет WP_Query
независимым от глобальных запросов. Когда вы используете кастом WP_Query
, вы ограничены в использовании только include
или require
в возможности использовать переменные в вашем $custom_query
, но в некоторых случаях (которые в большинстве случаев для меня!) Части шаблона, которые я создаю, иногда используются в глобальном запросе. (например, шаблоны архивов) или в пользовательском режиме WP_Query
(например, запрос пользовательского типа сообщения на главной странице). Это означает, что мне нужен счетчик, который будет доступен глобально, независимо от типа запроса. WordPress не делает это доступным, но вот как это сделать, благодаря некоторым хукам.
Поместите это в ваши functions.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);
Прелесть этого решения в том, что когда вы входите в пользовательский запрос и возвращаетесь в общий цикл, он в любом случае будет сброшен на правильный счетчик. Пока вы находитесь внутри запроса (который всегда имеет место в WordPress, мало что вы знали), ваш счетчик будет правильным. Это потому, что основной запрос выполняется с тем же классом!
Пример :
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;