这里最大的问题是,您正在运行一个自定义查询来代替主查询,这是您永远不应该做的。我做了一个quite extensive post on this very issue, 你一定要先正确阅读那篇文章。通过返回默认循环并使用pre_get_posts
要相应地更改主查询,您将节省大量的db调用。请记住,即使删除主循环并将其替换为自定义循环,主查询仍会正常运行。用自定义查询替换主查询只会导致更多的额外工作和db调用。这就像是两次做同样的工作,只得到一次报酬。
您还需要记住,post缩略图不会缓存用于自定义查询,因此仅此一项就导致每个post额外调用2个db。这就是为什么您可以从自定义查询中看到大量查询。你可以看看this post 如何对此进行优化
编辑您的问题所在的存档页中的代码应替换为以下代码。您不应该有任何自定义查询来代替主查询。
<?php
if( have_posts() ):
while( have_posts() ):
the_post();
?>
<li class="venue-item" itemscope="" itemtype="http://schema.org/Article">
<div class="featured-image">
<a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" rel="bookmark">
<?php the_post_thumbnail();?>
</a>
</div>
<div class="one-third">
<div class="venue-description">
<a href="<?php echo get_permalink();?>"><h3 itemprop="headline">
<?php echo get_the_title(); ?> </h3>
</a>
<p itemprop="description">
<?php the_excerpt() ?>
</p>
</div>
</div>
</li>
<?php
endwhile;
endif;
?>
这应该会看到一个下拉查询。现在需要做的就是修改主查询以满足您的需要
add_action( \'pre_get_posts\', function ( $q )
{
if ( !is_admin()
&& $q->is_main_query()
&& $q->is_post_type_archive( \'venues\' )
) {
$q->set( \'order\', \'ASC\' );
$q->set( \'orderby\', \'menu_order\' );
$q->set( \'posts_per_page\', 15 );
}
});