如何让WP_QUERY在WordPress网站上运行得更快?

时间:2020-05-01 作者:mhweb

这段代码是自定义WordPress主页的一部分,该主页显示了使用WP\\U查询的7篇最新帖子,第一篇帖子有一个自定义html结构,而其余的则有另一个html结构。

然后还有第二个WP\\u查询,该查询查询最近5篇文章中的特定标记,如果一篇文章有相同的标记,并且已经出现第一个WP\\u查询,则不会显示任何重复。然后,代码还在第一篇文章中使用自定义html,其余部分的格式不同。

多年来,代码一直工作正常,但最近加载页面需要很长时间(大约7秒),使用WordPress中的查询监视器插件,WP\\U查询显示为非常慢的查询。

因此,如何优化或重写WP\\u查询和“不要重复代码”,使其更高效、更快,以便页面的每个块在过滤重复帖子的同时显示帖子。

<section class="news-front">
</div>
      <div class="news-list-col-1">
          <?php $count = 0; //Count starts to edit each post ?>
        <?php $do_not_duplicate = array(); ?>

        <?php $query = new WP_Query(array (
                                    \'posts_per_page\' => 7,
                                    \'no_found_rows\' => true,
                                    )
                                  );?>

          <?php while ($query->have_posts()) : $query->the_post(); ?>
          <?php $do_not_duplicate[] = $post->ID; ?>
          <?php $count++; ?>
          <?php if ($count == 1) : ?>
              <article class="news-item-1" <?php post_class();?> >


                   <a href="<?php the_permalink() ?>" class="cover-link">

                  <?php if(has_post_thumbnail($post->ID)) :?><!-- .article_image -->

                    <div id="post-hero-image" style="background-image: url(\'<?php the_post_thumbnail_url(\'large\'); ?>\')" ></div><!-- .article_image -->
                    <?php else :?>

                          <!-- Nothing inside -->

                    <?php endif;?><!-- .article_image -->


                      <header class="news-item-data">

                         <h2 itemprop="headline" class="entry-title"><?php the_title(); ?></h2>

              <?php get_template_part( \'types/content\', \'meta\' ); ?><!-- .entry-meta -->

            <?php if( $post->post_excerpt ) : ?>
                              <div class="post-description" >
                                      <div class="post-descr-content" ><?php echo $post->post_excerpt; ?></div>
                              </div>
                          <?php else : ?>
                              <div class="post-description" >
                                      <div class="post-descr-content" ><?php custom_excerpt(154); ?></div>
                              </div>
                          <?php endif; ?>

                          </header>
                   </a>
              </article>


      </div>
      <div class="news-list-col">
          <?php else : ?>
          <article class="news-items-list" <?php post_class();?> >

                  <a href="<?php the_permalink() ?>" class="cover-link" >

          <?php if(has_post_thumbnail($post->ID)) :?><!-- .article_image -->

                <div id="post-hero-image" style="background-image: url(\'<?php the_post_thumbnail_url(\'medium_large\'); ?>\')" ></div><!-- .article_image -->
                    <?php else :?>

                          <!-- Nothing inside -->

                    <?php endif;?><!-- .article_image -->

                      <header class="news-item-data">
                          <h2 itemprop="headline" class="entry-title"><?php the_title(); ?></h2>
                          <?php get_template_part( \'types/content\', \'meta\' ); ?><!-- .entry-meta -->
                      </header>
                     <?php if ( !wp_is_mobile() ) :?>
                        <?php if( $post->post_excerpt ) : ?>
                          <div class="post-description" >
                              <div class="post-descr-content" ><?php echo $post->post_excerpt; ?></div>
                          </div>
                        <?php else : ?>
                          <div class="post-description" >
                              <div class="post-descr-content" ><?php custom_excerpt(154); ?></div>
                          </div>
                        <?php endif; ?>
                      <?php endif; ?>
                   </a>
          </article>
          <?php endif; ?>
          <?php   endwhile; wp_reset_postdata(); ?>
      </div>

  </section>

<section class="news-grid-5">
      <div class="news-list-col-1">

          <?php $count = 0; //Count starts to edit each post ?>
          <?php   $query = new WP_Query(array(
                                              \'tag_slug__in\' => array(\'how-to\'),
                                              \'posts_per_page\' => 5,
                                              \'order\' => \'DESC\',
                                              \'no_found_rows\' => true,
                                              \'post__not_in\' => $do_not_duplicate,
                                              )
                                            );?>
        <?php   while ($query->have_posts()) : $query->the_post(); ?>
          <?php   $do_not_duplicate[] = $post->ID; ?>
          <?php $count++; ?>
          <?php if ($count == 1) : ?>
          <article class="news-grid-5-item-1" >
              <a href="<?php the_permalink() ?>" class="cover-link" >
          <?php if(has_post_thumbnail($post->ID)) :?><!-- .article_image -->

                <div id="post-hero-image" style="background-image: url(\'<?php the_post_thumbnail_url(\'large\'); ?>\')" ></div><!-- .article_image -->
                    <?php else :?>

                          <!-- Nothing inside -->

                    <?php endif;?><!-- .article_image -->

          <header class="news-item-data">
                        <h2 itemprop="headline" class="entry-title"><?php the_title(); ?></h2>
                      <?php get_template_part( \'types/content\', \'meta\' ); ?><!-- .entry-meta -->
            <?php if( $post->post_excerpt ) : ?>
                              <div class="post-description" >
                                      <div class="post-descr-content" ><?php echo $post->post_excerpt; ?></div>
                              </div>
                          <?php else : ?>
                              <div class="post-description" >
                                      <div class="post-descr-content" ><?php custom_excerpt(154); ?></div>
                              </div>
                          <?php endif; ?>
                    </header>
               </a>
          </article>
    <?php else : ?>
          <article class="news-grid-1" >
              <a href="<?php the_permalink() ?>" class="cover-link" >

          <?php if(has_post_thumbnail($post->ID)) :?><!-- .article_image -->

                <div id="post-hero-image" style="background-image: url(\'<?php the_post_thumbnail_url(\'large\'); ?>\')" ></div><!-- .article_image -->
                    <?php else :?>

                          <!-- Nothing inside -->

                    <?php endif;?><!-- .article_image -->

                  <header class="news-item-data">
                      <h2 itemprop="headline" class="entry-title"><?php the_title(); ?></h2>
                    <?php get_template_part( \'types/content\', \'meta\' ); ?><!-- .entry-meta -->
                  </header>
               </a>
          </article>
    <?php endif; ?>
          <?php   endwhile; wp_reset_postdata(); ?>
          </div>
  </section>

1 个回复
SO网友:Matthew Boynes

两条建议:

最重要的是,数据库查询性能取决于与查询匹配的行数,而不是所需的行数。即使你只要求5篇帖子,数据库也可能需要查询和排序一百万条结果才能给你这5篇。假设我给了你一张100000张索引卡,每个索引卡上都有不同的随机数,我让你找出5个最大的数字。我可能只想要5个,但你仍然需要看全部10万个,才能找出哪5个是。总之,您需要获得结果集,在这种情况下,通常最简单的方法是向WP\\u查询参数添加日期查询。如果你只想要7或5篇最新的帖子know 如果它们总是从上个月开始,请添加一个日期查询,将查询限制为上个月:\'date_query\' => [ [ \'after\' => \'-30 days\' ] ],. 如果可以的话,可以选择更近的距离,如果必须的话,可以选择更大范围的距离。你会惊讶于这有多大帮助!我给了a WordCamp talk 如果你感兴趣的话,这是一个相当沉重的话题NOT IN() 查询不是最佳的。如果可能,最好查询其他帖子,然后使用PHP删除它们。在本例中,您需要在第二次查询中查询12篇文章,然后使用类似PHP的array_filter() 排除不希望复制的7