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

Woocommerce:仅为含特定属性的购物车商品设置购买倍数规则

WooCommerce:仅对特定属性商品设置购买数量倍数规则

需求说明

我正在搭建葡萄酒销售的WooCommerce站点,需实现以下规则:

  • 商品按瓶售卖,自定义属性pa_bottle包含三个术语:1liter(1升)、2liters(2升)、3liters(3升)
  • 仅购物车中所有属性为1liter的商品总数量必须是3的倍数,其他属性商品无此限制

示例有效购物车:

  • 1瓶普罗塞克(属性1liter)
  • 2瓶普罗塞克(属性3liters)
  • 2瓶香槟(属性1liter)→ 1+2=3,符合3的倍数要求

问题场景

我原本使用了一个针对商品分类生效的脚本,尝试修改为针对1liter属性生效,但修改后规则错误地应用到所有商品,无法实现需求。

原分类脚本:

add_action( 'woocommerce_check_cart_items', 'woocommerce_check_cart_quantities' );
function woocommerce_check_cart_quantities() {
$multiples = 3;
$total_products = 0;
$category_ids = array( 74 );
$found = false;

foreach ( WC()->cart->get_cart() as $cart_item ) {
    if ( has_product_category( $cart_item['product_id'], $category_ids ) ) {
        
        $total_products += $cart_item['quantity'];
        $found = true;
    }
}
if ( ( $total_products % $multiples ) > 0 && $found )
    wc_add_notice( sprintf( __('You need to buy in quantities of %s products', 'woocommerce'), $multiples ), 'error' );
}

无效的修改尝试:
将分类判断替换为属性判断:

if ( has_term( '1liter', 'pa_bottle', $cart_item['product_id'] ) ) {

解决方案

问题核心是可变产品的属性存储在变体(variation)上,而非父产品,原代码仅检查父产品ID会导致判断错误。以下是修正后的代码:

add_action( 'woocommerce_check_cart_items', 'wc_check_1liter_quantity_multiples' );
function wc_check_1liter_quantity_multiples() {
    $required_multiple = 3;
    $total_1liter = 0;

    // 遍历购物车所有商品项
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // 处理可变产品的变体
        if ( ! empty( $cart_item['variation_id'] ) ) {
            if ( has_term( '1liter', 'pa_bottle', $cart_item['variation_id'] ) ) {
                $total_1liter += $cart_item['quantity'];
            }
        } 
        // 处理简单产品
        else {
            if ( has_term( '1liter', 'pa_bottle', $cart_item['product_id'] ) ) {
                $total_1liter += $cart_item['quantity'];
            }
        }
    }

    // 当1升装商品总数量非0且不是3的倍数时,提示错误
    if ( $total_1liter > 0 && ( $total_1liter % $required_multiple ) !== 0 ) {
        wc_add_notice( sprintf( __('所有1升装葡萄酒的总购买数量必须是%s的倍数', 'woocommerce'), $required_multiple ), 'error' );
    }
}

关键修改点

  1. 区分变体与简单产品:针对可变产品,使用$cart_item['variation_id']检查变体属性;简单产品直接检查商品本身ID
  2. 精准统计目标商品:仅累加1liter属性商品的数量,其他商品不纳入统计范围
  3. 明确提示信息:错误提示直接指向1升装商品,避免用户混淆

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:32:51