Làm cách nào để giới hạn số lượng bài đăng mà WP_Query nhận được?


25

Tôi đã nghiên cứu trên Google và WPSE và điều duy nhất tôi thấy nhiều lần là sử dụng showposts, điều đó không được chấp nhận.

Tôi quen thuộc với WP_Query, và tôi nghĩ rằng nếu tôi đặt posts_per_pageđể giới hạn của tôi (tức. 5), và nopagingđến true, nó sẽ trở thành một cái gì đó như " Ok, tôi sẽ cung cấp cho bạn chỉ có 5 bài viết ". Nhưng điều này không làm việc.

nhập mô tả hình ảnh ở đây

Tôi có thể làm cái này như thế nào?


Chỉ cần'posts_per_page=5'
Pieter Goosen

Tôi sử dụng nó, nhưng tìm thấy tất cả các bài viết. Nếu tôi truy cập vào found_poststài sản, nó nói số cao hơn 5. Tôi muốn truy vấn của tôi chỉ giữ 5 bài viết. Có thể không? @PieterGoosen
EliasNS 18/03/2015

Bạn không nên đặt nopagingtham số, đặt điều đó thành đúng nghĩa là có được tất cả các bài đăng
Pieter Goosen

@PieterGoosen Nếu tôi không đặt nopagingtham số, nó sẽ được mặc định false, vì vậy frontpage hiển thị 5 bài đăng, nhưng truy vấn giữ nhiều hơn. Tôi thêm một hình ảnh cho câu hỏi.
EliasNS 18/03/2015

Nhận xét của bạn rất khó hiểu, bạn đã yêu cầu giới hạn số lượng bài đăng được hiển thị trên một trang xuống còn 5, đó là những gì bạn nhận được. Bây giờ, bạn nói (đọc lại bình luận trước đó của bạn :-)) truy vấn giữ nhiều hơn. Vui lòng giải thích. Bạn không thể đặt post_per_page và sau đó sử dụng no_paging được đặt thành true trong cùng một truy vấn, đó là post_per_page HOẶC nopaging được đặt thành true
Pieter Goosen

Câu trả lời:


43

Tôi nghĩ rằng bây giờ tôi hiểu những gì bạn đang cố gắng làm. Khi bạn chạy truy vấn tùy chỉnh WP_Queryvà đặt giới hạn chỉ nhận 5 bài đăng trên mỗi trang, chỉ có 5 bài đăng sẽ được truy vấn truy vấn và truy vấn đó sẽ chỉ giữ 5 bài đăng, NHƯNG vì mục đích phân trang, WP_Queryvẫn chạy qua toàn bộ cơ sở dữ liệu và đếm tất cả các bài viết phù hợp với tiêu chí của truy vấn.

Điều đó có thể được nhìn thấy khi bạn nhìn vào $found_posts$max_num_pagescác thuộc tính của truy vấn. Hãy lấy một ví dụ:

Bạn có 20 bài viết thuộc loại bài đăng mặc định post. Bạn chỉ cần 5 bài viết mới nhất mà không cần phân trang. Truy vấn của bạn trông như thế này

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) sẽ cung cấp cho bạn 5 bài viết mới nhất như mong đợi
  • echo $q->found_posts sẽ cho bạn 20
  • echo $q->max_num_pages sẽ cho bạn 4

Tác động của công việc bổ sung này là tối thiểu đối với các trang web chỉ có một vài bài đăng, nhưng điều này có thể gây tốn kém nếu bạn đang chạy một trang web có hàng trăm hoặc hàng nghìn bài đăng. Đây là một sự lãng phí tài nguyên nếu bạn chỉ cần 5 bài viết mới nhất

Có một tham số không có tài liệu được gọi là no_found_rowssử dụng các giá trị boolean mà bạn có thể sử dụng để thực hiện bảo lãnh truy vấn của mình sau khi tìm thấy 5 bài đăng bạn cần. Điều này sẽ buộc WP_Querykhông tìm kiếm thêm bất kỳ bài đăng nào toán học các tiêu chí sau khi nó đã lấy được số lượng bài đăng được yêu cầu. Tham số này đã được tích hợp sẵn get_posts, đó là lý do tại sao get_postsnhanh hơn một chút so với WP_Querymặc dù get_postssử dụngWP_Query

Phần kết luận

Tóm lại, nếu bạn sẽ không sử dụng phân trang trên một truy vấn, thì 'no_found_rows=true'việc truy vấn của bạn để tăng tốc mọi thứ và tiết kiệm lãng phí tài nguyên là điều luôn khôn ngoan .


3

Sau cuộc trò chuyện với @Pieter Goosen về các bình luận của câu hỏi, tôi nghĩ rằng tôi có thể trả lời câu hỏi và giải thích lỗi của mình.

Điều quan trọng là điều đó found_postslàm tôi bối rối. Tôi nghĩ rằng, số đó là những bài đăng được lấy nhưng không phải. Đó là số lượng bài viết phù hợp với tiêu chí . Nó giống như WP_Querycó 2 phần: một phần để tìm (tất cả) bài đăng và phần khác để tìm nạp nội dung, khi nó kiểm tra các paginationtham số. Vì vậy, chúng ta có thuộc $post_counttính là số lượng bài đăng được tìm nạp (Codex nói The number of posts being displayed), tất nhiên là bằng số trên posts_per_pagetham số và số lượng mục trên thuộc tính $postsmảng.

Vì vậy, WP_Querykhông làm bất kỳ công việc vô ích, như tôi nghĩ ^^

Hy vọng điều này sẽ giúp những người khác!


Xem câu trả lời của tôi. Tôi nghĩ tôi hiểu ý của bạn là :-)
Pieter Goosen

Vâng! Bạn đã làm rất tốt: D Cuối cùng tôi cũng có cách để làm điều đó và tôi hiểu tất cả = D Cảm ơn @PieterGoosen!
EliasNS

Làm xong! Nó mở rộng câu trả lời của riêng tôi ^^ @PieterGoosen
EliasNS 19/03/2015

1

Ok, cho phép bạn có loại bài đăng được gọi là 'blog_posts' và bạn muốn tìm nạp 5 bài đăng của loại bài đăng đó. Dưới đây là những gì bạn cần làm

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


$query = new WP_Query($args);

Các truy vấn trên sẽ trả lại 5 bài viết của loại 'blog_posts', nếu nó không phải là một loại bài tùy chỉnh, sau đó chỉ cần thay thế như thế này 'post_type' => 'posts',nếu bạn muốn lấy tất cả các bài viết sau đó thay thế như thế này 'posts_per_page' => '-1',, để biết thêm chi tiết WP Query


Xem các ý kiến ​​về câu hỏi, xin vui lòng.
EliasNS 18/03/2015

1

Tôi biết rằng @ user1750063 đã đề cập đến mã nhưng hãy thử điều này

$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

idkhông hợp lệ làm orderbygiá trị và paginationlà tham số không hợp lệ
Pieter Goosen

paginationkhông phải là một tham số hợp lệ. Ý bạn là 'nopaging' => truesao? Nếu có, thì tôi sẽ nhận được TẤT CẢ bài viết. Đó không phải là điều tôi muốn. @PieterGoosen Tôi nghĩ anh ấy có nghĩa ID.
EliasNS 18/03/2015

orderby là để hiển thị thứ tự, phải không? Nó không làm hại giá trị / tham số nopaging. @PieterGoosen tại sao ID & orderby không hợp lệ? Bạn có thể làm rõ quan điểm?
Shreyo Gi

IDid
Đáng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.