从搜索查询中筛选关键字

时间:2015-04-03 作者:Jornes

我已经在谷歌上搜索过了,到处都是(http://wordpress.stackexchange.com). 但是,我似乎找不到我一直在寻找的解决方案。

我想问一下,有没有什么解决方案可以让我从搜索查询中排除我想过滤的单词?示例:when visitors using my search box, they type "email" and search, the result returns to no post found with this keyword.. 所有的帖子都包含“email”这个词。但是,我不希望访问者通过搜索电子邮件获得搜索结果。我希望他们得到最好的相关结果。

我发现了这个问题(Exclude Specific Term from Search), 我认为这个问题与我在这里提出的问题相似。但是,我不明白它是如何工作的。

我想排除一些隐藏在搜索结果中的单词,这样访问者就不会得到与文章无关的结果。有什么解决方案吗?谢谢

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

如果我没弄错的话,你不是在找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 排除barfoo 搜索

然后你可以玩这样的游戏:

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 滤器

结束

相关推荐

Apply_Filters(‘the_content’,$Content)与DO_ShortCode($Content)

假设我有一个主题选项或自定义的postmeta文本区域。现在我想执行多个短代码、一般文本、图像等。最佳实践是什么?为什么?选项1:$content = //my text area data; echo apply_filters(\'the_content\', $content); 选项2:$content = //my text area data; echo do_shortcode($content); 请告诉我哪一个是最佳实践,以及为什么。EDIT让我详细描