wp_get_object_terms指定fields为tt_ids返回空数组问题求助
排查wp_get_object_terms返回tt_ids空数组的问题
我之前维护WordPress站点时也碰到过一模一样的情况——明明fields='all'能正常拿到分类项对象,指定'tt_ids'就返回空数组,结合你两个站点一正常一异常的情况,咱们可以从这几个方向逐步排查:
1. 先确认数据库关联是否正常
tt_ids对应的是wp_term_taxonomy表中的term_taxonomy_id,这个值是通过wp_term_relationships表和对象ID绑定的。你可以先手动检查数据库:
- 打开
wp_term_relationships表,查找object_id = 639的记录,看看对应的term_taxonomy_id有没有有效数值 - 再去
wp_term_taxonomy表中,用这个term_taxonomy_id查询,确认taxonomy字段确实是mh_menu,且deleted字段为0(未被软删除)
也可以直接执行SQL验证:
SELECT tr.term_taxonomy_id FROM wp_term_relationships tr JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id = 639 AND tt.taxonomy = 'mh_menu';
如果这条SQL返回空,说明对象和分类项的关联数据出了问题,需要重新绑定;如果有结果,那问题就出在WordPress的函数逻辑或第三方过滤器上。
2. 排查插件/主题的过滤器干扰
这种站点间的差异,大概率是某个插件或主题添加了wp_get_object_terms或term_query的过滤器,修改了特定fields参数下的返回结果。你可以:
- 临时禁用所有第三方插件,切换到WordPress默认主题(比如Twenty Twenty-Four)
- 再次执行
wp_get_object_terms(639, 'mh_menu', array('fields' => 'tt_ids', 'orderby' => 'none'))测试
如果此时能正常返回tt_ids,就逐个启用插件、切换主题,找到导致问题的那个,然后查看它的代码中有没有针对wp_get_object_terms的过滤逻辑,必要时修改或移除相关代码。
3. 检查自定义分类法的注册代码
确认你的mh_menu分类法注册是否正确,特别是有没有遗漏关键参数或设置错误:
- 确保注册是在
init钩子上执行的,示例代码如下:
add_action('init', function() { register_taxonomy( 'mh_menu', array('post'), // 替换成你的自定义文章类型或默认post array( 'label' => 'MH Menu', 'hierarchical' => true, 'public' => true, 'show_in_rest' => true, // 可选,但某些场景下需要开启 // 其他必要参数 ) ); });
如果注册时设置了特殊的权限或过滤参数,也可能间接影响tt_ids的返回。
临时修复方案
如果暂时找不到问题根源,可以用自定义过滤器手动获取tt_ids:
add_filter('wp_get_object_terms', function($terms, $object_ids, $taxonomies, $args) { // 只针对mh_menu分类法和tt_ids字段的请求生效 if ($args['fields'] === 'tt_ids' && in_array('mh_menu', $taxonomies)) { global $wpdb; // 兼容单个/多个对象ID的情况 $placeholders = implode(',', array_fill(0, count($object_ids), '%d')); $tt_ids = $wpdb->get_col($wpdb->prepare( "SELECT tr.term_taxonomy_id FROM {$wpdb->term_relationships} tr JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN ($placeholders) AND tt.taxonomy = %s", array_merge($object_ids, array('mh_menu')) )); return $tt_ids; } return $terms; }, 10, 4);
内容的提问来源于stack exchange,提问作者Meruzhan Hovhannisyan
相关产品推荐
相关产品推荐

