
本文介绍一种高效、可扩展的方式,通过 get_terms 过滤器批量隐藏多个子分类(如 cat1、cat2),避免重复编写 if/elseif 语句,提升代码可维护性与灵活性。
本文介绍一种高效、可扩展的方式,通过 get_terms 过滤器批量隐藏多个子分类(如 cat1、cat2),避免重复编写 if/elseif 语句,提升代码可维护性与灵活性。
在 WooCommerce 中,默认情况下,当用户访问某个父级商品分类页(如“Electronics”)时,系统会自动列出其所有直接子分类(如 “Smartphones”、“Laptops”、“Accessories”)。但实际运营中,你可能希望隐藏部分子分类(例如内部测试类目、待上线类目或仅用于筛选的辅助类目),而不删除它们——此时,硬编码逐个判断显然不可持续。
以下是一段经过优化的专业解决方案,使用数组 + in_array() 实现灵活批量排除:
add_filter( 'get_terms', 'exclude_specific_product_subcategories', 10, 3 );
function exclude_specific_product_subcategories( $terms, $taxonomies, $args ) {
// 定义需隐藏的子分类 slug 列表(支持任意数量)
$exclude_slugs = array( 'cat1', 'cat2', 'cat3', 'archived-category' );
// 仅在商品分类页面生效(避免影响后台、导航菜单等其他场景)
if ( is_product_category() && ! empty( $terms ) ) {
foreach ( $terms as $key => $term ) {
// 确保 $term 是 WP_Term 对象且属于 product_cat 分类法
if ( is_object( $term ) && isset( $term->taxonomy ) && $term->taxonomy === 'product_cat' ) {
// 使用 in_array 高效匹配,支持大小写敏感(建议统一小写存储 slug)
if ( in_array( $term->slug, $exclude_slugs, true ) ) {
unset( $terms[ $key ] );
}
}
}
}
return $terms;
}✅ 关键优化点说明:
- ✅ 可扩展性强:只需在 $exclude_slugs 数组中增删 slug 值,无需修改逻辑;
- ✅ 类型安全:使用 === 严格比较 taxonomy,并通过 isset() 防止未定义属性警告;
- ✅ 性能友好:in_array(..., true) 启用严格模式,避免 '0' == false 类型隐式转换风险;
- ✅ 作用域精准:is_product_category() 确保仅影响前台商品分类归档页,不影响管理后台、REST API 或其他自定义查询。
⚠️ 注意事项:
- 分类 slug 区分大小写,请确保数组中的值与 WordPress 后台「产品 → 分类目录」中对应分类的 Slug 字段完全一致(推荐全部小写);
- 此过滤器作用于所有 get_terms() 调用,若需更精细控制(如仅排除某特定父分类下的子类),可结合 $args['parent'] 或 get_queried_object() 进一步限定;
- 修改后请清空对象缓存(如启用 Redis/Object Cache)及页面缓存插件(如 WP Super Cache),确保效果即时生效。
该方案兼顾简洁性与健壮性,是 WooCommerce 主题或子主题 functions.php 中推荐的标准实践方式。










