Bu soru eski olsa bile, bir Google Arama'dan gelen birinin daha esnek bir cevaba ihtiyacı olması durumunda bunu buraya koyacağım.
Zamanla, WP_Query
agnostik olmak için küresel bir çözüm geliştirdim . Bir özel WP_Query
kullandığınızda, yalnızca kullanmak include
veya require
değişkenleri kullanabilmekle sınırlandırılırsınız $custom_query
, ancak bazı durumlarda (benim için çoğu durumda!) Oluşturduğum şablon parçaları, bazen genel bir sorguda kullanılır (arşiv şablonları gibi) veya özel olarak WP_Query
(ön sayfada özel bir yayın türünü sorgulamak gibi). Bu, sorgu türünden bağımsız olarak küresel olarak erişilebilir olması için bir sayaca ihtiyacım olduğu anlamına gelir. WordPress bunu sağlamaz, ancak bazı kancalar sayesinde bunu nasıl gerçekleştirebilirsiniz.
Bunu işlevlerinize yerleştirin. 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);
Bu çözümün güzelliği, özel bir sorguya girip genel döngüye geri döndüğünüzde, her iki şekilde de doğru sayaca sıfırlanacaktır. Bir sorgunun içinde olduğunuz sürece (WordPress'de her zaman böyle, çok az biliyordunuz), sayacınız doğru olacaktır. Çünkü ana sorgu aynı sınıfla yürütülür!
Misal :
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;