使用WP_Query方法运行查询时,出现了一个对象。我知道可以执行循环以显示内容。但是,我的目标不是显示任何内容,而是要通过执行诸如“ foreach ...”之类的操作来获取一些发布数据。如何获取可以循环访问并获取数据的帖子数据数组?

评论

直接访问发布数据与使用模板标签之间要记住的一个重要区别是,过滤器未应用于数据,某些功能可能会中断。

#1 楼

您应该阅读WordPress Codex上WP_Query的函数参考。那里有很多示例可供参考。如果不想使用while遍历结果集,则可以在属性WP_Query中使用posts获得查询返回的所有帖子。

例如

$query = new WP_Query( array( 'post_type' => 'page' ) );
$posts = $query->posts;

foreach($posts as $post) {
    // Do your stuff, e.g.
    // echo $post->post_name;
}


评论


但是,您链接到的所有示例都没有演示如何处理帖子。因此,很高兴您回答了,很遗憾他们没有在文档中提供它。另一个提示:如果您要对一个唯一的帖子进行匹配,则可以在args中使用带有'posts_per_page'=> 1的函数。函数wp_queryfirstpost($ args){$ q = new WP_Query($ args); $ pp = $ q-> get_posts(); $ firstpost = false;如果($ pp)$ firstpost = $ pp [0]; wp_reset_postdata();返回$ firstpost; }

–亨里克·埃兰森(Henrik Erlandsson)
2014年3月21日在9:38



@rofflox:你是圣人!非常适合绕开get_the_title / ID / younameit。

–小瓶
15年4月30日在17:39

您应该使用$ query-> posts,$ query-> get_posts()将触发查询解析和其他不必要的数据库查询的重新运行

– Tom J Nowell♦
2015年11月1日,下午3:31



$ query-> get_posts();不能按预期工作。不知道为什么,但是返回的帖子少于查询。看到这里:stackoverflow.com/questions/25395299/…

– Laxmana
16-11-12在17:05



这个答案是完全错误的,当您使用一些参数创建一个新的WP_Query时,会立即在内部调用get_posts()方法,并且您不应再次调用它!如果如上例所示再次调用它,它将运行一个DIFFERENT查询,具体取决于初始运行的参数和结果(设置内部标志等),并可能返回其他(较小)的结果集或根本没有结果。正如TomJNowell和Laxmana所建议的那样,应使用$ query-> posts获取帖子数据。

–艾芬豪
16 Dec 4'3:20

#2 楼

实际上,您不需要拒绝使用while()循环。相同的WP_Post对象已经存储在post属性中:

        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            while ( $query->have_posts() ) {

                $query->the_post();

                // now $query->post is WP_Post Object, use:
                // $query->post->ID, $query->post->post_title, etc.

            }

        }


评论


如果是多余的。

–复仇者
17年1月26日在13:40

不,如果不是多余的。在这种情况下,确实如此,但是在大多数生产情况下,您需要在if和while之间执行代码。

–magi182
17 Mar 27 '17在15:36

@ magi182在这种情况下,它变得多余。人们应该学习何时使用它。

– frodeborli
17年4月3日在18:05

@frodeborli,关于以“人们应该”开头的语句的好处是,您几乎总是可以替换为“人们不会”,并且该语句仍然测试为真。

–magi182
17年4月6日在3:28

@ magi182我可能会让一百行代码行补充上面的代码。

– frodeborli
17年4月8日在21:01

#3 楼

您还可以使用get_posts( $args )代替wp_Query(),这将为您提供帖子列表