如何在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
相关产品推荐
相关产品推荐

