WooCommerce查看订单页面:按常规价计算小计(排除售价)的实现
WooCommerce订单页面按下单时常规价计算小计的解决方案
你的问题核心是要取下单时的商品常规价,而不是当前商品的常规价——之前的代码直接调用$product->get_regular_price()会拉取商品当前的价格,自然会受后续价格变动影响。
要解决这个问题,需要分两步:先在订单创建时保存当时的常规价,再在订单页面读取这个保存的值来计算小计。
具体代码实现
1. 保存下单时的商品常规价
添加以下代码到主题的functions.php文件或自定义代码插件中,它会在用户结账时,把每个订单项对应的商品常规价保存到订单的元数据里:
// 保存下单时的商品常规价到订单项元数据 add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_regular_price', 10, 4); function save_order_item_regular_price($item, $cart_item_key, $values, $order) { $product = $values['data']; $item->update_meta_data('_order_item_regular_price', $product->get_regular_price()); }
2. 修改订单页面的小计计算逻辑
这段代码会在订单查看页面,替换默认的小计为“保存的常规价 × 数量”的结果:
// 替换订单查看页面的小计显示 add_filter('woocommerce_order_item_subtotal', 'display_regular_price_based_subtotal', 10, 3); function display_regular_price_based_subtotal($subtotal_html, $item, $order) { // 仅在订单查看页面生效 if (!is_wc_endpoint_url('view-order')) { return $subtotal_html; } // 获取下单时保存的常规价 $regular_price = $item->get_meta('_order_item_regular_price'); if ($regular_price) { $quantity = $item->get_quantity(); $subtotal = $regular_price * $quantity; // 按订单货币格式化价格 return wc_price($subtotal, array('currency' => $order->get_currency())); } // 若未保存常规价,返回默认小计 return $subtotal_html; }
注意事项
- 这段代码对新增的订单生效,已存在的旧订单因为没有保存当时的常规价,需要额外处理(比如批量更新订单项元数据,或者从订单创建时的产品快照中提取)。
- 修改主题文件前建议先备份,避免出现意外问题。
内容的提问来源于stack exchange,提问作者user19992085
相关产品推荐
相关产品推荐

