如何限制WP_Query获得的帖子数量?


25

我一直在研究Google和WPSE,而我反复看到的唯一一件事就是使用showposts,这已被弃用。

我很熟悉WP_Query,并且我认为如果我将posts_per_page自己设置为极限(即5),并且nopagingtrue其设置为,则会变成“ 好,我只给你5个帖子 ”之类的东西。但这是行不通的。

在此处输入图片说明

我怎样才能做到这一点?


Just'posts_per_page=5'
Pieter Goosen

我用那个,但是找到了所有帖子。如果我访问该found_posts属性,它的数字大于5。我希望我的查询仅保留5个帖子。可能吗?@PieterGoosen
EliasNS 2015年

您不应该设置nopaging参数,将其设置为true意味着获取所有帖子
Pieter Goosen

@PieterGoosen如果不设置nopaging参数,它将使用默认值false,因此首页显示5个帖子,但查询包含更多内容。我向问题添加图片。
EliasNS 2015年

您的评论令人困惑,您要求将页面上显示的帖子数量限制为5,即您得到的。现在,您说(请重新阅读以前的评论:-))该查询包含更多内容。请解释。您不能设置posts_per_page,然后在同一个查询中使用no_paging设置为true,则可能是posts_per_page OR nopaging设置为true
彼得·古森

Answers:


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有两部分一样:一部分用于查找(所有)帖子,另一部分用于在检查pagination参数时获取内容。因此,我们拥有的$post_count属性是所获取的帖子数(Codex说The number of posts being displayed),当然等于posts_per_page参数上的数量以及$postsarray属性上的项目数量。

所以WP_Query不会做任何无用的工作,就像我想的那样^^

希望这对别人有帮助!


看我的答案。我想我明白您的意思:-)
Pieter Goosen

是! 您做得非常好:D终于我有了办法,并且我理解了所有= D谢谢@PieterGoosen!
EliasNS 2015年

做完了!它扩展了我自己的答案^^ @PieterGoosen
EliasNS 2015年

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 2015年

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 2015年

orderby用于显示订单,对不对?它不会损害nopaging值/参数。@PieterGoosen为什么ID和orderby无效?您能否阐明这一点?
Shreyo Gi Gi

应该是ID,不是id
Pieter Goosen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.