如何将POSTS_REQUEST过滤器仅限于主查询

时间:2012-10-24 作者:elleeott

我正在尝试对搜索结果运行自定义sql,但在不运行冗余查询的情况下,我很难将筛选器限制为主查询。

我通过以下方式成功获得结果:

add_filter( \'posts_request\', \'my_request_filter\' );

function my_request_filter($sql) {
    if(is_search()) {
        $sql = \'some custom sql query\'
    }
    return $sql;
}
这里的问题是,这会影响页面上运行查询的其他内容,比如最近发布的小部件。我可以通过在其他查询中添加\'suppress\\u filters\'=>true来防止这种情况,但这似乎有点倒退,我不打算通过破解core来添加它。

“pre\\u get\\u posts”过滤器似乎更合适,因为我可以检查is\\u main\\u查询,但我在如何使用此过滤器修改查询方面受到限制-我不知道如何用自定义sql语句创建的对象完全替换查询对象。

最不理想的解决方案是忽略主查询,完全运行另一个查询;但是这个练习的全部目的是用一个为此上下文优化的查询来替换主查询。

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

posts\\u请求过滤器实际上接受第二个参数,即查询。您可以检查该查询是否是主查询。尝试以下操作:

add_filter( \'posts_request\', \'my_request_filter\', 10, 2 );

function my_request_filter($sql, $query) {
    if($query->is_main_query() && is_search()) {
        $sql = \'some custom sql query\'
    }
    return $sql;
}

结束

相关推荐