WooCommerce境外企业客户税率类设置失效问题求助
解决WooCommerce境外企业用户税率类全程生效问题
原代码的核心问题
- 未正确遍历购物车项:直接调用
$cart_item['data']但未从钩子参数$cart中获取并循环处理购物车项,实际无法对所有商品生效。 - 依赖POST数据不可靠:仅通过
$_POST获取billing_company,只有结账提交瞬间有效,后续订单流程无法获取该值。 - 未保存税率类到订单项:仅在购物车阶段临时修改税率类,订单创建时未同步保存该设置,导致订单完成后恢复默认税率。
修正后的完整代码
// 1. 在购物车计算阶段正确应用税率类 function apply_conditionally_taxes( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( empty( $cart->get_cart() ) ) return; // 获取当前客户的账单信息 $customer = WC()->customer; $billing_country = $customer->get_billing_country(); $billing_company = $customer->get_billing_company(); // 判断条件:有企业名称且账单国家非德国 $apply_zero_tax = ! empty( $billing_company ) && $billing_country !== 'DE'; // 遍历所有购物车项设置税率类 foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) { $product = $cart_item['data']; if ( $apply_zero_tax ) { $product->set_tax_class( 'Online World' ); } else { // 恢复默认税率类(空值对应后台设置的默认税率) $product->set_tax_class( '' ); } } } add_action( 'woocommerce_before_calculate_totals', 'apply_conditionally_taxes', 99, 1 ); // 2. 订单创建时将税率类永久保存到订单项 function save_tax_class_to_order_items( $order ) { if ( ! $order ) return; $billing_country = $order->get_billing_country(); $billing_company = $order->get_billing_company(); $apply_zero_tax = ! empty( $billing_company ) && $billing_country !== 'DE'; // 遍历所有订单项同步税率类 foreach ( $order->get_items() as $item ) { if ( $apply_zero_tax ) { $item->set_tax_class( 'Online World' ); } else { $item->set_tax_class( '' ); } $item->save(); } } add_action( 'woocommerce_checkout_create_order', 'save_tax_class_to_order_items', 10, 1 );
关键说明
- 购物车阶段:通过
WC()->customer获取已保存的账单信息,确保地址变更、购物车更新等场景都能实时调整税率类。 - 订单保存阶段:在订单创建钩子中直接将税率类写入订单项,确保订单生成后,感谢页、发票、订单详情页均使用保存的税率类显示。
- 请确认后台已创建
Online World税率类,并为其设置0%的税率规则。
内容的提问来源于stack exchange,提问作者Janith Chinthana
相关产品推荐
相关产品推荐

