Навіть якщо це питання давнє, я закладаю це на випадок, якщо хтось із пошуку Google потребує більш гнучкої відповіді.
З часом я розробив рішення, яке буде WP_Query
або глобальним запитом агностиком. Коли ви користуєтеся користувальницьким WP_Query
, ви обмежуєтесь використовувати include
або лише require
можливість використовувати змінні у вашому $custom_query
, але в деяких випадках (які для мене більшість випадків!), Створені мною частини шаблону використовуються в глобальному запиті. (наприклад, шаблони архіву) або в користувальницькому WP_Query
(наприклад, запит користувацького типу публікації на головній сторінці). Це означає, що мені потрібен лічильник, щоб бути глобально доступним незалежно від виду запиту. WordPress не робить це доступним, але ось, як це зробити, завдяки деяким гачкам.
Розмістіть це у своїх 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);
Краса цього рішення полягає в тому, що, коли ви вводите користувацький запит і повертаєтеся в загальний цикл, він буде повернутись до потрібного лічильника в будь-якому випадку. Поки ви знаходитесь у запиті (що завжди має місце в 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;