
本文详解如何修改 OpenCart 3 的 Category Bestseller 模块,将其数据源从订单销量(order_product.quantity)切换为产品浏览量(product.viewed),实现按“最常被查看的分类”排序展示。
本文详解如何修改 opencart 3 的 category bestseller 模块,将其数据源从订单销量(`order_product.quantity`)切换为产品浏览量(`product.viewed`),实现按“最常被查看的分类”排序展示。
在 OpenCart 3 中,原生的「Category Bestseller」模块默认依据历史订单中各分类下商品的销售总量进行排序。但若业务目标转向内容热度或用户兴趣洞察,更合理的指标是产品页面的浏览次数(viewed 字段)——该字段由 OpenCart 自动维护(每次 product 控制器中调用 model_catalog_product->getProduct() 时递增),天然反映用户关注度。
要完成这一逻辑变更,核心在于重写模型层的 SQL 查询。原始查询通过多表联结 order、order_product 和 product_to_category 统计销量总和;而新逻辑需直接基于 product 表的 viewed 字段聚合,并剔除与订单系统无关的冗余关联。
以下是推荐使用的优化后 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 替代 SUM(op.quantity),并以 SUM(p.viewed) 实现分类维度汇总;
- 保留 product_to_store 关联确保多门店兼容性;
- WHERE 条件精简,剔除 o.order_status_id > '0' 等无效约束;
- 仍维持 GROUP BY p2c.category_id 和 ORDER BY total DESC 保证分类聚合与降序排序逻辑一致。
⚠️ 重要注意事项:
- 缓存刷新必需:OpenCart 使用 $this->cache->set() 缓存结果(键名含语言、店铺、客户组等参数)。修改模型后,必须清空修改缓存(后台 → Extensions → Modifications → 点击右上角「Refresh」按钮),否则旧缓存将持续生效;
- viewed 字段初始化:若部分商品 viewed = 0,其所在分类可能无法进入榜单。建议上线前运行一次 UPDATE product SET viewed = 1 WHERE viewed = 0 AND status = 1;(生产环境请先备份);
- 性能提示:SUM(p.viewed) 在大数据量下无需额外索引(viewed 为整型,且聚合发生在内存中),但若分类数超千级,可考虑为 product_to_category(product_id) 添加复合索引提升联结效率;
- 扩展建议:如需支持“最近7天高浏览分类”,可增加 AND p.date_modified >= DATE_SUB(NOW(), INTERVAL 7 DAY) 条件(需确保 date_modified 准确更新)。
完成上述修改并刷新缓存后,模块即刻切换为按产品累计浏览量对分类进行排序,更精准地呈现用户真实兴趣热点,助力首页推荐、导航优化等运营场景。










