add_action('woocommerce_before_calculate_totals', function ($cart) {
  foreach ($cart->get_cart() as $item) {
    $item['data']->set_price($item['custom_price']);
  }
}, 20);

商品页划线价二百九十九,实付一百九十九,加到结算页金额变回二百九十九,优惠展示和扣款对不上。下单页的合计也跟着变。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,商品页的实付价是主题单独算的展示价,结算走的是另一套价格钩子,两边取的字段不同。优惠以购物车项的形式存在时,结算页没有重新应用。

这次卡住的地方就在「划线价与实付价」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

处理上按这个顺序:统一用购物车项的价格取数,别在模板里自己算展示价;检查优惠在结算刷新后有没有重新挂上,钩子优先级要对;划线价只作参考展示,实付金额以结算接口返回为准。

改完只确认一件事:商品页和结算页的实付金额一致,划线价仍显示原价,下单扣款等于实付。

作者 9823189