
本文详解如何修改 opencart 3 的 category bestseller 模块,将其统计逻辑从「订单销量总和」切换为「商品浏览量总和」,并提供安全、可缓存的 sql 查询重构方案及关键注意事项。
本文详解如何修改 opencart 3 的 category bestseller 模块,将其统计逻辑从「订单销量总和」切换为「商品浏览量总和」,并提供安全、可缓存的 sql 查询重构方案及关键注意事项。
在 OpenCart 3 中,Category Bestseller 模块默认依据各分类下商品的历史销售总量(SUM(op.quantity))进行排序,展示“最畅销分类”。若需将其改造为反映用户兴趣热度的“最受欢迎分类”,应改用商品的 viewed 字段(即后台记录的累计浏览次数)作为核心指标。该字段原生存在于 product 表中,无需额外扩展即可直接利用。
✅ 正确的 SQL 查询重构
需将原始模型中冗长且依赖订单表的查询,替换为更轻量、语义更清晰的版本。以下是优化后的完整查询语句(已适配 OpenCart 安全规范):
$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 config->get('config_store_id') . "'
GROUP BY p2c.category_id
ORDER BY total DESC
LIMIT " . (int)$limit);
关键变更说明:
- ✅ 移除订单相关表(order, order_product):避免因订单状态异常或历史数据缺失导致统计偏差;
- ✅ 直接聚合 p.viewed:每个商品的浏览数由 OpenCart 自动维护(通过 catalog/model/catalog/product.php 中的 updateViewed() 方法),真实反映用户行为;
- ✅ 精简 JOIN 链路:仅保留 product → product_to_store → product_to_category → category 四表关联,提升查询性能;
- ✅ 保留全部业务约束:仍校验商品/分类启用状态、上架时间、所属门店,确保结果合规。
⚠️ 必须执行的关键操作
- 清除模块缓存:OpenCart 默认对 getBestSellerCategories() 结果启用缓存。修改模型后,务必进入后台 Extensions > Modifications 页面点击右上角 Refresh 按钮,或手动删除 system/storage/cache/ 目录下所有以 category.bestseller. 开头的缓存文件;
- 验证数据合理性:首次运行时,若部分商品 viewed = 0,对应分类可能暂不显示——建议在测试环境先行运行 UPDATE oc_product SET viewed = FLOOR(RAND()*1000) WHERE status = 1; 模拟浏览数据;
- 避免 SQL 注入风险:代码中已对 $limit 和 store_id 使用 (int) 强制类型转换,切勿直接拼接未过滤的变量。
? 补充建议(进阶优化)
- 若需支持多语言分类名称,可在 SELECT 子句中加入 cd.name AS category_name 并 JOIN category_description cd ON (c.category_id = cd.category_id AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "');
- 对于高流量站点,建议为 product.viewed 字段添加索引(虽非必需,但可加速 ORDER BY total DESC 排序);
- 如需区分 PC/移动端浏览,需自行扩展 viewed 字段逻辑(OpenCart 原生不区分设备端)。
完成上述修改后,模块将实时按分类内所有已上架商品的累计浏览量降序排列,精准呈现用户关注度最高的商品类目,助力运营决策与页面推荐优化。










