OpenCart 3.0.3.6购物车重量异常:0重量显示150克求助
OpenCart 3.0.3.6 (rs.1) 购物车重量异常:0/未设置重量商品显示150克的排查与修复
问题根源
这个150克的异常值并非来自你排查的library/cart或checkout控制器,而是大概率来自商品模型的兜底赋值、重量转换类的默认逻辑,或是第三方扩展的强制设置。OpenCart原生不会给无重量商品默认设150克,这个数值应该是自定义修改或扩展引入的。
触发代码位置
你漏查了几个核心文件:
catalog/model/catalog/product.php:获取商品详情的核心模型,若此处存在对product_weight的兜底判断(比如重量为0/null时强制设为150),会直接导致购物车读取到错误值system/library/weight.php:重量转换工具类,部分场景下如果源重量无效,会返回预设的默认值system/library/cart/cart.php:虽然你排查过,但可能没注意到getProducts()循环中对商品重量的二次处理逻辑- 第三方物流/购物车扩展:部分扩展会强制给无重量商品设置默认重量,用于运费计算
修复步骤
1. 检查商品模型的兜底赋值
打开catalog/model/catalog/product.php,找到getProduct()方法,搜索是否有类似代码:
if (empty($product['weight']) || $product['weight'] == 0) { $product['weight'] = 150; }
如果存在,直接删除这段代码,或者将150改为0。
2. 排查重量转换类的异常逻辑
打开system/library/weight.php,查看convert()方法,是否有如下判断:
public function convert($value, $from, $to) { // ... 其他转换代码 if (!$value) { return 150; // 这里是异常源头 } // ... 其他代码 }
将返回值改为0,或者直接删除这个条件分支。
3. 检查购物车类的商品处理逻辑
重新查看system/library/cart/cart.php的getProducts()方法,确认循环中是否有对重量的强制赋值:
foreach ($this->session->data['cart'] as $key => $quantity) { // ... 获取商品数据 if (!$product['weight']) { $product['weight'] = 150; } // ... 组装购物车商品数据 }
删除或修改该赋值逻辑即可。
4. 排查第三方扩展与系统设置
- 进入后台系统→设置→编辑商店→本地,检查“重量单位”的默认配置,确认无异常数值
- 禁用所有第三方物流、购物车相关扩展,测试是否恢复正常,逐步排查是哪个扩展导致的问题
验证方法
修改完成后,添加一个重量设为0或未填写重量的商品到购物车,刷新页面查看购物车重量显示是否为0(或符合模板的无重量展示逻辑)。
内容的提问来源于stack exchange,提问作者конструктор
相关产品推荐
相关产品推荐

