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

WooCommerce:分组商品加入购物车后自定义折扣被重复计算

问题分析与解决方案

咱们来拆解你遇到的重复折扣问题,一步步解决它:

为什么会出现重复计算?

你用到的woocommerce_product_get_price钩子,在WooCommerce处理价格的多个环节都会触发——包括单独展示产品、添加到购物车、分组商品加载子产品时。当处理分组商品里的子产品时,这个钩子可能会被调用多次,每次都会基于上一次修改后的价格再乘以0.9,就导致了100*0.9*0.9=81的叠加情况。

另外,虽然你用的Product Addons插件不涉及价格变动,但它通过JS控制子产品的显示/隐藏,可能间接触发了WooCommerce的价格重新计算逻辑,让钩子多执行了一遍。

核心修复方案:基于原始价格计算折扣

要解决这个问题,关键是始终用产品的原始价格来计算折扣,而不是钩子传入的可能已经被修改过的$price参数。我们可以直接获取产品的原始常规价格(或促销价)来避免重复叠加。

修改后的代码如下:

function return_custom_discounted_price($price, $product) {
    $current_user = wp_get_current_user();
    $newPrice = $price;
    $prodID = $product->get_id();

    // 仅在前台且用户角色匹配时执行
    if( in_array('example_customer', $current_user->roles) && !is_admin()){
        // 检查产品是否属于目标分类
        if(has_term( 'example-category', 'product_cat', $prodID )){
            // 获取产品原始常规价格,不受之前修改影响
            $original_price = $product->get_regular_price();
            // 如果需要优先用促销价,可以改成下面这行
            // $original_price = $product->get_sale_price() ?: $product->get_regular_price();
            $newPrice = $original_price * 0.9;
        }
    }
    return $newPrice;
}
add_filter('woocommerce_product_get_price', 'return_custom_discounted_price', 10, 2);

额外优化:避免重复触发的标记方案

如果上面的方案还没解决问题,你可以给产品加个临时标记,确保折扣只应用一次。比如利用WooCommerce会话记录已处理的产品ID:

function return_custom_discounted_price($price, $product) {
    $current_user = wp_get_current_user();
    $newPrice = $price;
    $prodID = $product->get_id();

    if( in_array('example_customer', $current_user->roles) && !is_admin()){
        // 获取会话中已处理的产品列表
        $processed_products = WC()->session->get('processed_discounted_products', array());
        
        if(has_term( 'example-category', 'product_cat', $prodID ) && !in_array($prodID, $processed_products)){
            $newPrice = $price * 0.9;
            // 将当前产品ID加入已处理列表
            $processed_products[] = $prodID;
            WC()->session->set('processed_discounted_products', $processed_products);
        }
    }
    return $newPrice;
}
add_filter('woocommerce_product_get_price', 'return_custom_discounted_price', 10, 2);

⚠️ 注意:这种方法需要在用户清空购物车时重置标记,否则下次添加产品可能不会再触发折扣。可以再加个钩子处理购物车清空的情况:

function reset_discounted_product_session() {
    WC()->session->set('processed_discounted_products', array());
}
add_action('woocommerce_cart_emptied', 'reset_discounted_product_session');

测试建议

  1. 先单独添加目标分类产品,确认折扣正常显示为90元
  2. 再从分组商品中添加该产品,检查购物车价格是否符合预期
  3. 测试Product Addons的显示/隐藏功能,确保不影响价格计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:09:47