posts_per_page ไม่ จำกัด


41

query_postsผมต้องการที่จะกลับมาโพสต์ทั้งหมดด้วย ฉันพยายามตั้งค่าposts_per_pageเป็นจำนวนสูงมาก แต่ก็query_postsแปลกและไม่ได้โพสต์ใด ๆ วิธีที่ถูกต้องในการค้นหาโพสต์โดยไม่ จำกัด คืออะไร

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => ?
    );

6
ฉันใช้ Google มานานแล้วและค้นหา WP codex แต่ฉันไม่สามารถหาคำตอบได้โดยตรงสำหรับคำถามง่าย ๆ นี้ ฉันเชื่อว่าคำถามของฉันมีคำพูดที่ชัดเจนพร้อมโค้ดตัวอย่างและความพยายามของฉันคืออะไร (การตั้งค่าที่สูงสำหรับการโต้แย้ง) ฉันไม่ใช่ผู้เชี่ยวชาญ WP ดังนั้นฉันมาที่นี่เพื่อถามคำถาม แม้แต่การให้คำตอบสำหรับคำถามที่ดูเหมือนว่าไม่สำคัญกับคุณก็เป็นประโยชน์ในการสร้างชุมชนการแลกเปลี่ยนสแต็ค ฉันชอบเห็นลิงก์สแต็คโอเวอร์โฟลว์ในผลการค้นหาของฉันซึ่งตรงข้ามกับลิงค์ไปยังฟอรัมที่เส็งเคร็ง
Banjer

นอกจากนี้ขอขอบคุณสำหรับคำตอบ คุณควรโพสต์มันเป็นคำตอบและไม่ใช่ความคิดเห็นดังนั้นฉันจึงยอมรับได้
Banjer

ฉันมีประเด็นของคุณและขอขอบคุณที่พยายามเขียนคำถาม ฉันเห็นด้วยว่าคำถามที่ไม่ใช่ผู้เชี่ยวชาญสามารถพิสูจน์ตนเองว่ามีคุณค่าในชุมชนนี้ ในทางกลับกันคำถามที่มากเกินไปสามารถกีดกันผู้เชี่ยวชาญบางคนจากการเข้ามามีส่วนร่วมที่นี่ มันเกี่ยวกับความสมดุลบางอย่างที่ฉันเดา อย่างไรก็ตามฉันเป็นผู้มีสิทธิเลือกตั้งที่ยิ่งใหญ่ดังนั้นฉันจึงตั้งตารอคำถามต่อไปของคุณ :) มีช่วงเวลาที่ดีที่ WPSE
Michal Mau

PS: คุณยังต้องการที่จะเปลี่ยนtypeสำหรับpost_type(หรือลบบรรทัดนี้โดยสิ้นเชิง) ฉันจะแก้ไขทั้งคำตอบของ Rutwick และคำถามของคุณเพื่อป้องกันไม่ให้ใครบางคนคัดลอกวางผิดพลาดเล็กน้อยนี้
Michal Mau

@ อย่างเปิดเผยขอบคุณสำหรับการแก้ไข ... เพียงแค่มุ่งเน้นไปที่ posts_per_page ดังนั้นจึงคัดลอกคำสะกดผิด! ;)
Rutwick Gangurde

คำตอบ:


81

-1 คือคำตอบของคุณ! มองหาที่นี่posts_per_page

$args = array(
'post_type'      => 'post',
'cat'            => '22,47,67',
'orderby'        => 'name',
'order'          => 'ASC',
'hide_empty'     => 1,
'depth'          => 1,
'posts_per_page' => -1
);

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


6
ข้อแม้ที่สำคัญ: สิ่งนี้อาจส่งผลให้เกิดการสืบค้นที่ใหญ่มากซึ่งสามารถทำให้ไซต์ล้มเหลว ทำสิ่งนี้เฉพาะเมื่อคุณแน่ใจว่าฐานข้อมูลของคุณสามารถจัดการได้ ไม่อยู่ในธีมหรือปลั๊กอินสาธารณะ
fuxia

@toscho การเพิ่มความคิดเห็นของคุณเป็นการอัปเดตคำตอบ
Rutwick Gangurde

