Prestashop 1.7.4订单编辑客户地址后运费归零Bug修复求助
修复Prestashop 1.7.4后台订单编辑地址时运费重置为零的Bug
问题根源
在后台订单模块(BO-Orders)编辑客户地址时,系统会自动触发订单运费重新计算,但未保留原订单的运费金额,导致运费被重置为零。而在客户模块(BO-Customers)编辑地址时,仅更新客户地址信息,不会关联触发订单运费计算逻辑,因此运费不受影响。
代码修复方案
步骤1:定位目标文件
打开后台控制器文件:/admin-dev/controllers/admin/AdminOrdersController.php
步骤2:修改processAddressUpdate方法
找到处理地址更新的processAddressUpdate方法(约在文件1900行附近,具体行号可能因版本微调),定位到配送地址更新的代码块:
原代码:
if (Tools::getValue('id_address_delivery')) { $order->id_address_delivery = (int)Tools::getValue('id_address_delivery'); $carrier = new Carrier($order->id_carrier); $order->setDeliveryOption($order->getDeliveryOption()); $order->updateShippingCost($carrier, true); }
修改为:
if (Tools::getValue('id_address_delivery')) { $order->id_address_delivery = (int)Tools::getValue('id_address_delivery'); $carrier = new Carrier($order->id_carrier); $order->setDeliveryOption($order->getDeliveryOption()); // 移除自动计算运费的逻辑,保留原订单运费 // $order->updateShippingCost($carrier, true); }
可选:双重保障保留运费
如果担心其他潜在逻辑影响运费,可手动保存并恢复所有运费相关字段:
if (Tools::getValue('id_address_delivery')) { // 提前保存原运费字段 $originalShipping = $order->total_shipping; $originalShippingTaxIncl = $order->total_shipping_tax_incl; $originalShippingTaxExcl = $order->total_shipping_tax_excl; $order->id_address_delivery = (int)Tools::getValue('id_address_delivery'); $carrier = new Carrier($order->id_carrier); $order->setDeliveryOption($order->getDeliveryOption()); $order->updateShippingCost($carrier, true); // 强制恢复原运费金额 $order->total_shipping = $originalShipping; $order->total_shipping_tax_incl = $originalShippingTaxIncl; $order->total_shipping_tax_excl = $originalShippingTaxExcl; }
步骤3:验证效果
修改完成后保存文件,刷新后台测试:
- 打开任意已有订单,进入地址编辑界面
- 修改配送地址并保存
- 检查订单详情中的运费金额是否与修改前一致
说明
该修改核心是跳过订单地址更新时的自动运费重算逻辑——已确认的订单运费属于交易既定金额,不应因地址修改而变更,这也和客户模块编辑地址的逻辑保持一致。
内容的提问来源于stack exchange,提问作者Jirka de Lucina
相关产品推荐
相关产品推荐

