增强WordPress自带搜索的相关性

WordPress默认搜索结果的排序是按照文章的发布时间来排列的,为了加强搜索的相关性,遂开始折腾。

打开当前主题的 functions.php文件,添加如下代码:

add_filter('posts_orderby_request', 'wpjam_search_orderby_filter');
function wpjam_search_orderby_filter($orderby = ''){   
    if(is_search()){   
        global $wpdb;   
        $keyword = $wpdb->prepare($_REQUEST['s'],'');   
        return "((CASE WHEN {$wpdb->posts}.post_title LIKE '%{$keyword}%' THEN 2 ELSE 0 END) + (CASE WHEN {$wpdb->posts}.post_content LIKE '%{$keyword}%' THEN 1 ELSE 0 END)) DESC, {$wpdb->posts}.post_modified DESC, {$wpdb->posts}.ID ASC";
    }else{   
        return $orderby;   
    }   
}

这段代码的排序思路是这样的:先按照文章标题的相关性排序,然后按照文章的内容,最后才是日的志修改时间和ID,这样的优先级排序过后WordPress搜索的结果得到的体验应该会更好把。

如果你还想排除搜索结果中的出现的“页面”,只显示文章,那么继续在当前主题functions.php 文件中添加如下代码:

 add_filter('pre_get_posts','search_filter');
function search_filter($query) {   
if ($query->is_search) {   
$query->set('post_type', 'post');   
}   
return $query;   
}

当然,反过来的话把 post_type 设置为 page,这样搜索结果只有页面。

举一反三:

从搜索结果中排除特定文章或页面,在主题的functions.php中添加代码,假设要排除ID为40和9的文章(也可以是页面,文章和页面都有唯一的ID)

function fb_search_filter($query) {  
if ( !$query->is_admin && $query->is_search) {  
    $query->set('post__not_in', array(40, 9) ); // 文章或者页面的ID  
}  
    return $query;  
}  
add_filter( 'pre_get_posts', 'fb_search_filter' );

从搜索结果中排除某些分类下的文章,在主题的functions.php中添加如下代码,即可在搜索结果中排除ID为1和2的分类下的所有文章

function search_filter( $query) {  
if ( !$query->is_admin && $query->is_search) {  
    $query->set('cat','-15,-57'); // 分类的ID,前面加负号表示排除  
}  
    return $query;  
}  
add_filter('pre_get_posts','search_filter');

如果你也和梦飞扬一样使用WordPress博客的搜索功能,那么不妨尝试一下,为你的访客提供一个更好的搜索体验。

展开评论