คุณช่วยชีวิตฉันได้ !!
Darlan Dieterich

@DarlanDieterich ดีใจที่ฉันสามารถช่วยได้! :)
Rutwick Gangurde

23

หรือมิฉะนั้นคุณสามารถผ่านWP_Query(ซึ่งเป็นสิ่งที่query_postsใช้) nopagingอาร์กิวเมนต์ซึ่งโดยทั่วไปแล้วจะทำสิ่งเดียวกัน ..

$args = array(
    'nopaging' => true
    // Your other args, etc..
);

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

อย่างที่ฉันพูดถึงอย่างไรก็ตามพวกเขาทั้งสองจะได้รับสิ่งเดียวกัน

ไม่สามารถทำร้ายให้มีมากกว่าหนึ่งวิธีและเป็นเรื่องดีที่จะแบ่งปันสิ่งที่คุณรู้พอเพียงที่จะบอกว่านั่นเป็นเหตุผลสำหรับคำตอบของฉันแม้ว่าคุณจะมีวิธีที่เพียงพอแล้ว .. ;)


3

จากไฟล์ฟังก์ชันธีมลูกของคุณ:

add_action( 'pre_get_posts', 'wpsites_no_limit_posts' );

function wpsites_no_limit_posts( $query ) {

if( $query->is_main_query() && !is_admin() && is_home() ) {

$query->set( 'posts_per_page', '-1' );
$query->set( 'order', 'ASC' );
$query->set( 'post_type', 'post' );
$query->set( 'cat', '22,47,67' );
$query->set( 'orderby', 'name' );
$query->set( 'order', 'ASC' );
$query->set( 'hide_empty', '1' );
$query->set( 'depth', '1' );

    }

}

1

คำตอบที่ถูกต้องสำหรับปัญหาของคุณก็คือ'posts_per_page' => -1เพราะ-1จะส่งคืนโพสต์ไม่ จำกัด ต่อหน้าตามที่ผู้ใช้รายอื่นตอบ

ฉันแค่ต้องการเพิ่มส่วนเสริมใน Q / A นี้

หากคุณต้องการได้จำนวนโพสต์ต่อหน้าจากการตั้งค่าการอ่านบน WordPress Administration Panel คุณต้องเรียกใช้get_option()ฟังก์ชั่นและส่งposts_per_pageเป็นสตริง

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => get_option('posts_per_page')
    );

ฉันหวังว่าคำตอบนี้จะช่วยคนที่จะช่วยฉัน Happy Coding ผู้ใช้ Stackexchange


นั่นเป็นส่วนเสริมที่ดีจริงๆ!
Herbert Van-Vliet

1

หรือ..

function getAll($arg, $posts_per_page = 50)
{
    $data = array();
    $page = 1;

    do{
        $arg['paged'] = $page;
        $arg['posts_per_page'] = $posts_per_page;

        $query = new WP_Query($arg);

        foreach ($query->posts as $post){
            $data[] = $post;
        }

        $page++;

    }while(count($query->posts) === $posts_per_page);

    return $data;
}

2
คุณควรเพิ่มบริบทเพื่ออธิบายรหัสความคิดของคุณในการแก้ปัญหา
bueltge

1

การใช้ Ricardo's พร้อมการดัดแปลงบางอย่าง:

static $paged;
$post_ids = [];
do {
    $paged++;
    $defaults = [
        'fields' => 'ids', // Only return the ID field to make this query faster.
        'post_type' => 'post',
        'posts_per_page' => 100,
        'no_found_rows' => false, // We need pagination & the count for all posts found.
        'paged' => $paged,
        'update_post_term_cache' => false,
        'update_post_meta_cache' => false,
    ];
    $query = new WP_Query($defaults);
    if ($query->have_posts()) {
        foreach ($query->posts as $id) {
            $post_ids[] = $id;
        }
    }
} while ($query->max_num_pages > $paged);

return $post_ids;

สิ่งนี้จะเพิ่มเวลาสอบถามอย่างมากโดยการสอบถามเฉพาะแถว ID และหลีกเลี่ยงการอัปเดตคำและเมตาแคช


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