偶然,我们会遇到WordPress多站点get_taxonomies() 获取不到自定义分类法的问题,也可能是单站点也会遇到这个问题。以下是针对该问题的有效解决方法。
本文方法已验证!
问题分析
在多站点环境中,get_taxonomies() 获取不到自定义分类法的主要原因是:
- 执行时机过早 – 插件加载时自定义分类法尚未注册
- 多站点上下文问题 – 网络管理界面可能需要切换站点上下文
解决方案
// 1、定义挂钩函数
function zzw_paixu_term_show_index() {
// 只在后台执行
if (!is_admin()) {
return;
}
// 如果是多站点网络管理,切换到主站点获取分类法
if (is_multisite() && is_network_admin()) {
$zzw_original_blog_id = get_current_blog_id();
switch_to_blog(1); // 切换到主站点
}
$zzw_args = array(
'public' => true,
'_builtin' => false
);
$zzw_output = 'names';
$zzw_operator = 'and';
$zzw_taxs = get_taxonomies($zzw_args, $zzw_output, $zzw_operator);
// 恢复站点上下文(如果在多站点中切换过)
if (is_multisite() && is_network_admin()) {
restore_current_blog();
}
// 添加内置分类法
$zzw_taxs[] = 'category';
$zzw_taxs[] = 'post_tag';
// 为每个分类法添加过滤器
foreach ($zzw_taxs as $zzw_key => $zzw_value) {
add_filter('manage_edit-'.$zzw_value.'_columns', 'zzw_add_custom_taxonomy_columns');
add_action('manage_'.$zzw_value.'_custom_column', 'zzw_fill_custom_taxonomy_columns', 10, 3);
add_filter('manage_edit-'.$zzw_value.'_sortable_columns', 'zzw_make_custom_taxonomy_columns_sortable');
}
}
// 2、在合适的时机执行
add_action('init', 'zzw_paixu_term_show_index', 20);
// 3、相关功能函数(需要你根据实际功能实现)
function zzw_add_custom_taxonomy_columns($zzw_columns) {
// 你的列添加逻辑
return $zzw_columns;
}
function zzw_fill_custom_taxonomy_columns($zzw_content, $zzw_column_name, $zzw_term_id) {
// 你的列内容填充逻辑
return $zzw_content;
}
function zzw_make_custom_taxonomy_columns_sortable($zzw_columns) {
// 你的可排序列逻辑
return $zzw_columns;
}替代方案(更精确的时机控制)
如果上述方案仍有问题,可以尝试在管理页面加载时执行:
function zzw_admin_init_taxonomy_columns() {
$zzw_args = array(
'public' => true,
'_builtin' => false
);
$zzw_taxs = get_taxonomies($zzw_args, 'names', 'and');
$zzw_taxs[] = 'category';
$zzw_taxs[] = 'post_tag';
foreach ($zzw_taxs as $zzw_tax) {
add_filter('manage_edit-'.$zzw_tax.'_columns', 'zzw_add_custom_taxonomy_columns');
add_action('manage_'.$zzw_tax.'_custom_column', 'zzw_fill_custom_taxonomy_columns', 10, 3);
add_filter('manage_edit-'.$zzw_tax.'_sortable_columns', 'zzw_make_custom_taxonomy_columns_sortable');
}
}
add_action('admin_init', 'zzw_admin_init_taxonomy_columns');调试建议
如果问题仍然存在,可以添加调试代码:
function zzw_debug_taxonomies() {
$zzw_debug_args = array(
'public' => true,
'_builtin' => false
);
$zzw_debug_taxs = get_taxonomies($zzw_debug_args, 'objects', 'and');
error_log('Debug Custom Taxonomies: ' . print_r($zzw_debug_taxs, true));
// 或者在管理界面显示
if (is_admin() && current_user_can('manage_options')) {
echo '<div class="notice notice-info"><pre>';
print_r($zzw_debug_taxs);
echo '</pre></div>';
}
}
add_action('init', 'zzw_debug_taxonomies', 999);主要改动:
- 使用
init钩子延迟执行 - 处理多站点上下文切换
- 添加适当的优先级
这样应该能解决多站点环境中自定义分类法获取不到的问题。

