แม้ว่าคำถามนี้จะเก่า แต่ฉันจะวางที่นี่ในกรณีที่มีคนมาจาก Google Search ต้องการคำตอบที่ยืดหยุ่นมากขึ้น
เมื่อเวลาผ่านไปฉันพัฒนาวิธีแก้ปัญหาWP_Query
หรือไม่เชื่อเรื่องคำถามทั่วโลก เมื่อคุณใช้กำหนดเองWP_Query
คุณจะถูก จำกัด ให้ใช้เพียงอย่างเดียวinclude
หรือrequire
เพื่อให้สามารถใช้ตัวแปรในของคุณ$custom_query
แต่ในบางกรณี (ซึ่งเป็นกรณีส่วนใหญ่สำหรับฉัน!) ส่วนแม่แบบที่ฉันสร้างบางครั้งใช้ในแบบสอบถามทั่วโลก (เช่นเทมเพลตการเก็บถาวร) หรือในแบบกำหนดเองWP_Query
(เช่นการสืบค้นประเภทโพสต์ที่กำหนดเองในหน้าแรก) นั่นหมายความว่าฉันต้องการตัวนับเพื่อให้สามารถเข้าถึงได้ทั่วโลกโดยไม่คำนึงถึงชนิดของแบบสอบถาม WordPress ไม่สามารถใช้งานได้ แต่นี่เป็นวิธีที่จะทำให้มันเกิดขึ้นได้ด้วยตะขอบางตัว
วางสิ่งนี้ไว้ในฟังก์ชั่นของคุณ
/**
* 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);
ความสวยงามของโซลูชันนี้คือเมื่อคุณป้อนข้อความค้นหาที่กำหนดเองและกลับมาอยู่ในการวนรอบทั่วไปมันจะถูกรีเซ็ตเป็นตัวนับที่ถูกต้องด้วยวิธีใดวิธีหนึ่ง ตราบใดที่คุณอยู่ในคิวรี (ซึ่งเป็นกรณีของเวิร์ดเพรสเสมอคุณรู้หรือไม่) ตัวนับของคุณจะถูกต้อง นั่นเป็นเพราะการสืบค้นหลักถูกดำเนินการด้วยคลาสเดียวกัน!
ตัวอย่าง:
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;