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

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();
    }
}

关键说明

  1. 直接解析POST数据:用parse_str()把钩子传入的$posted_data(也就是表单提交的所有数据)解析成数组,这样就能拿到用户刚选的最新国家值。
  2. 修正钩子参数:原代码里钩子的参数个数写错了,woocommerce_checkout_update_order_review只接受1个参数(就是提交的表单数据),不需要写51个参数。
  3. 语法修正:原代码里的if(in_array(...))少了个右括号,我已经帮你补上了。

这样修改后,用户每次修改国家,你都能立刻拿到最新的选择值,不用等页面刷新啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:22:46