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

