为什么偏爱标准的WP循环而不是迭代(new WP_Query())->Get_Posts()?

时间:2019-05-17 作者:user3574603

WP循环如下:

if ( have_posts() ) {
  while ( have_posts() ) {
    the_post();
    ...
为什么它优先于以下内容?

foreach( (new WP_Query())->get_posts() as $post ) { ... }
对我来说,后者的情况更为明显。我是PHP和WP的新手,我正在努力理解为什么我应该使用前者。

使用standard loop? 正在迭代get_posts() 效率有下降吗?

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

几个原因

1。过滤器和操作通过使用标准循环,可以执行插件所依赖的各种过滤器和操作。

此外,您还可以设置the_post 正确,允许以下功能the_content etc正常工作。一些过滤器甚至可以在循环中插入“posts”

2。内存效率

通过将所有帖子作为一个数组获取,您可以强制WP_Query 获取其拥有的数据并创建WP_Post 对象。通过标准的post循环,这些都是根据需要创建的

3。PHP警告

您的循环不会检查是否确实找到了任何帖子,因此不可能给出“没有可用帖子”样式的消息。它有时还会生成PHP警告。

4。通过使用覆盖WP全局$post 您正在重写一个全局变量,这可能会产生意外的后果,尤其是如果此循环嵌套在您不知道的另一个循环中

5。PHP效率和正确性

foreach 这种情况是不好的做法,就像创建然后使用对象而不进行错误检查一样。

6。调试许多工具和插件都假定您使用的是标准循环,并且构建这些工具和插件是为了让生活更轻松。这样做你就把所有的东西都扔掉了

7。有更好的选择crude 但比foreach更好的选择可能是array_walk:

$q = new WP_Query([ ..args ]);
array_walk( $q->get_posts(), function( $post ) {
    //
});
请注意,我不建议使用array_walk.

PHP生成器现在并不是说您不能在仍然拥有所有优势的情况下使用不同样式的循环。

例如,WP Scholar有一篇文章展示了一个基于php生成器的循环:

if ( have_posts() ) {
   foreach ( wp_loop() as $post ) {
      echo \'<h1>\' . esc_html( get_the_title() ) . \'</h1>\';
   }
} else {
   echo \'<h1>No posts found!</h1>\';
}
这样做的优点是,它仍然调用标准循环的所有函数,但它们已经被抽象掉了。

https://wpscholar.com/blog/creating-better-wordpress-loop/

我相信还有其他的循环,但标准循环是可靠的、可预测的,并且对所有人都可读

SO网友:Nicolai Grossherr

我建议您查看文档:

您可以在那里找到更多详细信息。

下面是一个简短的摘要:

通过该循环,您可以访问:

Template Tags

Conditional Tags

并非所有模板和条件标记都依赖于循环,有关在循环中使用什么的概述:

此外,还有一些挂钩可以与回路一起使用,例如:

从更广泛的角度来看,您可以包括以下内容:

和下列所有过滤器:

相关推荐