WooCommerce购物车及结账页如何为商品小计展示促销价格区间
问题根因
原自定义代码存在两个场景逻辑混用的缺陷:
- 同一处理逻辑同时挂载在「购物车单价展示」和「购物车小计展示」两个完全独立的钩子上
- 触发小计钩子时,代码会直接丢弃钩子传入的、已经按购买数量计算完成的合计值,转而输出单份商品的价格HTML,自然无法展示乘算后的总额。
调整思路
针对两个钩子的业务场景做逻辑拆分,不需要修改原有cart.php、checkout.php模板,直接通过钩子调整输出即可:
- 单价列:保持原生逻辑,输出单份商品带划线促销价的标准HTML,不需要做数量乘算
- 小计列:分别计算对应数量下的「原价合计额」和「促销后实际合计额」,严格按照WooCommerce原生的划线价HTML结构拼接,保证前端样式和系统默认逻辑完全统一,同时自动适配购买数量的乘算。
调整后的可直接使用的代码
/** * 购物车/结账页展示带划线促销价的单价与小计 */ // 处理商品单价列的展示(单份商品价格,无数量乘算) add_filter( 'woocommerce_cart_item_price', 'my_custom_show_sale_price', 10, 3 ); function my_custom_show_sale_price( $old_display, $cart_item, $cart_item_key ) { $product = $cart_item['data']; // 仅对促销商品替换为原生带划线的价格HTML if ( $product && $product->is_on_sale() ) { return $product->get_price_html(); } // 非促销商品保持原有展示,不做修改 return $old_display; } // 处理商品小计列的展示(按购买数量计算合计值) add_filter( 'woocommerce_cart_item_subtotal', 'my_custom_show_sale_subtotal', 10, 3 ); function my_custom_show_sale_subtotal( $old_subtotal, $cart_item, $cart_item_key ) { $product = $cart_item['data']; $quantity = $cart_item['quantity']; // 非促销商品直接返回系统原生计算好的小计值,不做额外处理 if ( ! $product || ! $product->is_on_sale() ) { return $old_subtotal; } // 计算按原价统计的合计金额:自动适配货币格式、税费规则、价格精度 $regular_total = WC()->cart->get_product_subtotal( $product, $quantity, [ 'price' => $product->get_regular_price() ] ); // 获取实际按促销价统计的合计金额,和系统默认计算逻辑完全一致 $sale_total = WC()->cart->get_product_subtotal( $product, $quantity ); // 复用WooCommerce原生划线价的HTML结构,保证前端样式统一 return sprintf( '<del>%s</del> <ins>%s</ins>', $regular_total, $sale_total ); }
代码特性说明
- 完全复用WooCommerce内置的价格计算方法,自动适配后台设置的货币符号、价格精度、税费显示规则、千分位格式,不会出现样式或计算错误
- 仅对处于促销状态的商品展示划线效果,非促销商品完全保持系统原生展示逻辑,不会生成冗余的HTML标签
- 代码通过系统原生钩子实现,不需要修改核心模板文件,后续升级WooCommerce版本时不会出现代码失效、模板被覆盖的问题
- 自动兼容简单商品、商品变体场景,不需要为可变商品单独做逻辑适配
内容的提问来源于stack exchange,提问作者evavienna
相关产品推荐
相关产品推荐

