WooCommerce woocommerce_checkout_update_order_review钩子无法返回更新后的账单/配送国家值
解决WooCommerce结账时无法获取最新国家值的问题
嘿,这个问题我之前也踩过坑!你猜得没错——在woocommerce_checkout_update_order_review钩子触发的时机,WC()->customer对象里的国家信息还没同步用户刚提交的新值,所以你拿到的总是旧数据。得换个方式,直接从POST请求里提取最新的表单提交值才行。
问题根源
woocommerce_checkout_update_order_review钩子的作用是处理结账页面的订单预览更新,当用户修改国家后,表单数据会先通过POST提交到这个钩子处理,但WooCommerce要等这个钩子执行完,才会把新的国家值更新到WC_Customer对象里。所以你直接调用WC()->customer->get_shipping_country()拿到的还是缓存的旧值。
修复后的代码
add_action( 'woocommerce_checkout_update_order_review', 'remove_eu_cart_tax', 51 ); function remove_eu_cart_tax( $posted_data ) { // 解析POST过来的表单数据 parse_str( $posted_data, $post_data ); $country_list = array('AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 'EL', 'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK'); // 优先取配送国家,为空则取账单国家 $shipping_country = !empty( $post_data['shipping_country'] ) ? $post_data['shipping_country'] : $post_data['billing_country']; // 检查是否在欧盟国家列表里 if( in_array( $shipping_country, $country_list ) ) { // 这里放你的自定义逻辑,比如移除税费 // WC()->cart->remove_taxes(); } }
关键说明
- 直接解析POST数据:用
parse_str()把钩子传入的$posted_data(也就是表单提交的所有数据)解析成数组,这样就能拿到用户刚选的最新国家值。 - 修正钩子参数:原代码里钩子的参数个数写错了,
woocommerce_checkout_update_order_review只接受1个参数(就是提交的表单数据),不需要写51个参数。 - 语法修正:原代码里的
if(in_array(...))少了个右括号,我已经帮你补上了。
这样修改后,用户每次修改国家,你都能立刻拿到最新的选择值,不用等页面刷新啦。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

