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

WordPress后端AJAX回调中PHP __()翻译函数失效问题排查

问题核心原因
  • WordPress AJAX 请求默认走wp-admin/admin-ajax.php入口,该上下文不会自动触发主题侧的翻译文件加载逻辑,直接在回调里调用翻译函数时,站点语言环境、主题语言包都未完成初始化,因此始终返回英文原文。
  • 代码中混用原生gettext()、_()函数与WordPress封装的翻译函数,原生gettext不会读取WordPress后台配置的站点语言设置,本身就无法正常输出WP体系下的翻译内容。
  • 当前回调没有按WordPress规范挂载到AJAX动作钩子上,也未做参数校验、请求终止处理,逻辑本身存在运行异常风险。
修复方案

1. 修正后端AJAX回调逻辑

在回调最开头手动加载主题翻译文本域,使用WP自带的翻译函数处理内容,按规范返回结果:

// 按WP规范挂载AJAX动作,同时支持登录、未登录用户访问
add_action('wp_ajax_get_translations', 'get_translations');
add_action('wp_ajax_nopriv_get_translations', 'get_translations');
function get_translations(){
    // 替换为你自己主题的文本域,可在主题根目录style.css头部的Text Domain字段查到
    $theme_textdomain = 'your-theme-textdomain';
    // 手动加载主题语言包,解决admin-ajax上下文不自动加载翻译的问题
    load_theme_textdomain($theme_textdomain, get_template_directory() . '/languages');

    // 参数校验
    if (!isset($_REQUEST['text']) || empty($_REQUEST['text'])) {
        wp_send_json_error('缺少待翻译文本参数');
    }
    $raw_text = sanitize_text_field($_REQUEST['text']);
    // 调用WP官方翻译函数,传入对应文本域,不要使用原生gettext
    $translated_text = __($raw_text, $theme_textdomain);

    error_log("原文:" . $raw_text . ";翻译结果:" . $translated_text);
    // 用WP内置方法返回JSON,会自动终止程序执行,无需手动exit
    wp_send_json_success($translated_text);
}

2. 修正前端请求逻辑

同步AJAX已被现代浏览器废弃,改为异步写法获取结果,同时做好兜底处理:

function translation(text){
    console.log("待翻译文本=", text);
    return $.ajax({
        url: ajaxurl,
        type: 'GET',
        data: {
            action: "get_translations",
            text: text
        },
        dataType: 'json'
    }).then(function(res) {
        if (res.success) {
            console.log("翻译结果=", res.data);
            return res.data;
        }
        // 翻译失败时返回原文兜底
        return text;
    });
}

// 调用示例
translation("ABC is easy as 123!").then(function(translatedText){
    // 此处拿到翻译后的内容做后续业务处理
    console.log('最终使用内容:', translatedText);
});

3. 数据库动态内容翻译注意事项

  • 从数据库查询出的产品标题如果是代码中写死、提前录入主题语言包的固定字符串,上述逻辑可以正常翻译。

如果产品标题是后台可编辑、用户自定义的动态内容,不要使用gettext系列函数翻译。gettext仅适用于代码层面写死的固定字符串,动态内容需要单独做多语言字段存储,否则翻译函数找不到语言包匹配条目会始终返回原文。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.20 16:15:50