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

如何在WooCommerce中为购物车内低价商品设置折扣?

我来帮你搞定这个问题!你原来的代码是固定针对购物车的第二件商品,而不是按价格去识别最低的那个,所以才会出现不符合预期的情况。下面是修改后的代码,能精准给购物车里价格最低的商品打10%的折扣:

add_filter( 'woocommerce_before_calculate_totals', 'discount_on_cheapest_cart_item', 10, 1 );
function discount_on_cheapest_cart_item( $cart_object ) {
    // 避免在后台执行,防止干扰订单处理等操作
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    // 如果购物车商品数小于2,直接返回(不需要折扣)
    if ( $cart_object->get_cart_contents_count() < 2 ) {
        return;
    }

    $cheapest_item_key = '';
    $lowest_price = PHP_INT_MAX;

    // 遍历购物车所有商品,找出价格最低的那个
    foreach ( $cart_object->get_cart() as $item_key => $cart_item ) {
        $product_price = $cart_item['data']->get_price();
        if ( $product_price < $lowest_price ) {
            $lowest_price = $product_price;
            $cheapest_item_key = $item_key;
        }
    }

    // 如果找到了最低价格的商品,给它打10%折扣
    if ( ! empty( $cheapest_item_key ) ) {
        $cart_object->get_cart_item( $cheapest_item_key )['data']->set_price( $lowest_price * 0.9 );
    }
}

我给你拆解开讲清楚每一步的作用:

  • 先加了后台判断,避免这段代码在WordPress后台执行,防止干扰订单编辑、库存管理这些操作
  • 然后判断购物车商品数量,如果少于2件,直接返回——毕竟只有一件商品的话,不存在“价格更低的那件”
  • 遍历购物车所有商品的时候,我们会实时记录当前找到的最低价格和对应的商品标识(item_key),这样不管商品在购物车的第几个位置,只要是价格最低的就能被精准选中
  • 最后给这件商品设置折扣后价格:10%折扣就是原价乘以0.9,相当于只收90%的费用

另外补充个小细节:如果你的购物车里可能出现多个价格相同的最低商品,这段代码只会给第一个遇到的打折扣。要是需要给所有最低价商品都打折,只需要把遍历里的<改成<=,然后把符合条件的商品键都收集到一个数组里,再逐个设置折扣就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:26:26