วิธี จำกัด จำนวนโพสต์ที่ WP_Query ได้รับ


25

ฉันได้ทำการค้นคว้าเกี่ยวกับ Google และ WPSE และสิ่งเดียวที่ฉันเห็นซ้ำ ๆ ก็คือการใช้showpostsนั่นคือเลิกใช้แล้ว

ฉันคุ้นเคยกับWP_Queryและฉันคิดว่าถ้าฉันตั้งไว้posts_per_pageที่ขีด จำกัด ของฉัน (เช่น 5) และnopagingเพื่อtrueมันจะกลายเป็นบางอย่างเช่น " ตกลงฉันจะให้คุณโพสต์เพียง 5 " แต่มันไม่ได้ผล

ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะทำสิ่งนี้ได้อย่างไร


Just'posts_per_page=5'
Pieter Goosen

ฉันใช้สิ่งนั้น แต่พบว่าโพสต์ทั้งหมด ถ้าฉันเข้าถึงfound_postsคุณสมบัติจะระบุว่ามีจำนวนมากกว่า 5 ฉันต้องการให้ข้อความค้นหาของฉันเก็บไว้เพียง 5 โพสต์ มันเป็นไปได้? @PieterGoosen
EliasNS

คุณไม่ควรตั้งค่าnopagingพารามิเตอร์การตั้งค่าเป็นจริงหมายถึงการรับโพสต์ทั้งหมด
Pieter Goosen

@PieterGoosen หากฉันไม่ได้ตั้งค่าnopagingพารามิเตอร์มันจะได้รับค่าเริ่มต้นนั่นคือfalsefrontpage แสดงโพสต์ 5 โพสต์ แต่เคียวรีมีมากขึ้น ฉันเพิ่มภาพในคำถาม
EliasNS

ความคิดเห็นของคุณสับสนคุณขอให้ จำกัด จำนวนการโพสต์ที่แสดงบนหน้าเว็บถึง 5 นั่นคือสิ่งที่คุณได้รับ ตอนนี้คุณพูด (อ่านความคิดเห็นก่อนหน้านี้ :-)) ข้อความค้นหามีจำนวนมากขึ้น กรุณาอธิบาย. คุณไม่สามารถตั้งค่า posts_per_page จากนั้นใช้ no_paging set เป็น true ในข้อความค้นหาเดียวกันมันเป็น posts_per_page หรือ nopaging ที่ตั้งค่าเป็นจริง
Pieter Goosen

คำตอบ:


43

ฉันคิดว่าตอนนี้ฉันเข้าใจสิ่งที่คุณกำลังพยายามทำ เมื่อคุณเรียกใช้แบบสอบถามที่กำหนดเองด้วยWP_Queryและกำหนดวงเงินที่จะได้รับเพียง 5 ข้อความต่อหน้าเพียง 5 โพสต์จะถูกดึงจากแบบสอบถามและแบบสอบถามที่จะถือ 5 โพสต์แต่เพื่อประโยชน์ของเลขที่WP_Queryยังคงไหลผ่านฐานข้อมูลทั้งหมด และนับการโพสต์ทั้งหมดที่ตรงกับเกณฑ์ของการค้นหา

ที่สามารถมองเห็นได้เมื่อคุณดู$found_postsและ$max_num_pagesคุณสมบัติของแบบสอบถาม ลองยกตัวอย่าง:

คุณมี 20 postโพสต์ที่อยู่ในโพสต์เริ่มต้นชนิด คุณเพียง แต่ต้องโพสต์ล่าสุด 5 โดยไม่ต้องแบ่งหน้า ข้อความค้นหาของคุณมีลักษณะเช่นนี้

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) จะให้ 5 โพสต์ล่าสุดตามที่คาดไว้
  • echo $q->found_posts จะให้คุณ 20
  • echo $q->max_num_pages จะให้คุณ 4

ผลกระทบของงานพิเศษนี้มีเพียงเล็กน้อยในไซต์ที่มีบทความเพียงไม่กี่โพสต์ แต่อาจมีราคาแพงหากคุณใช้งานเว็บไซต์ที่มีหลายร้อยหรือหลายพันโพสต์ นี่เป็นการสิ้นเปลืองทรัพยากรหากคุณต้องการเพียง 5 โพสต์ล่าสุด

มีพารามิเตอร์ที่ไม่มีเอกสารที่เรียกว่าno_found_rowsซึ่งใช้ค่าบูลีนซึ่งคุณสามารถใช้เพื่อทำให้แบบสอบถามของคุณประกันตัวหลังจากพบ 5 โพสต์ที่คุณต้องการ การทำเช่นนี้จะเป็นการบังคับWP_Queryไม่ให้ค้นหาโพสต์ใด ๆ เพิ่มเติมเกี่ยวกับการคำนวณเกณฑ์หลังจากที่ได้รับจำนวนโพสต์ที่สอบถาม พารามิเตอร์นี้แล้วสร้างเป็นget_postsนั่นคือเหตุผลที่get_postsเป็นบิตเร็วกว่าWP_Queryถึงแม้ว่าget_postsการใช้งานWP_Query

