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

