ใช้ pre_get_posts กับ WP_Query


24

ผมอ่านสตีเฟ่นแฮร์ริสคำตอบที่ดี 'เพื่อคำถามนี้เกี่ยวกับการใช้WP_query(), และquery_posts()pre_get_posts

เขาบอกว่า"pre_get_posts เป็นตัวกรองสำหรับการแก้ไขแบบสอบถามใด ๆส่วนใหญ่มักจะใช้เพื่อแก้ไขเฉพาะ 'ข้อความค้นหาหลัก' เท่านั้น"

มันเป็นไปได้ที่จะใช้pre_get_postsกับตัวกรองเฉพาะแบบสอบถามรองเฉพาะที่สร้างขึ้นด้วยWP_Query? เช่น.

$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

ความช่วยเหลือใด ๆ ที่ชื่นชมมาก

คำตอบ:


23

วิธีที่ง่ายที่สุดคือการเพิ่มการกระทำก่อนที่จะค้นหาและลบทันทีหลังจาก

add_action('pre_get_posts', 'some_function_in_functionsphp');
$my_secondary_loop = new WP_Query(...);
remove_action('pre_get_posts', 'some_function_in_functionsphp');

if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

แก้ไข

อีกเทคนิคที่คุณสามารถใช้คือการตั้งค่า var แบบสอบถามของคุณเองและตรวจสอบในเบ็ด:

// tell WordPress about our new query var
function wpse52480_query_vars( $query_vars ){
    $query_vars[] = 'my_special_query';
    return $query_vars;
}
add_filter( 'query_vars', 'wpse52480_query_vars' );

// check if our query var is set in any query
function wpse52480_pre_get_posts( $query ){
    if( isset( $query->query_vars['my_special_query'] ) )
        // do special stuff

    return $query;
}
add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' );

และในเทมเพลต:

// set the query var (along with whatever others) to trigger the filter
$args = array(
    'my_special_query' => true
);
$my_secondary_loop = new WP_Query( $args );

ขอบคุณมากไมโล มันมีประโยชน์มากจริงๆ ฉันมักจะสงสัยว่ามันเป็นไปได้ที่จะตั้งค่าแบบสอบถามของคุณเอง
Ben Pearson

ฉันจะใช้เคล็ดลับนี้สำหรับหน้าเก็บถาวรได้อย่างไร ฉันไม่ต้องการเขียนข้อความค้นหาทั้งหมดอีกครั้งสำหรับหน้าเก็บถาวร แต่ต้องการใช้เทคนิคนี้
Rohit Pande

4

pre_get_posts ไฟสำหรับทุกข้อความค้นหา:

  • get_posts ()
  • ใหม่ WP_Query ()
  • โพสต์ล่าสุดที่สุ่มติดตั้งไคลเอนต์ของคุณโดยที่คุณไม่รู้
  • ทุกอย่าง

- @nacin

เมื่อมีการพูดนอกเสียจากว่าคุณจะยกเว้นตัวกรองของคุณให้ใช้เงื่อนไข: is_main_query()ตัวกรองของคุณจะเริ่มทำงานกับ WP_Query ใหม่ของคุณ

หากคุณต้องการกำหนดเป้าหมาย WP_Query ใหม่เฉพาะของคุณคุณจะไม่สามารถทำได้


แล้วเทคนิคของไมโลล่ะ ฉันไม่เคยเห็นมาก่อน ...
brasofilo

เทคนิคของเขาจะทำงาน ฉันไม่เคยใช้มันสำหรับ pre_get_posts แต่มีตัวกรองอื่น ๆ เช่น posts_where
Chris_O

1
เจ๋งมีอะไรใหม่ที่เรียนรู้ในวันนี้!
brasofilo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.