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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:55:29