Opencart v2中隐藏"Latest products"模块分类ID为9的商品
嘿,针对你在OpenCart 2.x里要隐藏首页Latest Products模块中分类ID为9的商品需求,我给你两种方案,从最简单的快速实现到更严谨的彻底排除都有:
方案一:CSS快速隐藏(最简单的前端实现)
这个方法不用碰后端逻辑,几分钟就能搞定,适合临时需求:
- 第一步:给目标商品加标识(如果页面里还没有的话)
打开你的主题下的Latest模块模板文件:catalog/view/theme/你的主题名/template/module/latest.tpl
找到循环渲染商品的容器标签(一般是<div class="product-layout">或者类似的结构),给它加个带分类ID的自定义属性,比如:
(注:如果<div class="product-layout" data-category-id="<?php echo reset($product['category_id']); ?>">$product['category_id']是数组(商品属于多个分类),用reset()取第一个分类ID;如果是单个值,直接写<?php echo $product['category_id']; ?>就行) - 第二步:添加隐藏CSS
打开主题的自定义样式文件(比如catalog/view/theme/你的主题名/stylesheet/custom.css,没有的话可以新建一个,或者加到现有stylesheet里),加入这段代码:.product-layout[data-category-id="9"] { display: none !important; } - 小提醒:这个方法只是在前端隐藏商品,商品还是会被加载到页面源码里,适合快速临时隐藏,要是需要彻底不让商品出现在请求里,就看下面的方案。
方案二:修改后端逻辑彻底排除(更严谨)
这个方法会从源头上过滤掉分类ID为9的商品,不会把它们加载到页面里:
方法A:修改商品模型(推荐,性能更好)
打开商品模型文件:catalog/model/catalog/product.php
找到getLatestProducts方法里的SQL查询语句,原语句大概是这样:
$query = $this->db->query("SELECT p.product_id, p.price, p.image, p.date_added FROM " . DB_PREFIX . "product p WHERE p.status = '1' ORDER BY p.date_added DESC LIMIT " . (int)$limit);
把它修改成关联商品-分类表,排除分类ID9的版本:
$query = $this->db->query("SELECT DISTINCT p.product_id, p.price, p.image, p.date_added FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p2c.category_id != '9' ORDER BY p.date_added DESC LIMIT " . (int)$limit);
这里用DISTINCT是为了避免商品属于多个分类时被重复查询出来。
方法B:修改Latest模块控制器(不用碰模型,适合不想改核心模型的情况)
打开Latest模块控制器:catalog/controller/module/latest.php
找到获取最新商品的代码段(一般是$results = $this->model_catalog_product->getLatestProducts($setting['limit']);),在这段代码后面加上过滤逻辑:
// 过滤掉分类ID为9的商品 $filtered_products = []; foreach ($results as $product) { $product_categories = $this->model_catalog_product->getCategories($product['product_id']); $is_in_category_9 = false; foreach ($product_categories as $category) { if ($category['category_id'] == 9) { $is_in_category_9 = true; break; } } if (!$is_in_category_9) { $filtered_products[] = $product; } } // 替换原结果为过滤后的结果 $results = $filtered_products;
这样控制器会把属于分类9的商品从结果里剔除,再传递给模板渲染。
内容的提问来源于stack exchange,提问作者Mister Tango
相关产品推荐
相关产品推荐

