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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:45:05