如果我没弄错的话,你不是在找wp_search_stopwords
解决方案的过滤器类型。
下面是对您提到的@kaiser的伟大答案的修改:
/**
* Exclude array of words from all search queries in the front-end
*
* Modification of http://wordpress.stackexchange.com/a/41100/26350 by @kaiser
*/
add_filter( \'posts_search\', function( $search, $q )
{
// Target all search queries in the front-end:
if( is_admin() || ! $q->is_search() ) return $search;
global $wpdb;
$exclude_words = [ \'foo\', \'bar\' ]; // <-- Modify this to your needs!
$sql = " AND {$wpdb->posts}.post_title NOT LIKE \'%%%s%%\'
AND {$wpdb->posts}.post_content NOT LIKE \'%%%s%%\' ";
foreach( (array) $exclude_words as $word )
$search .= $wpdb->prepare(
$sql,
$wpdb->esc_like( $word ),
$wpdb->esc_like( $word )
);
return $search;
}, 10, 2 );
您必须修改
$exclude_words
满足您的需求。这里,我们以前端的所有搜索查询为目标。
请注意\'%%%s%%\'
部分它将转变为\'%someword%\'
在生成的SQL查询中。使用它也很诱人%1$s
用于重复使用同一字符串,但不受$wpdb->prepare()
. 如果我们使用sprintf
相反,我们必须确保它不会转化为$s
带双引号的字符串中的变量:"$s"
.
如果只想修改主搜索查询,可以使用:
if( is_admin() || ! $q->is_main_query() || ! $q->is_search() ) return $search;
代替此检查:
if( is_admin() || ! $q->is_search() ) return $search;
Update:
我们现在可以搜索
foo -bar
排除
bar
从
foo
搜索
然后你可以玩这样的游戏:
add_action( \'pre_get_posts\', function( \\WP_Query $q )
{
if ( ! is_admin() && $q->is_main_query() && $q->is_search() )
$q->set( \'s\', $q->get( \'s\' ) . \' -bar\' );
} );
请注意,可以使用
wp_query_search_exclusion_prefix
滤器