优化WP自定义POST类型查询

时间:2016-04-01 作者:WPDEVE

我的使命是优化大型网站。这个网站有很多帖子

在存档页面上,仅显示自定义帖子类型的摘录、缩略图和帖子标题。图像和标题都链接到各自的页面。

每个归档页面上大约有15条帖子,但返回92条查询。没有加载任何帖子,所以只有导航和页脚小部件,大约有40个查询。

我已经读到有一种方法可以阻止WP在数据库中搜索某些东西,所以实际上就是我所需要的。

以下是我当前的自定义帖子类型查询:

<?php
    $args = array( \'post_type\' => \'venues\', \'orderby\' => \'menu_order\', \'order\' => \'ASC\', \'posts_per_page\' => 15);
    $loop = new WP_Query( $args );
    if( $loop->have_posts() ):
    while( $loop->have_posts() ): $loop->the_post(); global $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; ?>
是否有任何方法可以优化此查询,以便只从数据库中获取所需内容?这并不是为了让页面加载更快,因为它已经非常快了,而且还处于Varnish之后,这是为了提高网站的规模,因为他们预计在未来一两周内会出现一个巨大的流量高峰(从每天1000次访问到5000次左右),所以我能做的任何事情都对我有好处!

网站上没有太多活跃的插件;ithemes的安全,yoast,清漆清除和ACF,所以它是相当好的反正只是想看看我是否可以做更多!提前谢谢你。

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

这里最大的问题是,您正在运行一个自定义查询来代替主查询,这是您永远不应该做的。我做了一个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           );
    }
});

相关推荐