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

我对WP_Query很熟悉,并且我认为如果将posts_per_page设置为我的限制(例如5),然后将nopaging更改为true,结果会变成“好吧,我只给您5个帖子”。但这不起作用。



我该怎么办?

评论

只是'posts_per_page = 5'

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

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

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

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

#1 楼

我认为现在我了解您正在尝试做什么。当您使用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_postsWP_Query快一点的原因,尽管get_posts使用WP_Query

结论

总之,如果您不打算使用分页在查询中,在查询中使用'no_found_rows=true'总是明智的做法,以加快处理速度并节省资源浪费。

#2 楼

好的,让您拥有一个名为'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
15年3月18日在11:14

#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
15年3月18日在12:23

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

– EliasNS
15年3月19日在0:17

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

– EliasNS
15年3月19日在14:25

#4 楼

我知道@ 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值无效,而分页是无效参数

–Pieter Goosen
15年3月18日在11:58

分页不是有效参数。您是说'nopaging'=>是吗?如果是,那么我将获得所有帖子。那不是我想要的@PieterGoosen我认为他的意思是身份证。

– EliasNS
2015年3月18日12:00



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

–Shreyo Gi
2015年3月18日在12:22



应该是ID,而不是ID

–Pieter Goosen
15年3月18日在12:25

#5 楼

我将使用自定义字段进行限制,请在下面的查询示例中进行检查:
$wp_query = new WP_Query("orderby=DESC&post_type=portfolio&meta_key=FeaturedProject&meta_value=1&posts_per_page=6");

它将返回6个特色项目。