ScandiPWA中按category_uid过滤GraphQL商品查询返回全部商品问题
环境
- 全新Magento安装环境
- ScandiPWA已正常部署运行
问题描述
使用category_uid作为过滤条件的GraphQL商品查询始终返回全品类商品,哪怕传入不存在的category_uid值也无效。示例查询如下:
{ products( filter: { category_uid: {eq: "Nw==" } } ) { items { name } } }
同时,分层导航的分类筛选复选框使用category_uid作为参数(如http://my_domain.com/clothing.html?customFilters=category_uid:NA==),导致筛选完全失效。
问题定位
- 纯净Magento环境(未安装ScandiPWA)中,
category_uid过滤查询可正常工作 - 确认ScandiPWA重写/扩展了Magento的GraphQL商品查询相关代码,是过滤逻辑失效的根源
解决方案
针对ScandiPWA扩展的GraphQL过滤逻辑修复,步骤如下:
定位ScandiPWA的GraphQL过滤处理类
找到ScandiPWA模块中处理商品过滤的核心代码,通常位于app/code/ScandiPWA/CatalogGraphQl目录下,重点关注Model/Resolver/Products/FilterProcessor或类似的过滤处理器类。修复category_uid的过滤映射逻辑
检查类中category_uid字段的处理逻辑:- 原生Magento会将
category_uid解析为对应category_id执行数据库查询 - ScandiPWA的扩展代码大概率遗漏了该字段的映射,或错误跳过了过滤处理
- 添加/修正
category_uid到category_id的解析逻辑,确保过滤条件能正确转换为数据库查询条件
参考修复代码(需注入
Magento\Catalog\Model\CategoryRepository依赖):// 在ScandiPWA的FilterProcessor类中添加category_uid处理逻辑 if (isset($filters['category_uid'])) { $categoryUid = $filters['category_uid']['eq']; // 处理UID解码(若需要)并转换为category_id $category = $this->categoryRepository->get($categoryUid); $filters['category_id'] = ['eq' => $category->getId()]; unset($filters['category_uid']); }- 原生Magento会将
同步分层导航的参数处理逻辑
找到ScandiPWA中处理分层导航customFilters参数的代码(通常在app/code/ScandiPWA/Catalog或ScandiPWA/CatalogGraphQl模块),确保category_uid参数能正确转换为GraphQL查询的过滤条件,与上述修复逻辑保持一致。验证修复效果
执行Magento缓存清理:
bin/magento cache:clean bin/magento cache:flush
重新发起GraphQL查询或点击分层导航的分类筛选复选框,确认过滤功能正常生效。
额外提示
若ScandiPWA模块有版本更新,直接修改核心代码可能被覆盖,建议通过自定义模块扩展ScandiPWA的过滤逻辑,而非直接修改原有代码。
内容的提问来源于stack exchange,提问作者fulma_joe

