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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:09:03