如何基于用户角色调整WooCommerce不含税运费规则?
WooCommerce 按用户角色调整运费(基于不含税小计)
问题根源
你遇到的异常是因为之前的代码错误使用了订单总金额(包含税费、运费等额外费用)作为判断依据,而非要求的不含税订单小计,导致批发用户不含税小计未达70欧元,但加上税费后总金额超70时错误触发免运费。
修正后的代码
以下代码严格基于不含税购物车小计判断,同时区分批发/普通用户角色:
add_filter('woocommerce_package_rates', 'custom_shipping_rates_based_on_user_role', 10, 2); function custom_shipping_rates_based_on_user_role($rates, $package) { // 排除后台订单编辑场景,避免干扰 if (is_admin() && !defined('DOING_AJAX')) { return $rates; } // 获取当前用户角色 $current_user = wp_get_current_user(); $is_wholesale_user = in_array('wholesale_customer', $current_user->roles); // 获取不含税购物车小计(核心:仅计算商品不含税总价) $subtotal_ex_tax = WC()->cart->get_subtotal_ex_tax(); // 定义运费规则参数 $wholesale_free_min = 70; $wholesale_shipping_fee = 10; $regular_free_min = 30; $regular_shipping_fee = 5; // 遍历调整所有包裹类运费费率 foreach ($rates as $rate_id => $rate) { // 仅针对Flat Rate(包裹费率),可根据实际启用的运费方式调整 if ($rate->method_id === 'flat_rate') { if ($is_wholesale_user) { // 批发用户规则 if ($subtotal_ex_tax >= $wholesale_free_min) { $rates[$rate_id]->cost = 0; $rates[$rate_id]->taxes = array(); // 清除运费税费 } else { $rates[$rate_id]->cost = $wholesale_shipping_fee; } } else { // 普通用户规则 if ($subtotal_ex_tax >= $regular_free_min) { $rates[$rate_id]->cost = 0; $rates[$rate_id]->taxes = array(); } else { $rates[$rate_id]->cost = $regular_shipping_fee; } } } } return $rates; }
关键修正说明
- 判断依据精准:使用
WC()->cart->get_subtotal_ex_tax()获取的是购物车中所有商品的不含税总价,完全不受税费、运费等其他金额影响,严格符合需求。 - 角色判断准确:通过
wp_get_current_user()获取当前用户角色,精准识别批发用户。 - 运费费率处理:仅针对包裹费率(Flat Rate)调整,同时清除运费税费,确保免运费逻辑彻底生效。
- 后台兼容:排除后台订单编辑页面的计算,避免后台操作时出现错误运费。
使用方法
- 将代码添加到当前WordPress主题的
functions.php文件末尾,或使用自定义代码插件(如Code Snippets)导入执行。 - 确保WooCommerce后台已启用「Flat Rate(包裹费率)」运费方式。
内容的提问来源于stack exchange,提问作者gemita
相关产品推荐
相关产品推荐

