WordPress技术问题:从父分类获取子分类失败排查
问题排查与解决方案
咱们一步步拆解你遇到的问题,找到根本原因和解决办法:
核心问题分析
你当前的困境主要源于三个关键误区:
- 混淆了「分类法(Taxonomy)」和「术语(Term)」的概念:你提到的「名为‘type’的分类」其实是某个分类法下的父术语(ID32),但你在
get_terms()里错误地使用了默认分类法category或未注册的resource,导致无法匹配到对应子术语。 - 未正确注册自定义分类法:你在自定义文章类型
resources的taxonomies参数里写了'resource',但这个分类法根本没注册过,所以调用get_terms('resource')会直接返回「无效分类法」错误。 get_terms()参数使用错误:你必须明确父术语ID32所属的分类法名称,才能正确获取它的子术语。
分步修复方案
1. 先注册正确的自定义分类法
假设你需要的是用来区分资源类型(Blog/Case study/Webinar)的分类法,我们先注册一个名为resource_type的分类法,并关联到resources文章类型:
// 注册自定义分类法 add_action( 'init', 'register_resource_type_taxonomy' ); function register_resource_type_taxonomy() { $args = array( 'label' => '资源类型', 'rewrite' => array( 'slug' => 'resource-type' ), 'hierarchical' => true, // 开启层级支持(父/子分类) 'show_admin_column' => true, // 后台文章列表显示该分类 ); // 关联到resources自定义文章类型 register_taxonomy( 'resource_type', 'resources', $args ); }
提示:如果你之前已经创建过对应的分类法,请替换成你实际使用的分类法名称,确保和父术语ID32所属的分类法一致。
2. 确认父术语ID32的所属分类法
你可以通过两种方式确认:
- 后台查看:进入
Resources菜单下的分类管理入口,找到ID32的父术语,查看它的所属分类法; - 数据库查询:查看
wp_term_taxonomy表,找到term_id=32的条目,对应的taxonomy字段值就是你需要的分类法名称。
3. 正确调用get_terms()获取子术语
假设你确认父术语ID32所属的分类法是resource_type,使用以下代码即可正确获取子术语:
$parent_term_id = 32; // 替换成你实际的分类法名称 $target_taxonomy = 'resource_type'; $child_terms = get_terms( array( 'taxonomy' => $target_taxonomy, 'parent' => $parent_term_id, 'hide_empty' => false, // 如果子分类未关联文章也需要显示,必须加这个参数 ) ); // 错误处理 if ( is_wp_error( $child_terms ) ) { echo '错误信息:' . $child_terms->get_error_message(); } else { var_dump( $child_terms ); }
注意:从WordPress 4.5版本开始,推荐使用数组参数的形式调用
get_terms(),而非旧版的get_terms($taxonomies, $args)写法。
4. 修正自定义文章类型注册代码
把之前的taxonomies参数替换成正确的分类法名称:
register_post_type( 'resources', tp_build_post_args( 'resources', 'Resource', 'Resources', array( 'menu_icon' => 'dashicons-welcome-write-blog', 'menu_position' => 20, 'has_archive' => true, 'public' => true, 'supports' => array('editor', 'title','author','thumbnail', 'revisions'), 'taxonomies' => array('resource_type', 'category') // 替换为正确的分类法名称 ) ) );
额外排查点
- 如果父术语ID32确实在默认
category分类法下,之前返回空数组可能是因为子分类未关联任何文章(默认hide_empty为true会过滤空分类),或者父ID填写错误; - 确保你在
init钩子之后调用get_terms(),如果在init之前执行,分类法还未注册,也会返回错误或空数组。
内容的提问来源于stack exchange,提问作者Freddy
相关产品推荐
相关产品推荐

