如何在多个类别上使用WordPress WP_Query-> get_posts()?

时间:2014-08-20 01:09:55

标签: wordpress wp-query

讨论WP_Query()的文档明确指出这应该有效:

$query = new WP_Query( 'category_name=tools,wordpress' );

但是,如果我使用WP_Query的类方法->get_posts()

$query->get_posts();

我只收到tools的帖子(总共8个帖子)。

但是,如果我这样做:

while($query->have->posts()) { ... }

我可以按预期遍历所有帖子(总共12个帖子)。

这是设计,设计缺陷还是错误?

[编辑]以下是我使用的实际代码:

// query
    $query = 'category_name=tools,wordpress&orderby=date&order=asc&posts_per_page=-1';
    $wpq = new WP_Query($query);

// loop-style version - shows all 12 posts
    while($wpq->have_posts())
    {
        $post = $wpq->next_post();
        echo "<p>{$post->post_title}</p>";
    }

// get_posts()-style version, only shows 8 posts from tools
    $posts = $wpq->get_posts();
    foreach($posts as $post)
    {
        echo "<p>{$post->post_title}</p>";
    }

谢谢,

戴夫

3 个答案:

答案 0 :(得分:4)

好的,我查看了独立函数get_posts()中的代码,它提供了答案。

与大多数事情一样,WordPress完全不一致!

您必须使用WP_Query->query();而不是WP_Query->get_posts();

// query
    $query      = 'category_name=tools,wordpress&orderby=date&order=desc&posts_per_page=-1';
    $wpq        = new WP_Query();

// new query() syntax has functionality of loop-style version but behaves like get_posts()
    $posts      = $wpq->query($query);
    foreach($posts as $post)
    {
        echo "<p>{$post->post_title}</p>";
    }

// debug
    printr($wpq);

令人遗憾的是WordPress API如此糟糕。

[编辑]刚刚查看->query()内部,并在内部使用->get_posts()。这些简单的调用不应该都有不同的行为。

答案 1 :(得分:1)

嗯,你正在混合一些东西:

get_posts() - 检索符合条件的最新帖子或帖子列表。

你可以通过将争论传递给它来使用get_posts(),它会改变你的主查询(不推荐)

WP_Query - WordPress查询类。

这允许您在wp数据库中创建新查询。

get_posts()它是WP_Query类的方法

检查上面的链接,他们有关于如何按多个类别获取帖子的示例。还请查看Sandeep Kumar的回答。

也可以使用您的示例:

// The Query
$query = new WP_Query( 'category_name=staff,news' );
// The Loop ! there is no get_posts()!
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) { ... }
}

使用get_posts()的一个例子是:

$args = array('category' => '1,2' ); //where 1 and 2 are the posts categories id's

$myposts = get_posts( $args );
foreach ( $myposts as $post ) { 
    setup_postdata( $post );
    ...
}
wp_reset_postdata();

另请查看pre_get_posts()文档,了解您是否无法使用此文档,因为它在到达数据库之前更改了查询,如果您可以使用它,它将为您节省数据库之旅每页加载。

答案 2 :(得分:0)

显示多个类别的帖子

使用类别ID显示包含这些类别的帖子:

$query = new WP_Query( 'cat=2,6,17,38' );

我认为如果没有,那会对您有所帮助,那么您能否提供完整的代码,以便我可以检查并为您提供完整的解决方案。