如何仅为搜索查询修改POSTS_WHERE过滤器

时间:2017-01-09 作者:dtd93

我使用posts\\u where filter来修改用户在web上的搜索,但我发现一些默认的小部件,如“最近的帖子”也使用此过滤器,它们的行为也会被修改。我试图找到一种方法来避免用户搜索以外的任何内容使用posts\\u where过滤器。

这是我的代码:

add_filter( \'posts_where\' , \'posts_where_statement\' );

function posts_where_statement( $where ) {
   global $wp_query;
   global $expp;
   global $wpdb;
   $local_db = $wpdb->prefix."posts";
   $front_page_id = get_option(\'page_on_front\');

   if ( (\'page\' != get_option(\'show_on_front\') || $front_page_id != $wp_query->query_vars[\'page_id\']) && (!($wp_query->is_search)) )
       return $where;

   //some $where modifications

   remove_all_actions ( \'__after_loop\');
   return $where;
}
是否有任何其他功能或方法可以使此挂钩/过滤器仅适用于搜索查询?(从用户输入中获取结果的一个)

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

Problem:

当前代码段的问题在于,无论当前查询对象是什么,您都只是在检查全局主查询对象。

Workaround:

请注意posts_where 筛选器回调,是当前查询对象。

使用该选项确定是否是前端的主搜索查询:

add_filter( \'posts_where\', function ( $where, \\WP_Query $q ) 
{
    if( ! is_admin() && $q->is_main_query() && $q->is_search()) // No global $wp_query here
    {
        // ... your modifications
    }

    return $where;      

}, 10, 2 ); // Note the priority 10 and number of input arguments is 2
还有posts_search 如果您需要修改WHERE搜索部分,请对其进行筛选。

但一般来说,我会说,只有在您确实必须并且没有其他选择的情况下,才可以手动修改生成的SQL。