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

如何在WooCommerce中仅修改购物车商品小计,不改动显示单价

解决WooCommerce订单项小计添加配送费且保留商品显示价格的问题

要实现商品显示价格不变、仅将配送费加入订单项小计及购物车总额的需求,你需要分开处理「价格显示」和「实际金额计算」两个部分,以下是具体实现代码:

1. 修改订单项实际小计金额

使用woocommerce_before_calculate_totals钩子,直接调整订单项的小计和总计字段,同时确保WooCommerce认可这些修改值:

add_action( 'woocommerce_before_calculate_totals', 'adjust_cart_subtotal_with_delivery_fee', 20, 1 );
function adjust_cart_subtotal_with_delivery_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // 避免重复触发计算
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ){
        // 检查是否存在配送费字段
        if( isset($cart_item['pr_field']) && ! empty($cart_item['pr_field']) ) {
            $delivery_fee = (float) $cart_item['pr_field'];
            $quantity = $cart_item['quantity'];
            
            // 获取商品原始单价
            $original_price = $cart_item['data']->get_price();
            // 计算原始小计
            $original_subtotal = $original_price * $quantity;
            
            // 计算包含配送费的新小计和总计
            $new_subtotal = $original_subtotal + $delivery_fee;
            $new_total = $new_subtotal; // 若无折扣,总计等于小计
            
            // 更新订单项的小计和总计
            $cart_item['line_subtotal'] = $new_subtotal;
            $cart_item['line_total'] = $new_total;
            
            // 若涉及税费,需同步调整税相关字段(根据你的税率设置修改)
            // $cart_item['line_subtotal_tax'] = $new_subtotal * 0.08; // 示例:8%税率
            // $cart_item['line_tax'] = $cart_item['line_subtotal_tax'];
            
            // 保存修改后的购物车项
            $cart->cart_contents[$cart_item_key] = $cart_item;
        }
    }
    
    // 重新计算购物车总额
    $cart->calculate_totals();
}

2. 保留商品显示价格

使用woocommerce_cart_item_price过滤器,强制显示商品的原始价格,避免被修改后的小计影响:

add_filter( 'woocommerce_cart_item_price', 'keep_original_item_display_price', 20, 3 );
function keep_original_item_display_price( $price_html, $cart_item, $cart_item_key ) {
    if( isset($cart_item['pr_field']) && ! empty($cart_item['pr_field']) ) {
        // 重新生成原始价格的HTML
        $original_price = $cart_item['data']->get_price();
        $price_html = wc_price( $original_price );
    }
    return $price_html;
}

代码说明

  • 第一部分代码直接修改购物车项的line_subtotal和line_total字段,确保配送费被计入实际结算金额,最后调用calculate_totals()更新购物车总额。
  • 第二部分代码拦截商品价格的显示逻辑,始终输出原始的$900价格,保证用户看到的商品价格不变。
  • 若你的店铺涉及税费,需要根据实际税率调整税相关字段的计算,确保税费也包含配送费的部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:43:25