如何使用Ajax请求返回的变量切换WordPress后台WPML界面语言
问题原因
- 你通过AJAX调用WPML语言切换方法,仅对当前AJAX请求的生命周期有效,没有持久化存储用户的语言选择,页面重载后WPML会读取默认的会话/存储中的语言配置,因此切换不生效
- 你原有逻辑中
window.location = window.location.href是在触发AJAX后立即执行,很可能AJAX请求还未处理完成就已经重载页面,就算你加了持久化逻辑也可能不生效 - 缺少输入合法性校验,传入的语言参数未做白名单过滤,也可能导致WPML切换失败
修复方案
方案1:省略AJAX,直接通过URL参数传递语言(更简单稳定)
直接修改下拉框onchange的JS逻辑,不需要发AJAX,直接把选中的语言拼到当前URL后重载页面:
// 替换你原有onchange的JS逻辑 const langSelect = document.getElementById('你的下拉框ID'); langSelect.addEventListener('change', function() { const selectedLang = this.value; const url = new URL(window.location.href); url.searchParams.set('lang', selectedLang); window.location.href = url.toString(); })
然后在后台初始化钩子中读取URL参数执行语言切换,添加到你的主题functions.php或者自定义插件中:
add_action('admin_init', 'custom_switch_admin_wpml_lang'); function custom_switch_admin_wpml_lang() { // 仅在后台订单页面生效,可根据你的需求调整判断条件 $screen = get_current_screen(); if ($screen->id !== 'edit-shop_order' || !isset($_GET['lang'])) { return; } $allowed_lang = ['en', 'nl', 'de']; $current_lang = sanitize_text_field($_GET['lang']); if (in_array($current_lang, $allowed_lang)) { global $sitepress; $sitepress->switch_lang($current_lang); do_action('wpml_switch_language', $current_lang); } }
方案2:保留AJAX逻辑,新增语言持久化
如果你一定要用AJAX实现,需要调整两个部分的代码:
1. 修改JS逻辑,等待AJAX请求成功后再重载页面
const langSelect = document.getElementById('你的下拉框ID'); langSelect.addEventListener('change', function() { const selectedLang = this.value; // 发送AJAX请求 fetch(ajaxurl, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ action: 'my_action', dropdown_shop_order_language: selectedLang }) }) .then(res => res.json()) .then(() => { // 请求成功后再重载页面 window.location.reload(); }) })
2. 修改PHP的AJAX处理函数,添加WPML语言cookie设置
function my_action( ) { // 输入校验 $allowed_lang = ['en', 'nl', 'de']; $selected_lang = sanitize_text_field($_POST['dropdown_shop_order_language']); if (!in_array($selected_lang, $allowed_lang)) { wp_send_json_error('非法语言参数'); } // 执行语言切换 global $sitepress; $sitepress->switch_lang($selected_lang); do_action('wpml_switch_language', $selected_lang); // 关键:设置WPML用户语言cookie,持久化存储选择,有效期30天 setcookie('wpml_user_language', $selected_lang, time() + 86400 * 30, COOKIEPATH, COOKIE_DOMAIN, is_ssl()); wp_send_json_success($selected_lang); } add_action('wp_ajax_my_action', 'my_action'); // 后台仅登录用户可访问,可移除nopriv的钩子 // add_action('wp_ajax_nopriv_my_action', 'my_action');
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

