如何使用WP_QUERY来降低查询次数

时间:2016-02-17 作者:Boris Kozarac

我在页脚中有以下代码(我删除了不必要的html),我正在尝试优化这些代码。我的服务器白天窒息:)如果posts_per_page 设置为1,则每个帖子有48个查询。如果我设置为18 就像我想的那样86 每个帖子的查询量,对我来说似乎很大,尤其是因为我有1500篇帖子。有没有办法对此进行优化?为什么WP\\u Query不能在单个查询中完成任务?

 $footer_query = new WP_Query(array(

     \'posts_per_page\' => 18,
     \'orderby\' => \'rand\',
     \'post_type\' => \'post\',
     \'post_status\' => \'publish\',
     \'no_found_rows\' => true, // counts posts, remove if pagination require
     \'update_post_term_cache\' => false, // grabs terms, remove if terms required (category, tag...)
     // look for post which has featured img
     \'meta_query\' => array(
       array(
          \'key\' => \'_thumbnail_id\',
            )
      )
      ));


      // LOOP
      if ($footer_query->have_posts()) :
       while ($footer_query->have_posts()) : $footer_query->the_post(); 
      ?>

         <a href="<?php the_permalink() ?>">
           <?php echo get_the_post_thumbnail( get_the_ID(), \'small_thumbnail\', array(\'class\' => \'img-responsive\') ); ?>
         </a>

        <a href="<?php the_permalink() ?>">
            <?php the_title(); ?>
            <?php echo get_field(\'subtitle\', get_the_ID()); ?>
        </a>

   <?php
   endif; 
   endwhile; 

 wp_reset_query(); 

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

你在这里遇到的最大问题是调用你的帖子缩略图。这会在每篇文章中添加两个查询,这相当繁重。当我们看到source code of get_the_post_thumbnail(), 我们将看到缩略图只缓存在主查询中,而不是自定义查询中。所以我们需要手动完成。

您可以添加

update_post_thumbnail_cache( $footer_query );
就在你的循环之前。这应该可以处理大量的db调用

只需对代码进行一些注释

您应该使用wp_reset_postdata() 循环之后,不是wp_reset_query(), 后者与连用query_posts 你永远不应该使用它。wp_reset_postdata() 也应在endwhileendif

随机排序总是比任何其他排序慢得多,因为它仍然要通过完整的数据库来挑选随机帖子,所以您可能需要研究一下

没有必要用默认值定义参数。post_type 默认设置为postpost_statuspublish

正确地缩进代码,使其更可读、更易于维护和调试

从PHP 5.4开始,您可以使用需要较少书写的短数组语法;-)

您可能可以按如下方式重写代码

$args = [
    \'posts_per_page\' => 18,
    \'orderby\'        => \'rand\',
    \'no_found_rows\'  => true, // counts posts, remove if pagination require
    // look for post which has featured img
    \'meta_query\'     => [
        [
            \'key\'    => \'_thumbnail_id\',
        ]
    ]
];
$footer_query = new WP_Query( $args );

// Update the thumbnail cache
update_post_thumbnail_cache( $footer_query );

// LOOP
if ($footer_query->have_posts()) :
    while ($footer_query->have_posts()) : 
        $footer_query->the_post(); 
        ?>

        <a href="<?php the_permalink() ?>">
            <?php echo get_the_post_thumbnail( get_the_ID(), \'small_thumbnail\', array(\'class\' => \'img-responsive\') ); ?>
        </a>

        <a href="<?php the_permalink() ?>">
            <?php the_title(); ?>
        </a>

        <?php

    endwhile; 
    wp_reset_postdata();
endif;