Skip to content

WordPress 6.7翻译加载过早警告解决指南

问题描述

升级至WordPress 6.7后,许多用户会遇到类似以下警告:

php
Notice: Function _load_textdomain_just_in_time was called incorrectly. 
Translation loading for [textdomain] was triggered too early. 
This is usually an indicator for some code in the plugin or theme running too early. 
Translations should be loaded at the init action or later.

该警告表明翻译函数(如__()_e())在init钩子前被调用。WordPress 6.7新增此检查,旨在优化翻译加载机制。若不修复,可能导致翻译失效或影响网站性能。

解决方案

普通用户修复步骤

  1. 更新主题和插件:访问插件/主题配置页面检查更新,大部分开发者已修复此问题
  2. 识别问题组件:从错误信息中提取文本域名(如blahblah),确定其所属插件或主题
  3. 联系开发者:若更新无效,向对应开发者报告错误
  4. 临时停用:在开发环境按顺序停用插件定位问题组件

开发者修复方案

正确加载翻译

确保翻译在initafter_setup_theme钩子后加载:

php
// ✅ 正确方法
add_action('init', function() {
    load_plugin_textdomain('your-textdomain', false, plugin_dir_path(__FILE__).'languages/');
});

// ✅ 主题翻译示例
add_action('after_setup_theme', function() {
    load_theme_textdomain('your-textdomain', get_template_directory().'/languages');
});

避免get_plugin_data陷阱

早期调用get_plugin_data会触发此警告:

php
// ⚠️ 错误用法(在init前调用)
$plugin_data = get_plugin_data(__FILE__);

// ✅ 正确解决方案
$plugin_data = get_file_data(
    __FILE__, 
    array('Version' => 'Version'), 
    false // 第三个参数设为false避免加载翻译
);

调试指南

通过堆栈跟踪定位问题代码(仅限开发环境使用):

WARNING

此操作需修改WordPress核心文件,调试完成后务必恢复原文件!

  1. 打开wp-includes/l10n.php
  2. _load_textdomain_just_in_time函数开头插入:
php
function _load_textdomain_just_in_time($domain) {
    // 仅针对特定域名记录堆栈
    if ($domain == "your-textdomain") {
        ob_start();
        debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
        $trace = ob_get_clean();
        
        error_log(
            "EARLY TRANSLATION CALL FOR: $domain\n" .
            "STACK TRACE:\n$trace\n" .
            "------------------------------------\n"
        );
    }
    // ...原函数代码
}

刷新页面后检查服务器错误日志,追踪会显示触发问题的具体代码位置。

问题根源

WordPress 6.7对翻译加载机制进行了重要优化:

  • 将文本域加载推迟至init阶段提高性能
  • 废弃了load_textdomain$reloadable参数
  • 新增get_translations_for_domain()函数处理翻译对象

这些改动使早期调用的翻译函数暴露出兼容性问题。常见触发场景包括:

  • plugins_loaded钩子前调用翻译函数
  • 在主题文件中过早使用__(), _e()等函数
  • get_plugin_data在未设置$context参数时的错误用法

后续建议

遵循init后加载翻译的原则,可确保代码同时兼容旧版和新版WordPress架构。