如何解决WordPress中Custom Post Type名称翻译不随语言切换问题?
问题排查与修复方案
核心问题分析
你的代码无法实现Custom Post Type名称随语言切换的原因主要有两点:
- 钩子时机错误:
init钩子的执行优先级如果低于自定义文章类型(CPT)的注册优先级,标签修改会被CPT注册代码覆盖。 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国际化标准流程:
- 注册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');
- 为主题/插件创建对应语言的翻译文件(如
your-textdomain-uk_UA.po),用Poedit等工具添加乌克兰语翻译,无需手动修改标签。
关键细节修正
原代码中$labels->all_items = 'All Chip';存在复数语法错误,已在修复代码中修正为All Chips。
内容的提问来源于stack exchange,提问作者user18046244
相关产品推荐
相关产品推荐

