0

0

如何在 PrestaShop 1.7 中自定义分类页的产品查询 SQL

心靈之曲

心靈之曲

发布时间:2026-01-14 18:12:02

|

795人浏览过

|

来源于php中文网

原创

如何在 PrestaShop 1.7 中自定义分类页的产品查询 SQL

本文详解如何通过重写 category 类的 getproducts() 方法,在 prestashop 1.7 分类列表页中注入自定义 sql 查询逻辑,以支持按扩展字段(如 priority、state)精准排序与筛选产品。

在 PrestaShop 1.7 中,分类页面(Category Controller)展示的产品数据并非由单一 SQL 模板驱动,而是由 Category 类的 getProducts() 方法动态构建并执行两个核心查询:

  • 计数查询(COUNT):用于分页总数计算;
  • 数据查询(SELECT):获取实际展示的产品列表(含关联的图片、价格、属性等)。

该方法位于 classes/Category.php,是修改产品检索逻辑的唯一官方推荐入口。直接修改核心文件不可取,应通过覆盖(Override)机制安全扩展。

✅ 正确做法:创建 Category 类覆盖文件

在 override/classes/Category.php 中创建如下覆盖类:

网奇企业网站管理系统CWMS2.0 英文版
网奇企业网站管理系统CWMS2.0 英文版

CWMS 2.0功能介绍:一、 员工考勤系统,国内首创CWMS2.0的企业员工在线考勤系统。二、 自定义URL Rewrite重写,友好的搜索引擎 URL优化。三、 代码与模板分离技术,支持超过5种类型的模板类型。包括:文章、图文、产品、单页、留言板。四、 购物车功能,CWMS2.0集成国内主流支付接口。如:淘宝、易趣、快钱等。完全可媲美专业网上商城系统。五、 多语言自动切换 中英文的说明。六、

下载
 0 的产品)
        $where = ' AND p.`state` = 1 AND p.`priority` > 0 ';

        // 2️⃣ 调用父类逻辑,但注入自定义条件
        $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity'
            . ', pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`,'
            . ' pl.`meta_keywords`, pl.`meta_title`, pl.`name`, image_shop.`id_image`, il.`legend`,'
            . ' m.`name` AS manufacturer_name, cl.`name` AS category_default, DATEDIFF(product_shop.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new'
            . ', product_shop.price AS orderprice'
            . ' FROM `'._DB_PREFIX_.'category_product` cp'
            . ' LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`'
            . ' '.Shop::addSqlAssociation('product', 'p').'
            . ' LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int) $idLang.Shop::addSqlRestrictionOnLang('pl').')'
            . ' LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.`id_category` = cp.`id_category` AND cl.`id_lang` = '.(int) $idLang.Shop::addSqlRestrictionOnLang('cl').')'
            . ' LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover = 1 AND image_shop.id_shop='.(int) Context::getContext()->shop->id.')'
            . ' LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int) $idLang.')'
            . ' LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (p.`id_manufacturer` = m.`id_manufacturer`)'
            . ' '.StockAvailable::addSqlAssociation('stock', 'p', false, Context::getContext()->shop->id).'
            . ' WHERE cp.`id_category` = '.(int) $this->id
            . $where // ? 注入自定义条件
            . Shop::addSqlRestriction(Shop::SHARE_PRODUCT)
            . ($active ? ' AND product_shop.`active` = 1' : '')
            . ($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '');

        // 3️⃣ 自定义 ORDER BY(例如:先按 priority 降序,再按 date_add 降序)
        if (!$orderBy) {
            $orderBy = 'p.`priority`';
            $orderWay = 'DESC';
        }

        // 4️⃣ 执行查询(复用 PrestaShop 分页/缓存逻辑)
        if ($getTotal) {
            return (int) Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(
                'SELECT COUNT(*) FROM ('.$sql.') c'
            );
        }

        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
            $sql
            . ' ORDER BY '.($orderBy == 'id_product' ? 'p.`id_product`' : $orderBy).' '.$orderWay
            . ' LIMIT '.(int) $n.' OFFSET '.(int) (($p - 1) * $n)
        );

        // 5️⃣ 补充处理(如添加图片 URL、价格格式化等),可调用 Product::getProductsProperties()
        return Product::getProductsProperties($idLang, $result);
    }
}

⚠️ 关键注意事项

  • 必须清除缓存:覆盖生效前,删除 var/cache/ 下所有内容(或后台「高级参数 → 性能」中点击「清除缓存」);
  • 避免硬编码表前缀:始终使用 _DB_PREFIX_ 常量;
  • 区分主从库:读操作使用 _PS_USE_SQL_SLAVE_,写操作禁用;
  • 保持分页兼容性:$getTotal 分支必须返回整型计数,否则分页将异常;
  • 不建议修改 COUNT 查询结构:若需复杂过滤,务必同步更新计数子查询中的 WHERE 条件,否则页码显示错误;
  • 优先使用 Hook 替代硬覆盖:对于简单排序/过滤,可考虑 actionProductSearchProviderQueryBuilder 钩子(PS 1.7.7+),更轻量且升级友好。

✅ 总结

通过安全覆盖 Category::getProducts(),你完全掌控了分类页的数据源。无论是按自定义字段 priority 加权排序、按 state 状态筛选,还是关联其他业务表,均可在此方法中灵活实现。记住:覆盖是手段,可维护性与兼容性才是目标——始终遵循 PS 覆盖规范,测试分页、缓存与多语言场景,确保升级无忧。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2492

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1596

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1487

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1415

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号