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
相关产品推荐
相关产品推荐

