WordPress开发笔记

详解WordPress多站点get_taxonomies() 获取不到自定义分类法的问题

偶然,我们会遇到WordPress多站点get_taxonomies() 获取不到自定义分类法的问题,也可能是单站点也会遇到这个问题。以下是针对该问题的有效解决方法。

本文方法已验证!

问题分析

在多站点环境中,get_taxonomies() 获取不到自定义分类法的主要原因是:

  1. 执行时机过早 – 插件加载时自定义分类法尚未注册
  2. 多站点上下文问题 – 网络管理界面可能需要切换站点上下文

解决方案

// 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 钩子延迟执行
  • 处理多站点上下文切换
  • 添加适当的优先级

这样应该能解决多站点环境中自定义分类法获取不到的问题。