Altering the WHERE
clause
There’s a filter named posts_search
that allows to filter the SQL WHERE
clause used for the query during search (when WP_Query::is_search()
returns true and WP_Query->s
is set):
add_filter( 'posts_search', 'wpse134392PostsSearchSQL', 20, 2 );
function wpse134392PostsSearchSQL( $sql, $wp_query )
{
// Alter SQL clause here
return $where;
}
Custom ORDERBY
To intercept the ORDERBY
statement (for e.g. to sort by author, so the author who searches gets his posts first/last), you can make use of posts_search_orderby
:
add_filter( 'posts_search_orderby', 'wpse134392PostsSearchOrderbySQL', 20, 2 );
function wpse134392PostsSearchOrderbySQL( $orderby, $wp_query )
{
if ( is_admin() )
return $GLOBALS['wpdb']->posts."post_date";
return $orderby;
}
Fine grained SQL
You can as well alter the posts_clauses
or pre_get_posts
to return even more fine tuned results by checking inside your callback if is_admin()
and $query->is_search()
are TRUE
.
Don’t search everything
To exclude common terms that won’t help, you can use WP_Query::get_search_stopwords()
– or better: A callback on the filter. Currently the stopwords are:
about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www
An example filter callback:
add_action( 'wp_search_stopwords', 'wpse134392SearchStopwords' );
function wpse134392SearchStopwords( $stopwords )
{
return $stopwords + array(
'my',
'your',
'easy',
);
}
Hint: It looks like something (a plugin probably) is already intercepting your callback as there’re words in there that shouldn’t get searched.