PRE_GET_POSTS筛选器覆盖所有搜索功能

时间:2020-02-26 作者:DevSem

所以我有一个现成的wordpress“搜索”小部件,我想扩展它。我使用以下过滤器可以在小部件中搜索我的自定义帖子类型:

add_filter( \'pre_get_posts\', function($query) {
    if ($query->is_search) {
        $query->set(\'post_type\', [
            \'post\', \'profile\' ,\'recipe\', \'dish\'
        ]);
    }
});
我发现的问题是,它重写了网站上的所有搜索项目,包括管理面板“帖子”中的搜索框,在那里我得到了自定义帖子类型的结果,尽管他们并不住在那里。

是否有人知道如何改进搜索小部件上的搜索功能,以便在不覆盖整个站点的所有搜索框的情况下包含自定义帖子类型?

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

这很简单,pre_get_posts 适用于所有查询,而不仅仅是前端的查询。因此,如果您不希望它在管理查询上运行,请测试您是否在管理中,并尽早退出!

您可能还想验证您是否在主查询中

add_filter( \'pre_get_posts\', function( \\WP_Query $query) {
    if ( is_admin() ) {
        return;
    }
    if ( ! $query->is_main_query() ) {
        return;
    }
回想起pre_get_posts 在所有查询上运行,无论在哪里,无论是admin、frontend、XMLRPC、REST API等。如果您告诉它只在前端运行,它将只在前端运行。

相关推荐

Swap themes locally

我有一个问题,我的“添加新插件”按钮不起作用,它也不会出现在普通菜单上。我在线搜索,建议的解决方案是交换主题,以检查主题是否冲突或禁用了一些wp核心。我有这个网站已经在生产中,我想改变它本地到另一个主题只是为了测试。我该怎么做?我尽量避免发布登台环境,因为它非常耗时,我只需要调试这一个问题。提前谢谢。