多个查询和性能-wp_Query

时间:2018-05-13 作者:user142553

可能是关于wp\\u查询和if->have post等的愚蠢问题。

我有了新的WP\\u查询($taxonomy\\u Query),然后在以下时间运行if:

<?php if ($taxonomy_query->have_posts()) : while ( $taxonomy_query->have_posts() ) : $taxonomy_query->the_post();   ?>
然后我做一些事情并以之结束

<?php   endwhile;   endif;  wp_reset_postdata();?>
再往下看,我使用foreach,使用:

<?php
     $tax_countries = $taxonomy_query->posts;
     foreach ($tax_countries as $option) {
      echo \'<option value="\'.$option->ID .\'">\'.$option->post_name .\'</option>\';
     }
     ?>
这是个问题吗?有没有更有效的方法。

我试图在上面的原始if中创建一个数组,然后对数组进行foreach,但我认为这不是一个好主意。

对此有何想法?如果您有任何帮助,我们将不胜感激。谢谢,D。

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

不,问题在于您没有在问题中提出的部分,即查询的性能特征完全取决于这一点:

我有了新的WP\\u查询($taxonomy\\u Query),然后在以下时间运行if:

那个首字母= new WP_Query([... 负责整个性能成本。

循环开始时,昂贵的部分已经结束。因此,不,您的循环很好,如果您正在寻求性能提升,那么这里没有优化的空间。您查询的内容决定了成本。

再往下看,我使用foreach,使用:

$tax_countries = $taxonomy_query->posts;
foreach ($tax_countries as $option) {
我认为这不太理想,最好使用标准的post循环,结合rewind\\U posts方法将循环放回起点。

你也没打电话have_posts 根据您的查询。

因此,您应该能够执行以下操作来运行相同的循环两次:

$q = new WP_Query([... arguments go here ...]);
if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
        $q->the_post();
        // do stuff
    }
    $q->rewind_posts();
    while ( $q->have_posts() ) {
        $q->the_post();
        // do other stuff
    }
    wp_reset_postdata();
} else {
    // nothing found
}
吹毛求疵,每行做一件事,不要把所有的if和while开篇和结尾都放在同一行,这样会适得其反,而且会使内容更难阅读WP_Query 尽可能多地,不是没有人有时间处理所有调用的4或5个函数吗WP_Query 不管怎样,使用所有的边缘案例和注意事项{ } 语法,它可以更好地与编辑器和自动化工具配合使用,让编辑器完成所有繁重的工作(如果使用endwhile; etc)
  • 如果找不到帖子,它仍会调用wp_reset_postdata 即使没有要重置的post数据!将其放在循环之后,但放在if语句中
  • 根据WP编码标准的要求,使用制表符缩进,并让编辑器为您缩进。如果必须使用空格,请选择一个编码标准并遵守它,但最重要的是,要保持一致。如果要替换主查询,而不是执行额外的查询,任何不太合适的编辑器都会为您执行此操作pre_get_posts 取而代之的是

    结束

    相关推荐

    使用新的WP-Query()从循环中过滤后期格式;

    嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post