WordPress中获取子分类应使用get_terms()配合parent参数,而非不存在的get_children();递归获取需结合get_term_children()与get_terms();注意缓存、权限及自定义分类法的层级设置。

用 get_children() 获取 WordPress 子栏目(分类)集合
WordPress 默认不提供直接按“父级分类 ID”批量取子分类的函数,get_children() 是误传——它只处理文章附件、页面等 post_type 关联对象,对分类(taxonomy)完全无效。真正在用的是 get_terms() 配合 parent 参数。
正确做法是调用 get_terms(),并显式指定 taxonomy(如 'category' 或自定义分类法名),再传 'parent' => $parent_id:
$children = get_terms([
'taxonomy' => 'category',
'parent' => 5,
'hide_empty' => false,
]);
-
parent设为0表示顶级分类;设为具体 ID(如5)才返回其直接子项 - 务必加
'hide_empty' => false,否则无文章的子分类会被过滤掉 - 返回的是
WP_Term对象数组,不是 ID 列表;需用$term->term_id或$term->name取值
递归获取全部嵌套子栏目(含孙子级)
如果要拉出某个分类下所有后代(不限层级),get_terms() 本身不支持深度递归,得自己写循环或用 get_term_children() 先拿 ID 列表,再批量查详情。
推荐组合方案:
立即学习“PHP免费学习笔记(深入)”;
$all_child_ids = get_term_children(5, 'category');
if (!is_wp_error($all_child_ids)) {
$all_children = get_terms([
'taxonomy' => 'category',
'include' => $all_child_ids,
'hide_empty' => false,
]);
}
-
get_term_children(5, 'category')返回的是纯 ID 数组(整数),但仅限直接+间接后代,不含自身 - 它不返回对象,也不带排序/字段控制,所以必须再用
get_terms()查一次完整数据 - 注意:该函数在子分类极多时可能触发内存或超时,生产环境建议加缓存
在主题模板里安全调用子栏目集合
别在循环中反复查数据库。常见错误是在 category.php 或 archive.php 里每次 get_terms(['parent' => get_queried_object_id()]),这会重复执行 N 次。
- 先用
$queried_object = get_queried_object()拿到当前分类对象,确认它是有效的WP_Term再查 - 用
wp_cache_get()+wp_cache_set()包一层,键名建议含taxonomy、parent_id和hide_empty状态 - 如果只是输出 HTML 列表,优先用
wp_list_categories(['child_of' => $id]),它底层已做优化,且支持 depth 控制嵌套深度
自定义分类法(Custom Taxonomy)下取子栏目要注意什么
用 get_terms() 时,taxonomy 参数必须填注册时用的精确 slug,比如注册时是 'product_cat',就不能写成 'category' 或漏写。
- 检查是否启用层级:注册时必须设
'hierarchical' => true,否则parent参数无效 - 若分类法关联了多个 post_type,
get_terms()不受 post_type 限制——它只管分类结构,不管文章是否存在 - 权限问题:如果某子分类被设为 “私有” 或用户无权查看,
get_terms()默认仍会返回,需手动用current_user_can('manage_categories')做过滤
get_term_children() 返回的 ID 在后续 get_terms() 中因状态变更(如被删除)而查不到对象。这些边界情况比语法更常导致空数组或 Notice 报错。











