Bahkan jika pertanyaan ini sudah lama, saya akan meletakkannya di sini kalau-kalau seseorang yang berasal dari Google Search membutuhkan jawaban yang lebih fleksibel.
Seiring waktu, saya mengembangkan solusi menjadi WP_Query
agnostik atau permintaan global. Saat Anda menggunakan kustom WP_Query
, Anda terbatas hanya menggunakan include
atau require
untuk dapat menggunakan variabel pada Anda $custom_query
, tetapi dalam beberapa kasus (yang kebanyakan kasus bagi saya!), Bagian templat yang saya buat beberapa kali digunakan dalam kueri global (seperti templat arsip) atau dalam kebiasaan WP_Query
(seperti menanyakan jenis posting kustom di halaman depan). Itu berarti bahwa saya memerlukan penghitung agar dapat diakses secara global terlepas dari jenis kueri. WordPress tidak menyediakan ini, tetapi di sini adalah cara untuk mewujudkannya berkat beberapa kaitan.
Tempatkan ini di functions.php Anda
/**
* 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);
Keindahan dari solusi ini adalah bahwa, saat Anda memasukkan permintaan khusus dan kembali ke loop umum, itu akan diatur ulang ke penghitung yang tepat. Selama Anda berada di dalam kueri (yang selalu terjadi di WordPress, sedikit yang Anda tahu), penghitung Anda akan benar. Itu karena permintaan utama dijalankan dengan kelas yang sama!
Contoh:
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;