ข้อสรุป

โดยสรุปหากคุณจะไม่ใช้การแบ่งหน้าในแบบสอบถามมันก็ควรที่จะเสมอ'no_found_rows=true'ในแบบสอบถามของคุณเพื่อเพิ่มความเร็วของสิ่งต่าง ๆ และประหยัดทรัพยากรสิ้นเปลือง


3

หลังจากการสนทนากับ @Pieter Goosen ในความคิดเห็นของคำถามฉันคิดว่าฉันสามารถตอบคำถามและอธิบายความผิดพลาดของฉันได้

กุญแจสำคัญคือการบอกfound_postsฉัน ฉันว่าเจ้าตัวเลขนั้นคือเสาที่ดึงมาได้ แต่ไม่ใช่ มันเป็นจำนวนโพสต์ที่ตรงกับเกณฑ์ที่ มันเหมือนกับส่วนที่WP_Queryมี 2 ​​ส่วน: ส่วนหนึ่งสำหรับการค้นหา (ทั้งหมด) โพสต์และอื่น ๆ สำหรับดึงเนื้อหาเมื่อตรวจสอบpaginationพารามิเตอร์ ดังนั้นเราจึงมี$post_countคุณสมบัติที่เป็นจำนวนโพสต์ที่ดึงมา (Codex พูดว่าThe number of posts being displayed), แน่นอนว่าเท่ากับจำนวนบนposts_per_pageพารามิเตอร์และจำนวนรายการใน$postsคุณสมบัติอาร์เรย์

ดังนั้นWP_Queryอย่าทำงานไร้ประโยชน์อย่างที่คิด ^^

หวังว่านี่จะช่วยผู้อื่น!


ดูคำตอบของฉัน ฉันคิดว่าฉันเข้าใจสิ่งที่คุณหมายถึง :-)
Pieter Goosen

ใช่ คุณทำได้ดีมาก: D ในที่สุดฉันก็มีวิธีที่จะทำและฉันเข้าใจทุกคน = D ขอบคุณ @PieterGoosen!
EliasNS

ทำ! มันขยายคำตอบของฉันเอง ^^ @PieterGoosen
EliasNS

1

ตกลงช่วยให้คุณมีประเภทโพสต์ชื่อ 'blog_posts' และคุณต้องการดึงโพสต์ 5 โพสต์ของประเภทโพสต์นั้น นี่คือสิ่งที่คุณต้องทำ

$args = array(
        'post_type' => 'blog_posts',
        'posts_per_page' => '5',
);


$query = new WP_Query($args);

ข้อความค้นหาด้านบนจะส่งคืน 5 โพสต์ของประเภท 'blog_posts' หากไม่ใช่ประเภทโพสต์ที่กำหนดเองจากนั้นเพียงแค่แทนที่เช่นนี้'post_type' => 'posts',ถ้าคุณต้องการดึงข้อความทั้งหมดจากนั้นแทนที่เช่นนี้'posts_per_page' => '-1',สำหรับรายละเอียดเพิ่มเติมWP Query


ดูความคิดเห็นเกี่ยวกับคำถามโปรด
EliasNS

1

ฉันรู้ว่า @ user1750063 ได้พูดถึงรหัส แต่ลองสิ่งนี้

$args = array (
    'post_type'              => 'custom_post',
    'nopaging'               => false,
    'posts_per_page'         => '5',
    'order'                  => 'DESC',
    'orderby'                => 'ID',
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // display content
    }
} else {
    // display when no posts found
}

wp_reset_postdata();     // Restore original Post Data

idไม่ถูกต้องเป็นorderbyค่าและpaginationเป็นพารามิเตอร์ที่ไม่ถูกต้อง
Pieter Goosen

paginationไม่ใช่พารามิเตอร์ที่ถูกต้อง คุณหมายถึง'nopaging' => trueอะไร ถ้าใช่ฉันจะได้รับโพสต์ทั้งหมด นั่นไม่ใช่สิ่งที่ฉันต้องการ @PieterGoosen IDผมคิดว่าเขาหมายถึง
EliasNS

orderby ใช้สำหรับแสดงคำสั่งใช่ไหม? มันไม่เป็นอันตรายต่อค่า / พารามิเตอร์ nopaging @PieterGoosen ทำไม ID & orderby ไม่ถูกต้อง คุณช่วยชี้แจงจุดนี้ได้หรือไม่?
Shreyo Gi

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