博客 / WordPress/ WordPress搜索结果排除指定页面/文章/自定义分类

WordPress搜索结果排除指定页面/文章/自定义分类

WordPress搜索结果排除指定页面/文章/自定义分类

今天在搜索自己站点文章的时候,发现收录的常用网址页面居然也在搜索结果中显示。

这就很尴尬了,搜索结果显得过于宽泛。用户搜索到一些无关的内容,体验会很差。因此,我尝试在搜索结果页面排除一些特定内容,例如:指定页面、指定文章、指定自定义文章类型(post_type)等。

经过一番尝试,问题得以解决。现在搜索页只会显示与搜索词相关的文章了。

实现方法其实很简单,只需几行代码。下面分享几段用于从WordPress搜索结果中排除特定内容的代码片段。

搜索结果排除指定ID文章或页面

此代码用于从搜索结果中排除具有特定ID的文章或页面。

// 搜索结果排除指定ID的文章或页面
function Bing_search_filter_id($query) {
    if ( !$query->is_admin && $query->is_search ) {
        // 将要排除的文章或页面ID填入数组,例如:array(40, 819)
        $query->set('post__not_in', array(40, 819));
    }
    return $query;
}
add_filter('pre_get_posts', 'Bing_search_filter_id');

搜索结果排除指定分类的文章

此代码用于从搜索结果中排除属于特定分类的文章。

// 搜索结果排除某些分类的文章
function Bing_search_filter_category( $query ) {
    if ( !$query->is_admin && $query->is_search ) {
        // 分类ID前加负号表示排除,例如:'-15,-57'
        // 如果直接写ID(不加负号),则表示只在该分类中搜索
        $query->set('cat', '-15,-57');
    }
    return $query;
}
add_filter('pre_get_posts', 'Bing_search_filter_category');

搜索结果排除所有页面

此代码用于从搜索结果中排除所有“页面”(post_type 为 ‘page’),只保留“文章”(post_type 为 ‘post’)。

// 搜索结果排除所有页面
function search_filter_page($query) {
    if ( $query->is_search ) {
        $query->set('post_type', 'post');
    }
    return $query;
}
add_filter('pre_get_posts', 'search_filter_page');

搜索结果排除自定义文章类型

注意:原文代码有误且不完整。 正确的做法是修改主查询的 post_type 参数,而不是 the_search_query 过滤器。以下是修正后的代码,用于从搜索结果中排除特定的自定义文章类型(例如 ‘site’),只搜索 ‘post’ 和 ‘page’。

// 搜索结果排除自定义文章类型(例如排除 'site' 类型)
function search_exclude_custom_post_type($query) {
    if ( !is_admin() && $query->is_main_query() && $query->is_search ) {
        // 设置要搜索的文章类型数组,这里排除了 'site'
        $query->set('post_type', array('post', 'page'));
    }
}
add_action('pre_get_posts', 'search_exclude_custom_post_type');

使用说明: 以上所有代码均需添加到子主题的 functions.php 文件或使用代码片段插件。请根据你的实际需求(要排除的ID、分类或文章类型)修改代码中的参数。多个代码片段同时使用时,请注意逻辑是否冲突。

发表评论

您的邮箱不会公开。必填项已用 * 标注。