You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决WordPress中Custom Post Type名称翻译不随语言切换问题?

问题排查与修复方案

核心问题分析

你的代码无法实现Custom Post Type名称随语言切换的原因主要有两点:

  1. 钩子时机错误:init钩子的执行优先级如果低于自定义文章类型(CPT)的注册优先级,标签修改会被CPT注册代码覆盖。
  2. get_locale()的局限性:若使用WPML/Polylang这类多语言插件,get_locale()无法准确获取当前页面的活跃语言,仅能返回站点默认语言。

修复步骤

1. 调整钩子执行时机

将修改标签的动作改为wp_loaded钩子(确保CPT已完全注册),或提高init钩子的优先级(保证在CPT注册后执行):

function dev_change_post_object() {
    global $wp_post_types;

    if (!isset($wp_post_types['chip'])) return; // 避免CPT未注册时报错

    $labels = &$wp_post_types['chip']->labels;
    
    // 若使用多语言插件,替换为对应检测函数:
    // WPML: $current_lang = icl_get_current_language();
    // Polylang: $current_lang = pll_current_language();
    $locale = get_locale();
    
    if ( $locale == 'en_US' ) {
        $labels->name = 'Chips';
        $labels->singular_name = 'Chip';
        $labels->add_new = 'Add Chip';
        $labels->add_new_item = 'Add Chip';
        $labels->edit_item = 'Edit Chip';
        $labels->new_item = 'Chip';
        $labels->view_item = 'View Chip';
        $labels->search_items = 'Search Chip';
        $labels->not_found = 'No Chip found';
        $labels->not_found_in_trash = 'No Chip found in Trash';
        $labels->all_items = 'All Chips'; // 修正原代码的复数语法错误
        $labels->menu_name = 'Chips';
        $labels->name_admin_bar = 'Chip';
    } else {
        $labels->name = 'Чіпи';
        $labels->singular_name = 'Чіп';
        $labels->add_new = 'Додати чіп';
        $labels->add_new_item = 'Додати новий чіп';
        $labels->edit_item = 'Редагувати чіп';
        $labels->new_item = 'Чіп';
        $labels->view_item = 'Переглянути чіп';
        $labels->search_items = 'Пошук чіпа';
        $labels->not_found = 'Чіп не знайдено';
        $labels->not_found_in_trash = 'Не знайдено в кошику чіпу';
        $labels->all_items = 'Всі чіпи';
        $labels->menu_name = 'Чіпи';
        $labels->name_admin_bar = 'Чіп';
    }
}

// 方法1:用wp_loaded确保CPT已完成注册
add_action( 'wp_loaded', 'dev_change_post_object' );

// 方法2:若坚持用init,提高优先级(假设CPT注册用默认优先级10)
// add_action( 'init', 'dev_change_post_object', 11 );

2. 适配多语言插件(若使用)

如果站点依赖WPML或Polylang,替换get_locale()为插件专属的语言检测函数:

  • WPML:$current_lang = icl_get_current_language();(判断值为en/uk这类短语言代码)
  • Polylang:$current_lang = pll_current_language();

3. 长期优化:使用WordPress原生翻译机制(推荐)

硬编码语言判断并非可持续方案,建议改用WordPress国际化标准流程:

  1. 注册CPT时用__()函数定义标签并指定文本域:
function register_chip_cpt() {
    $args = array(
        'labels' => array(
            'name' => __('Chips', 'your-textdomain'),
            'singular_name' => __('Chip', 'your-textdomain'),
            // 其余标签同理
        ),
        // 其他CPT配置参数
    );
    register_post_type('chip', $args);
}
add_action('init', 'register_chip_cpt');
  1. 为主题/插件创建对应语言的翻译文件(如your-textdomain-uk_UA.po),用Poedit等工具添加乌克兰语翻译,无需手动修改标签。

关键细节修正

原代码中$labels->all_items = 'All Chip';存在复数语法错误,已在修复代码中修正为All Chips。

内容的提问来源于stack exchange,提问作者user18046244

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:05:22