如何在WooCommerce中排除特定角色卖家享受运费折扣
如何在WooCommerce运费折扣代码中排除特定角色
要排除seller_2角色的卖家享受运费折扣,我们需要调整原代码的角色判断逻辑,同时修复原代码中提前返回导致的潜在问题。以下是两种常见场景的解决方案:
场景1:仅对「是seller角色且不是seller_2角色」的卖家应用折扣
这种场景下,只要购物车里存在符合条件的卖家(非seller_2的seller),就会给所有运费方式(除了免运费)打折扣,即使购物车里还有其他角色的卖家商品。
修改后的代码:
add_filter( 'woocommerce_package_rates', 'custom_shipping_methods', 10, 2 ); function custom_shipping_methods( $rates, $package ) { $reduction_cost_percentage = 30; // 折扣百分比 $should_apply_discount = false; // 遍历购物车商品,确认是否有符合条件的卖家 foreach( WC()->cart->get_cart() as $cart_item ){ $in_cart_product_id = $cart_item['product_id']; $cart_seller_id = get_post_field('post_author', $in_cart_product_id); $cart_seller_meta = get_userdata($cart_seller_id); $cart_seller_roles = $cart_seller_meta->roles; // 跳过seller_2角色的卖家 if (in_array('seller_2', $cart_seller_roles)) { continue; } // 找到seller角色的卖家,标记需要应用折扣 if (in_array('seller', $cart_seller_roles)) { $should_apply_discount = true; break; // 找到一个符合条件的即可停止检查 } } // 如果需要应用折扣,批量处理所有运费方式 if ($should_apply_discount) { foreach( $rates as $rate_key => $rate ){ if( $rate->method_id != 'free_shipping'){ $rates[$rate_key]->cost = $rates[$rate_key]->cost * ((100-$reduction_cost_percentage) / 100); } } } return $rates; }
场景2:只要购物车里有seller_2角色的卖家,就完全不应用折扣
如果你的需求是只要存在seller_2卖家的商品,整个订单都不享受运费折扣,可以用下面的代码:
add_filter( 'woocommerce_package_rates', 'custom_shipping_methods', 10, 2 ); function custom_shipping_methods( $rates, $package ) { $reduction_cost_percentage = 30; // 折扣百分比 // 先检查是否有seller_2角色的卖家,有则直接返回原运费 foreach( WC()->cart->get_cart() as $cart_item ){ $in_cart_product_id = $cart_item['product_id']; $cart_seller_id = get_post_field('post_author', $in_cart_product_id); $cart_seller_meta = get_userdata($cart_seller_id); $cart_seller_roles = $cart_seller_meta->roles; if (in_array('seller_2', $cart_seller_roles)) { return $rates; } } // 确认没有seller_2卖家后,检查是否有seller卖家并应用折扣 foreach( WC()->cart->get_cart() as $cart_item ){ $in_cart_product_id = $cart_item['product_id']; $cart_seller_id = get_post_field('post_author', $in_cart_product_id); $cart_seller_meta = get_userdata($cart_seller_id); $cart_seller_roles = $cart_seller_meta->roles; if (in_array('seller', $cart_seller_roles)) { foreach( $rates as $rate_key => $rate ){ if( $rate->method_id != 'free_shipping'){ $rates[$rate_key]->cost = $rates[$rate_key]->cost * ((100-$reduction_cost_percentage) / 100); } } break; } } return $rates; }
重要提示
- 把代码添加到你的WordPress主题
functions.php文件,或者自定义插件中 - 修改代码后,记得清空WooCommerce的运费缓存:进入「WooCommerce > 设置 > 高级 > 系统状态 > 工具」,点击「清空缓存」按钮,否则新的运费规则可能不会立即生效
- 用
in_array检查角色比直接取$cart_seller_roles[0]更可靠,因为WordPress用户可以同时拥有多个角色
内容的提问来源于stack exchange,提问作者Web Design
相关产品推荐
相关产品推荐

