如何在WordPress搜索结果中排除指定分类ID的内容?
失效原因说明
你第一段代码未生效的核心问题是缺少is_main_query()主查询判断,仅校验前台和搜索页两个条件,无法保证修改的是搜索页面的官方主查询,很容易被主题、插件自带的自定义查询干扰,所以会出现配置后不生效的问题。
解决方案1:直接调整第一段代码即可使用
只需要补充主查询判断,和你目前生效的代码判断逻辑对齐就能正常运行,修改后代码如下:
function my_search_filter( $query ) { // 同时满足前台、搜索页、主查询三个条件才执行修改,避免误改其他查询 if ( !is_admin() && $query->is_search && $query->is_main_query() ) { // 此处-21替换为你要排除的分类ID,排除多个分类用英文逗号分隔即可,示例:'-21,-22,-23' $query->set( 'cat','-21' ); } return $query; } add_filter( 'pre_get_posts', 'my_search_filter' );
提示:该写法兼容全版本WordPress,会自动排除所有归属于对应分类的文章、以及关联了该分类的自定义文章类型内容。
解决方案2:在你当前可用的代码基础上修改
如果你更习惯用已经验证过生效的代码框架,可以直接修改为按分类排除的版本,代码如下:
add_action('pre_get_posts','exclude_posts_from_search'); function exclude_posts_from_search( $query ){ if( !is_admin() && $query->is_main_query() && is_search() ){ // 此处填写要排除的分类ID数组,支持同时添加多个,示例:array(21,22,23) $exclude_category_ids = array(21); $query->set( 'category__not_in', $exclude_category_ids ); } }
提示:该写法分类ID不需要加负号,多分类配置更直观,不容易出现语法错误。
两种方案任选一种即可,都可以实现按分类ID排除搜索结果的需求。
内容的提问来源于stack exchange,提问作者VanDerPrygel
相关产品推荐
相关产品推荐

