Magento 2商品分配至分类偶发失效问题排查与解决
商品分类分配偶发失效排查与解决(Magento 2.4.5-p1)
环境信息
- Magento版本:2.4.5-p1
- PHP版本:8.1
问题场景
通过代码分配商品到分类的操作偶发失效,日志显示执行了分配动作,但数据库中无对应关联记录。
所用代码
$categoryLinkRepository = $objManager->get('\Magento\Catalog\Api\CategoryLinkManagementInterface'); $categoryLinkRepository->assignProductToCategories($sku, $CategoryIds);
$CategoryIds 为商品需分配到的分类ID数组。
排查步骤
为验证分配执行情况,在核心文件 vendor/magento/module-catalog/Model/CategoryLinkManagement.php 第101行添加日志:
foreach (array_diff($categoryIds, $assignedCategories) as $categoryId) { error_log("Assigning----> SKU: $productSku - CAT: $categoryId"); /** @var \Magento\Catalog\Api\Data\CategoryProductLinkInterface $categoryProductLink */ $categoryProductLink = $this->productLinkFactory->create(); $categoryProductLink->setSku($productSku); $categoryProductLink->setCategoryId($categoryId); $categoryProductLink->setPosition(0); $this->getCategoryLinkRepository()->save($categoryProductLink); }
日志输出
Assigning----> SKU: 83689 - CAT: 1816
数据库验证结果
查询商品ID:
MariaDB [magentodb]> select entity_id from catalog_product_entity where sku = '83689'; +-----------+ | entity_id | +-----------+ | 14427 | +-----------+
查询商品关联的分类:
MariaDB [magentodb]> select * from catalog_category_product where product_id = 14427; +-----------+-------------+------------+----------+ | entity_id | category_id | product_id | position | +-----------+-------------+------------+----------+ | 183887 | 1742 | 14427 | 0 | | 183889 | 1785 | 14427 | 0 | +-----------+-------------+------------+----------+
可见分类1816未出现在关联记录中。
分类结构
Default Category | ---> sub-category | ----> Category 1816
疑问
三级分类是否会导致分配失败?日志明确显示分配操作已执行,用try-catch包裹也无报错,该如何进一步排查?
更新与解决方案
分配代码本身无问题,问题出在后续更新商品分类位置的代码中:使用 $category->setPostedProducts($positions); 时,如果$positions数组遗漏了分类内已存在的商品,这些商品会被直接移除,而非设置为0位置。导致商品先被分配到目标分类,随后又被该操作移除。
内容的提问来源于stack exchange,提问作者Jemy09
相关产品推荐
相关产品推荐

