Ngay cả khi câu hỏi này đã cũ, tôi sẽ đặt câu hỏi này ở đây trong trường hợp ai đó đến từ Tìm kiếm của Google cần câu trả lời linh hoạt hơn.
Theo thời gian, tôi đã phát triển một giải pháp là WP_Query
bất khả tri truy vấn toàn cầu. Khi bạn sử dụng một tùy chỉnh WP_Query
, bạn bị giới hạn chỉ sử dụng include
hoặc require
có thể sử dụng các biến trên $custom_query
, nhưng trong một số trường hợp (đó là hầu hết các trường hợp đối với tôi!), Các phần mẫu tôi tạo đôi khi được sử dụng trong truy vấn toàn cầu (chẳng hạn như mẫu lưu trữ) hoặc trong một tùy chỉnh WP_Query
(như truy vấn loại bài đăng tùy chỉnh trên trang đầu). Điều đó có nghĩa là tôi cần một bộ đếm để có thể truy cập toàn cầu bất kể loại truy vấn nào. WordPress không cung cấp tính năng này, nhưng đây là cách để thực hiện điều đó nhờ một số móc nối.
Đặt cái này trong hàm của bạn.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);
Cái hay của giải pháp này là, khi bạn nhập vào một truy vấn tùy chỉnh và quay lại trong vòng lặp chung, nó sẽ được đặt lại về đúng bộ đếm. Miễn là bạn ở trong một truy vấn (luôn luôn là như vậy trong WordPress, bạn ít biết), bộ đếm của bạn sẽ chính xác. Đó là bởi vì truy vấn chính được thực hiện với cùng một lớp!
Thí dụ :
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;