
本文详解如何修改 opencart 3 的 category bestseller 模块,将其统计逻辑从“订单销量总和”切换为“商品浏览量总和”,并通过替换 sql 查询、清理缓存实现功能重构。
本文详解如何修改 opencart 3 的 category bestseller 模块,将其统计逻辑从“订单销量总和”切换为“商品浏览量总和”,并通过替换 sql 查询、清理缓存实现功能重构。
在 Opencart 3 中,原生的 Category Bestseller 模块(通常位于 catalog/model/extension/module/bestseller_category.php)默认依据订单中商品的销售数量(order_product.quantity)聚合统计各分类的总销量,并据此排序展示热门分类。但若业务需求转向反映用户兴趣热度(如 SEO 优化、内容运营场景),则更合理的指标是 商品页面浏览量(product.viewed) ——该字段由 Opencart 自动维护,每次产品页面被访问即递增。
要完成这一逻辑切换,核心在于重写模型中的 SQL 查询语句。原始查询依赖订单表链路(order → order_product → product),而新逻辑应直接基于 product 表的 viewed 字段,通过关联 product_to_category 获取所属分类,并按分类维度求和汇总。
以下是修改后的完整 SQL 查询(已适配安全参数绑定与条件过滤):
$query = $this->db->query("SELECT c.category_id, SUM(p.viewed) AS total
FROM " . DB_PREFIX . "product p
LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
LEFT JOIN `" . DB_PREFIX . "product_to_category` p2c ON (p2c.product_id = p.product_id)
LEFT JOIN `" . DB_PREFIX . "category` c ON (p2c.category_id = c.category_id)
WHERE p.status = '1'
AND c.status = '1'
AND p.date_available <= NOW()
AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'
GROUP BY p2c.category_id
ORDER BY total DESC
LIMIT " . (int)$limit);✅ 关键变更说明:
- 移除对 order 和 order_product 表的依赖,消除订单状态判断(o.order_status_id > 0);
- 主表切换为 product,直接读取 p.viewed 字段;
- 保留商品上架状态(p.status = '1')、分类启用状态(c.status = '1')、上架时间(p.date_available <= NOW())及多门店支持(p2s.store_id)等核心业务约束;
- GROUP BY p2c.category_id 确保按分类聚合浏览量,SUM(p.viewed) 实现跨商品累加;
- 排序仍使用 ORDER BY total DESC,保持“高浏览→靠前”的直观逻辑。
⚠️ 重要注意事项:
- 缓存必须清除:Opencart 默认启用模型级缓存($this->cache->get() / set())。修改后需登录后台 → Extensions → Modifications → Click “Refresh”(或手动删除 system/storage/cache/ 下相关缓存文件),否则旧数据将持续生效;
- viewed 字段初始值为 0:新上架商品需真实访问才能积累数据,测试时建议手动刷新几次对应商品页,或临时执行 UPDATE oc_product SET viewed = 100 WHERE product_id = X 验证排序效果;
- 避免 SQL 注入风险:当前代码中 $limit 已强制转换为 (int),符合安全规范;其他动态参数(如 store_id)同样做了类型强转,无需额外防护;
- 性能提示:若站点商品量极大(>10 万),可考虑为 product.viewed 或联合索引 product_to_category(product_id, category_id) 添加数据库索引以加速聚合查询。
完成上述修改并刷新缓存后,模块将实时按分类内所有已上架商品的累计浏览量重新排序,精准呈现用户关注度最高的品类结构——这不仅提升了数据洞察力,也为个性化推荐与首页流量分发提供了更可靠的依据。

















