Remove the Homepage Query

时间:2016-05-09 作者:Tom J Nowell

我有一个主页显示home.php 模板,包含两个侧栏,其中包含小部件。

主查询仍然包含标准的10篇帖子,但由于我没有显示这些帖子,我想完全消除对数据库的查询。如果需要,可以使用一个空的post循环,因为我没有在home.php 样板

我该怎么做?我可以用pre_get_posts 为了最小化和减少查询,但这仍然给我留下了一个非常快速的查询,我如何完全消除它?

3 个回复
最合适的回答,由SO网友:birgire 整理而成

Theposts_request 过滤通过WP_Query 我们对此感兴趣:

if ( !$q[\'suppress_filters\'] ) {
    /**
     * Filter the completed SQL query before sending.
     *
     * @since 2.0.0
     *
     * @param array    $request The complete SQL query.
     * @param WP_Query &$this   The WP_Query instance (passed by reference).
     */
      $this->request = apply_filters_ref_array( \'posts_request\', 
          array( $this->request, &$this ) );
   }

   if ( \'ids\' == $q[\'fields\'] ) {
       $this->posts = $wpdb->get_col( $this->request );
       $this->posts = array_map( \'intval\', $this->posts );
       $this->post_count = count( $this->posts );
       $this->set_found_posts( $q, $limits );
       return $this->posts;
   }
我们可以通过posts_request 滤器下面是一个示例:

add_filter( \'posts_request\', function( $request, \\WP_Query $q )
{
    // Target main home query
    if ( $q->is_home() && $q->is_main_query() )
    {
        // Our early exit
        $q->set( \'fields\', \'ids\' );

        // No request
        $request = \'\';
    }

    return $request;    

}, PHP_INT_MAX, 2 );
我们强迫\'fields\' => \'ids\' 提前退出。

Theposts_pre_query 过滤器(WP 4.6+)

我们也可以使用新的posts_pre_querysrc过滤器+

add_filter( \'posts_pre_query\', function( $posts, \\WP_Query $q )
{
    if( $q->is_home() && $q->is_main_query() )
    {
        $posts = [];
        $q->found_posts = 0;
    }
    return $posts;
}, 10, 2 );
此过滤器可以跳过通常的数据库查询来实现自定义POST注入。

我刚刚测试了这个,注意到这不会阻止粘贴帖子,与posts_request 方法

检查车票#36687 有关更多信息和example there 作者@BoonebGrages。

SO网友:Pieter Goosen

这是我从@birgire学到的一个巧妙的技巧,我们可以通过添加AND where 0=1WHERE SQL查询的子句。这可能仍然会导致一个db查询,但它肯定会阻止主查询查询帖子

add_filter( \'posts_where\', function ( $where, \\WP_Query $q )
{
    if (    $q->is_home()
         && $q->is_main_query()
    ) {
        $where .= \' AND where 0 = 1\';
    }

    return $where;
}, 10, 2 ); 
您也可以尝试更换WHERE 带有的子句where 0 = 1

$where = \' where 0 = 1\';
而不是

$where .= \' AND where 0 = 1\';
不幸的是,我没有时间测试任何东西,但这应该是一个很好的起点

SO网友:Tom J Nowell

参考,前:45q,后:42q

该代码与@birgire使用的代码非常相似

function _tomjn_home_cancel_query( $query, \\WP_Query $q ) {
    if ( !$q->is_admin() && !$q->is_feed() && $q->is_home() && $q->is_main_query() ) {
        $query = false;
        $q->set( \'fields\', \'ids\' );
    }
    return $query;
}
add_filter( \'posts_request\', \'_tomjn_home_cancel_query\', 100, 2 );

相关推荐

将wp_Query替换为wp_User_Query

我在插件中制作了一些订阅者档案和单曲(个人资料页),其中我还包括了一个“用户单曲”模板,通过template_include. 不过,我正在尝试从插件中删除一些模板,以使其使用主题模板。我用了locate_template( \'single.php\' ) 从活动主题中选择单个模板。我没有使用全局wp_query 在本例中显示我的内容,但页面显示了基于查询默认值的循环(十篇帖子)。我想知道的是,我是否可以完全放弃默认查询,用wp_user_query 我可以将查询到的用户ID输入其中。然后我想筛选the