如何让WooCommerce根据WPML当前语言全站同步结算国家?
解决WooCommerce结算国家、税费与货币随语言自动同步的问题
原代码仅在购物车/结账页生效的核心问题在于:使用init钩子时WooCommerce客户对象可能未完全初始化,且缺少税费刷新、货币同步及重复操作规避的逻辑。以下是优化后的完整实现方案:
add_action('wp_loaded', function() { // 依赖检查:确保WooCommerce和WPML已加载 if (!class_exists('WooCommerce') || !function_exists('wpml_current_language')) { return; } // 自定义语言-国家映射(根据你的网站语言配置调整,国家代码为ISO 3166-1 alpha-2格式) $lang_to_country = [ 'en' => 'US', 'fr' => 'FR', 'de' => 'DE', 'es' => 'ES' // 可添加更多语言与对应国家的映射 ]; // 自定义语言-货币映射(货币代码为ISO 4217格式) $lang_to_currency = [ 'en' => 'USD', 'fr' => 'EUR', 'de' => 'EUR', 'es' => 'EUR' // 可添加更多语言与对应货币的映射 ]; $current_lang = apply_filters('wpml_current_language', null); // 跳过无效语言或未配置映射的情况 if (!$current_lang || !isset($lang_to_country[$current_lang]) || !isset($lang_to_currency[$current_lang])) { return; } $target_country = $lang_to_country[$current_lang]; $target_currency = $lang_to_currency[$current_lang]; $customer = WC()->customer; // 仅当客户当前国家与目标国家不一致时更新,避免重复操作 if ($customer->get_country() !== $target_country) { $customer->set_country($target_country); // 若需要同步州/省信息,可添加:$customer->set_state('XX');(需对应添加语言-州的映射) $customer->save(); // 若购物车有商品,立即重新计算税费 if (WC()->cart->get_cart_contents_count() > 0) { WC()->cart->calculate_totals(); } } // 同步货币设置 if (get_woocommerce_currency() !== $target_currency) { update_option('woocommerce_currency', $target_currency); wc_clear_cache(); // 清除WooCommerce缓存确保货币即时生效 } }); // 处理语言切换动作:用户切换语言时立即同步设置 add_action('wpml_language_switch', function() { do_action('wp_loaded'); });
关键逻辑说明
- 钩子选择:使用
wp_loaded钩子替代init,确保WordPress及所有插件完全加载后执行,保证WC客户对象已初始化,可在任意页面生效。 - 映射配置:放弃直接将语言代码转大写的逻辑,改为自定义语言与国家/货币的映射,适配不同语言对应的实际区域(比如
en对应US而非EN)。 - 性能优化:仅当当前设置与目标设置不一致时才执行更新操作,避免不必要的资源消耗。
- 即时同步:通过
wpml_language_switch钩子监听语言切换动作,确保用户切换语言时立即同步国家、税费与货币。
内容的提问来源于stack exchange,提问作者Nathan Otten
相关产品推荐
相关产品推荐

