WooCommerce自定义插件如何修改购物车商品line_subtotal与line_total
问题描述
开发WooCommerce营销类插件时,需要修改购物车$cart_items中对应商品的line_subtotal和line_total字段,此前尝试两种方案均未生效:
- 直接使用
woocommerce_cart_product_subtotal钩子未达到预期效果 - 尝试通过
cart_item_key重定义数组元素修改数值,代码如下(该函数挂载在woocommerce_before_calculate_totals动作下,配合woocommerce_get_cart_contents过滤器使用时会出现购物车自动清空的问题):
foreach($cartItems as $hash => $perProduct) { if($perProduct['product_id'] = $lastItemsProductId) { if($lastItemsQuantity > 1) { $lineSubtotal = data_get($lastItemInCart, 'line_subtotal'); $lineTotal = data_get($lastItemInCart, 'line_total'); $newQuantity = $lastItemsQuantity-1; $lastItemInCart['line_subtotal'] = $newQuantity * $lastItemsPrice; $lastItemInCart['line_total'] = $newQuantity * $lastItemsPrice; $cartItems[$lastItemsKey] = $lastItemInCart; WC()->cart->calculate_totals(); } } }
需求场景:用户添加系统指定商品时,若该商品购买数量≥2,则对其进行折扣优惠计算。
解决方案
可通过挂载woocommerce_cart_product_subtotal过滤器实现,首先注册过滤器:
add_filter( 'woocommerce_cart_product_subtotal', [$this,'filterWoocommerceCartProductSubtotal'], 10, 4);
过滤器实现代码如下:
/** * 订单列表折扣逻辑过滤器 * * @param int $product_subtotal 商品小计 * @param object $product 商品对象 * @param int $quantity 购买数量 * @param array $cart 购物车对象 * @return string 格式化后的商品小计 */ public function filterWoocommerceCartProductSubtotal($product_subtotal, $product, $quantity, $cart) : string { $appliedCoupons = $cart ? $cart->get_applied_coupons() : null; $cartCount = $cart ? count($cart->get_cart()) : 0; $cartItems = $cart->get_cart(); $lastItemInCart = last($cartItems); $lastItemsProductId = data_get($lastItemInCart, 'product_id', data_get($lastItemInCart, 'product_id')); $lastItemsPrice = $lastItemInCart['data']->get_regular_price(); $lastItemsQuantity = data_get($lastItemInCart, 'quantity'); $lastItemsKey = data_get($lastItemInCart, 'key'); if( in_array('3al2ode', $appliedCoupons)){ if($lastItemsQuantity > 1) { if(@data_get($product,'id') == $lastItemsProductId) { $newSubTotal = 0; $price = $product->get_price(); $newQuantity = $lastItemsQuantity-1; $quantity = $newQuantity; $newSubTotal += $price * $quantity; return $newSubTotal ? wc_price($newSubTotal) : $product_subtotal; } } } return $product_subtotal; }
内容的提问来源于stack exchange,提问作者Fatih Toprak
相关产品推荐
相关产品推荐

