如何为WooCommerce批发商角色设置分类专属最小订购量规则?
改进WooCommerce批发商购物车最小订购量规则
功能需求
- 仅对批发商角色用户生效
- 需满足以下任一条件才能下单:
- 购物车中袜子类商品数量≥3
- 购物车中帽子类商品数量≥3
- 购物车中衬衫类商品数量≥2
- 满足上述任一条件后,可添加任意商品,不受最小订购量限制
- 示例场景:
- 若添加至少3件帽子,可忽略袜子、衬衫的最小订购规则
- 若添加1件袜子+2件帽子,需补购2件袜子或1件帽子才能完成下单
现有代码存在的问题
- 未实现批发商角色检查,规则会对所有用户生效
- 缺失衬衫分类的数量统计与规则判断逻辑
- 条件判断逻辑错误,当前仅当袜子和帽子数量都低于最小值时才提示,不符合需求
改进后的代码
function action_woocommerce_check_cart_items() { // 仅在购物车或结算页运行 if ( !is_cart() && !is_checkout() ) return; // 获取当前用户 $current_user = wp_get_current_user(); // 检查用户是否为批发商角色,不是则直接退出 if ( empty( $current_user ) || !in_array( 'wholesaler', $current_user->roles ) ) return; // 定义各分类的最小订购量(分类slug => 最小数量) $category_minimums = array( 'socks' => 3, 'hats' => 3, 'shirts' => 2 ); // 初始化各分类数量统计 $category_totals = array_fill_keys( array_keys( $category_minimums ), 0 ); // 遍历购物车商品统计各分类数量 foreach ( WC()->cart->get_cart() as $cart_item ) { $product_id = $cart_item['product_id']; foreach ( $category_minimums as $category_slug => $min_qty ) { if ( has_term( $category_slug, 'product_cat', $product_id ) ) { $category_totals[$category_slug] += $cart_item['quantity']; break; // 一个商品可能属于多个分类,这里统计一次即可 } } } // 检查是否满足任一分类的最小订购量 $meets_requirement = false; foreach ( $category_minimums as $category_slug => $min_qty ) { if ( $category_totals[$category_slug] >= $min_qty ) { $meets_requirement = true; break; } } // 若未满足任一条件,且购物车中有商品,提示错误 if ( !$meets_requirement && WC()->cart->get_cart_contents_count() > 0 ) { // 构建提示文本,列出各分类的最小要求 $notice_text = '<strong>批发商订购规则:</strong>需满足以下任一条件才能下单:<ul>'; foreach ( $category_minimums as $category_slug => $min_qty ) { $category_name = get_term_by( 'slug', $category_slug, 'product_cat' )->name; $notice_text .= '<li>至少购买 ' . $min_qty . ' 件 ' . $category_name . '</li>'; } $notice_text .= '</ul>'; wc_add_notice( $notice_text, 'error' ); // 移除结算按钮 remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 ); } } add_action( 'woocommerce_check_cart_items', 'action_woocommerce_check_cart_items', 10, 0 );
代码改进说明
- 用户角色检查:通过
wp_get_current_user()获取当前用户,判断是否属于wholesaler角色,非批发商直接跳过规则 - 分类规则配置化:用数组统一管理各分类的最小订购量,便于后续扩展修改
- 完整分类统计:添加衬衫分类的数量统计逻辑,遍历所有配置的分类进行统计
- 正确的规则判断:只要满足任一分类的最小订购量,就允许下单;否则提示所有分类的要求
- 友好提示文本:动态获取分类名称,列出所有需要满足的条件,让用户更清晰了解规则
内容的提问来源于stack exchange,提问作者Augusto Gentile
相关产品推荐
相关产品推荐

