
本文详解如何修改 opencart 3 的 category bestseller 模块,将其统计逻辑从「订单销量总和」切换为「商品浏览量总和」,通过重写模型层 sql 查询并清理缓存实现功能变更。
本文详解如何修改 opencart 3 的 category bestseller 模块,将其统计逻辑从「订单销量总和」切换为「商品浏览量总和」,通过重写模型层 sql 查询并清理缓存实现功能变更。
在 OpenCart 3 中,Category Bestseller 模块默认依据历史订单中各分类下商品的销售总量(SUM(op.quantity))进行排序,展示“最畅销分类”。若需将其改为反映用户兴趣热度的“最高浏览量分类”,关键在于替换数据源与聚合逻辑——不再依赖 order_product 和 order 表,而是直接读取 product 表中的 viewed 字段(OpenCart 原生记录商品被访问次数),按分类聚合求和。
以下是需修改的核心代码(位于 catalog/model/extension/module/bestseller_category.php):
public function getBestSellerCategories($limit) {
$category_data = $this->cache->get('category.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $this->config->get('config_customer_group_id') . '.' . (int)$limit);
if (!$category_data) {
$category_data = array();
// ✅ 替换为基于 product.viewed 的查询(移除订单相关表,精简 JOIN)
$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);
$category_data = $query->rows;
$this->cache->set('category.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $this->config->get('config_customer_group_id') . '.' . (int)$limit, $category_data);
}
return $category_data;
}
? 关键变更说明:
- 移除了 order_product、order 等订单关联表,避免冗余计算与权限/状态干扰;
- 直接使用 product.viewed 字段(OpenCart 自动维护,每次商品详情页加载即 +1);
- SUM(p.viewed) 按分类聚合,真实反映该分类下所有上架商品的累计曝光热度;
- WHERE 条件保留 p.status, c.status, date_available, store_id 等核心可见性控制,确保结果与前台一致;
- 无需额外字段或数据库修改——viewed 是 OpenCart 3 标准 product 表字段。
⚠️ 重要注意事项:
- 缓存必须清除:OpenCart 启用了模块级缓存($this->cache->get() / set()),修改后需登录后台 → Extensions > Modifications → 点击右上角 Refresh 按钮,强制重载所有修改缓存;
- 浏览量初始化:新安装或未访问过的商品 viewed = 0,建议上线前对核心商品手动访问数次,或通过 SQL 批量初始化(如 UPDATE oc_product SET viewed = 100 WHERE product_id IN (1,2,3););
- 性能提示:该查询无复杂子查询,JOIN 数量减少,执行效率通常优于原订单查询,尤其适用于高并发站点;
- 扩展建议:如需支持“最近30天浏览量”,可添加时间条件(需在 product 表扩展 date_viewed_last 字段并配合日志表,超出本文范围)。
完成上述修改并刷新缓存后,模块将实时按分类内商品总浏览量降序展示,更精准匹配用户行为趋势,助力运营决策与首页推荐优化。










