Nawet jeśli to pytanie jest stare, położę je tutaj na wypadek, gdyby ktoś pochodzący z wyszukiwarki Google potrzebował bardziej elastycznej odpowiedzi.
Z biegiem czasu opracowałem rozwiązanie WP_Query
globalne lub agnostyczne. Kiedy korzystasz z niestandardowego WP_Query
, jesteś ograniczony do używania include
lub require
możliwości używania zmiennych na twoim $custom_query
, ale w niektórych przypadkach (które są w większości przypadków dla mnie!), Części szablonu, które tworzę, są czasami używane w zapytaniu globalnym (np. szablony archiwum) lub niestandardowy WP_Query
(np. zapytanie o niestandardowy typ postu na stronie głównej). Oznacza to, że potrzebuję licznika, aby był globalnie dostępny, niezależnie od rodzaju zapytania. WordPress nie udostępnia tego, ale oto, jak to zrobić, dzięki niektórym hakom.
Umieść to w pliku 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);
Zaletą tego rozwiązania jest to, że po wprowadzeniu niestandardowego zapytania i powrocie do ogólnej pętli zostanie ono zresetowane do odpowiedniego licznika w obu kierunkach. Tak długo, jak jesteś w zapytaniu (co zawsze dzieje się w WordPressie, niewiele wiedziałeś), twój licznik będzie poprawny. To dlatego, że główne zapytanie jest wykonywane z tą samą klasą!
Przykład:
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;