You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PrestaShop 1.7.6.7官方模块ps_facetedsearch代码覆写求助

解决PrestaShop 1.7.6.7中覆写ps_facetedsearch模块ProductSearch.php的问题

我明白你遇到的麻烦——用传统的override文件夹尝试覆写ps_facetedsearch的核心类没成功,这其实是因为PrestaShop 1.7.x版本对模块src目录下的命名空间类,默认的override机制支持有限。下面给你两种可行的解决方案,优先推荐第一种规范的方式:

方案一:创建自定义模块进行覆写(最佳实践)

这种方式不会修改官方模块的原始文件,后续升级ps_facetedsearch也不会丢失你的修改,步骤如下:

  1. 创建自定义模块结构
    在你的PrestaShop根目录的modules文件夹下,新建一个名为my_facetedsearch_override的文件夹,然后按照下面的结构创建文件:
modules/
└── my_facetedsearch_override/
    ├── my_facetedsearch_override.php
    └── src/
        └── Hook/
            └── ProductSearch.php
  1. 编写主模块文件
    打开my_facetedsearch_override.php,填入以下代码:
<?php
if (!defined('_PS_VERSION_')) {
    exit;
}

class My_Facetedsearch_Override extends Module
{
    public function __construct()
    {
        $this->name = 'my_facetedsearch_override';
        $this->tab = 'front_office_features';
        $this->version = '1.0.0';
        $this->author = 'Your Name';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = [
            'min' => '1.7.6.0',
            'max' => _PS_VERSION_
        ];
        $this->bootstrap = true;

        parent::__construct();

        $this->displayName = $this->l('My Faceted Search Override');
        $this->description = $this->l('Adds manufacturer ID check to ps_facetedsearch product search provider');
    }

    public function install()
    {
        return parent::install() && $this->registerHook('actionProductSearchProvider');
    }
}
  1. 编写覆写的钩子类
    打开src/Hook/ProductSearch.php,填入以下代码——这里我们继承原模块的ProductSearch类,重写productSearchProvider方法,只修改你需要的那一行:
<?php
namespace MyFacetedsearchOverride\Hook;

use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchQuery;
use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchResult;
use PrestaShop\Module\PsFacetedSearch\Hook\ProductSearch as OriginalProductSearch;

class ProductSearch extends OriginalProductSearch
{
    public function productSearchProvider(ProductSearchQuery $query, ProductSearchResult $result)
    {
        $this->query = $query;
        $this->result = $result;

        if ($this->module->active === false) {
            return;
        }

        $this->assignVariables();

        // 这里是你需要修改的核心代码,替换原条件
        if ($query->getIdCategory() or $query->getIdManufacturer()) {
            $this->handleCategoryFilters();
        }

        $this->handlePriceRange();
        $this->handleAttributes();
        $this->handleFeatures();
        $this->handleSuppliers();
        $this->handleManufacturers();
        $this->handleNewProducts();
        $this->handleSaleProducts();
        $this->handleStockFilters();
        $this->handleCustomFilters();

        $this->addFacetTemplate();
    }
}
  1. 安装启用模块
    登录PrestaShop后台,进入「模块管理器」,找到你创建的My Faceted Search Override模块,点击安装并启用即可。最后记得清除后台缓存(路径:高级参数 -> 性能 -> 清除缓存)。

方案二:直接修改官方模块文件(临时应急用)

如果你只是临时需要修改,不想创建新模块,可以直接编辑官方模块的文件,但要注意备份原文件,因为后续升级ps_facetedsearch模块会覆盖你的修改:

  1. 找到文件:/modules/ps_facetedsearch/src/Hook/ProductSearch.php
  2. 定位到第56行,将if ($query->getIdCategory()) {修改为if ($query->getIdCategory() or $query->getIdManufacturer()) {
  3. 清除PrestaShop后台缓存即可生效。

为什么传统override文件夹没生效?

PrestaShop的默认override机制主要针对核心系统类(比如classes目录下的文件),对于模块src目录下的命名空间类,1.7.6.x版本并没有提供原生的override支持,所以必须用模块覆写的方式来实现。

内容的提问来源于stack exchange,提问作者kanashin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:57:52