为何get_object_taxonomies对自定义文章类型返回空数组,对post正常?
get_object_taxonomies()针对自定义文章类型返回空数组的问题 哥们,我来帮你拆解这个问题——调用get_object_taxonomies('custom-post-type-name')返回空数组,但post能正常返回,大概率是自定义文章类型(CPT)和分类法的关联环节出了问题,或者注册时机不对,下面给你列几个最常见的原因和解决办法:
1. 自定义文章类型注册时没关联目标分类法
注册CPT的时候,register_post_type()的taxonomies参数是核心——你必须把要关联的分类法(不管是默认的category/post_tag,还是自定义分类法)明确列在这里,否则系统不会自动关联。
举个反例(错误写法):
register_post_type('custom-post-type-name', array( 'label' => '我的自定义文章', 'public' => true, // 漏了taxonomies参数,导致没有任何分类法关联 // 其他参数... ));
正确的注册写法:
register_post_type('custom-post-type-name', array( 'label' => '我的自定义文章', 'public' => true, // 把需要关联的分类法全部列在这里 'taxonomies' => array('category', 'post_tag', 'my-custom-taxonomy'), // 其他参数... ));
如果是已经注册好CPT之后才想关联分类法,可以用register_taxonomy_for_object_type()补关联:
// 把category分类法关联到你的自定义文章类型 register_taxonomy_for_object_type('category', 'custom-post-type-name');
2. 自定义分类法注册时没关联目标CPT
反过来,如果你是先注册了CPT,再注册自定义分类法,那在register_taxonomy()的object_type参数里必须包含你的CPT名称,不然分类法不会和CPT绑定。
示例代码:
register_taxonomy('my-custom-taxonomy', array('custom-post-type-name'), array( 'label' => '我的自定义分类', 'public' => true, // 其他参数... ));
3. 注册时机错误(钩子用错了)
不管是注册CPT还是分类法,都必须挂在init钩子上执行——如果你的注册代码放在init之前(比如直接在主题functions.php顶部写),或者两个注册的钩子优先级差太大(比如CPT在优先级20注册,分类法在优先级5注册),都会导致关联逻辑没生效。
正确的做法是把两个注册都挂在init钩子,保持合理的优先级:
add_action('init', 'register_my_custom_post_type', 10); add_action('init', 'register_my_custom_taxonomy', 10); function register_my_custom_post_type() { // 注册CPT的代码 } function register_my_custom_taxonomy() { // 注册分类法的代码 }
4. 别忽略拼写错误!
这是最容易踩的低级坑:检查你传入get_object_taxonomies()的CPT名称,是不是和register_post_type()里的第一个参数完全一致——大小写、连字符/下划线、拼写都不能错。比如你注册的是custom_post_type,但调用时写了custom-post-type,那肯定返回空数组。
快速验证方法
你可以先调用get_post_types()确认你的自定义文章类型确实已经注册成功,再用get_taxonomies(array('object_type' => array('custom-post-type-name')))交叉验证,看能不能拿到关联的分类法,帮你定位问题环节。
内容的提问来源于stack exchange,提问作者geeky87

