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

如何在WooCommerce结账时根据配送国家切换WPML语言(含en-US编程切换)

解决方案

一、结账环节强制切换语言并保留会话

核心逻辑

通过监听结账页面的配送国家变更事件,在后端触发语言切换操作,同时将用户已填写的结账数据暂存到会话中,切换后自动恢复,避免表单内容丢失。

代码实现

1. 后端钩子处理(PHP)

利用WooCommerce的woocommerce_checkout_update_order_review钩子,在用户更新配送国家时执行检查与切换:

add_action('woocommerce_checkout_update_order_review', 'force_switch_lang_on_non_eu_country');
function force_switch_lang_on_non_eu_country($posted_data) {
    parse_str($posted_data, $post_data);
    
    // 欧盟国家代码列表(可根据实际政策调整)
    $eu_countries = array('AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK');
    
    $shipping_country = isset($post_data['shipping_country']) ? $post_data['shipping_country'] : '';
    
    // 非欧盟国家且当前语言不是en-US时触发切换
    if (!in_array($shipping_country, $eu_countries) && ICL_LANGUAGE_CODE !== 'en') {
        // 暂存结账表单数据到会话
        $_SESSION['checkout_form_data'] = $post_data;
        
        // WPML切换语言('en'对应en-US,需匹配你的WPML语言配置)
        icl_switch_language('en');
        
        // 重定向到切换语言后的结账页面
        wp_redirect(WC()->cart->get_checkout_url());
        exit;
    }
}

2. 恢复会话中的结账数据(PHP)

切换语言后,自动填充之前保存的表单内容:

add_action('woocommerce_checkout_init', 'restore_checkout_form_data_from_session');
function restore_checkout_form_data_from_session() {
    if (isset($_SESSION['checkout_form_data']) && ICL_LANGUAGE_CODE === 'en') {
        $saved_data = $_SESSION['checkout_form_data'];
        
        // 将暂存数据填充到结账字段
        foreach ($saved_data as $key => $value) {
            if (!isset($_POST[$key])) {
                $_POST[$key] = $value;
            }
        }
        
        // 清除会话数据,避免重复填充
        unset($_SESSION['checkout_form_data']);
    }
}

3. 前端用户提示(可选,JS)

给用户明确的操作提示,避免突兀跳转:

jQuery(document).ready(function($) {
    $('#shipping_country').on('change', function() {
        var selectedCountry = $(this).val();
        var euCountries = ['AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK'];
        
        if (!euCountries.includes(selectedCountry) && $('html').attr('lang') !== 'en-US') {
            if (confirm('您选择的是非欧盟国家,将自动切换到英文版本结账,是否继续?')) {
                $('body').trigger('update_checkout');
            } else {
                // 恢复之前的国家选择
                $(this).val($(this).data('previous-value'));
            }
        }
        $(this).data('previous-value', selectedCountry);
    });
});

二、WPML编程实现按配送国家切换至en-US

核心WPML函数说明

  • icl_switch_language($lang_code):WPML核心语言切换函数,参数为你在WPML中配置的语言代码(如'en'对应en-US)
  • ICL_LANGUAGE_CODE:当前语言的代码常量,用于判断当前语言状态
  • icl_get_languages():获取网站已配置的所有语言,可用于验证目标语言是否存在

独立切换逻辑代码

如果需要在其他场景(如用户修改配送地址后)触发切换,可使用以下代码:

function switch_to_en_us_based_on_shipping_country($shipping_country) {
    // 定义需要切换语言的非欧盟国家列表
    $target_countries = array('US', 'CA', 'AU', 'JP');
    
    if (in_array($shipping_country, $target_countries) && ICL_LANGUAGE_CODE !== 'en') {
        icl_switch_language('en');
        
        // 保存WooCommerce会话数据,避免购物车丢失
        if (isset(WC()->session)) {
            WC()->session->save_data();
        }
    }
}

// 绑定到用户保存配送地址的钩子
add_action('woocommerce_customer_save_address', 'trigger_lang_switch_on_address_update', 10, 2);
function trigger_lang_switch_on_address_update($user_id, $load_address) {
    if ($load_address === 'shipping') {
        $shipping_country = get_user_meta($user_id, 'shipping_country', true);
        switch_to_en_us_based_on_shipping_country($shipping_country);
    }
}

注意事项

  • 确认WPML中en-US对应的语言代码(通常为'en'),避免代码不匹配
  • 确保PHP会话和WooCommerce会话功能正常,否则可能丢失用户数据
  • 欧盟国家列表需根据最新政策调整,避免判断错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:53:15