Magento - 如何清理不在属性集中的属性

3

我正在接手一个网站,但发现属性设置有些混乱。

具体来说,产品的属性与相关的属性集没有关联。

比如,如果你选择了葡萄酒这个产品,它所属的属性集是“葡萄酒”,其中之一的属性是“葡萄品种”。

但是我还有“啤酒”,它们有完全不同的属性集,但是我的某个啤酒却有一个葡萄品种属性。

它没有被分配到啤酒属性集中,在后台也看不到这个产品,(因此我无法编辑它),但是如果我查看数据库,它就在那里(在catalog_product_entity_*和catalog_product_index_eav中),而且当我导出时,它也在那里,如果有人搜索“梅洛”,他们会找到这款啤酒。有数百个产品都存在这种情况。

最好的方法是删除所有不属于其指定属性集的产品属性。

我肯定可以在SQL中解决这个问题,但这并不是最佳做法,因为我担心会遗漏某些内容,从而彻底破坏产品。


如果仅仅是被分配到了错误的属性集,那么有一些模块可以让你在不用 SQL 考察的情况下很简单地在产品上更改属性集。Amasty的Mass Action就是其中之一。 - Fiasco Labs
谢谢,不过它已经被分配了正确的属性集。我的意思是,有些属性虽然没有在该属性集中,但仍然被分配给了该产品。 - komodosp
1
好的,孤立的属性条目... - Fiasco Labs
2个回答

5
这是我最终采取的做法。几周过去了,目前看起来还没有引起任何问题:
CREATE TABLE catalog_product_entity_int_old LIKE catalog_product_entity_int;
INSERT INTO catalog_product_entity_int_old SELECT * FROM catalog_product_entity_int;

DELETE FROM catalog_product_entity_int 
    WHERE value_id IN 
        (SELECT cpei.value_id 
            FROM catalog_product_entity_int_old cpei 
            WHERE cpei.attribute_id NOT IN 
                (SELECT eea.attribute_id 
                    FROM eav_entity_attribute eea 
                        JOIN catalog_product_entity cpe ON eea.attribute_set_id = cpe.attribute_set_id 
                    WHERE cpe.entity_id = cpei.entity_id) 
        ORDER BY cpei.entity_id)

并且

DELETE FROM catalog_product_index_eav WHERE
attribute_id NOT IN (
    (SELECT eea.attribute_id 
    FROM eav_entity_attribute eea 
        JOIN catalog_product_entity cpe ON eea.attribute_set_id = cpe.attribute_set_id 
    WHERE cpe.entity_id = catalog_product_index_eav .entity_id) 
);

然后重新生成索引。

2
截至Magento 2.1版本,此解决方案仍然有效。对于2.1 EE,在第一个查询集中,“entity_id”应该替换为“row_id”(因为有内容分期)。 - Ryan Hoerr
我在Magento 2.2.5上尝试了一下,目前我认为它可以正常工作。 - Mohammed Joraid
我在版本更新后遇到了一个错误,管理员界面上显示产品未被编辑,截图链接:https://prnt.sc/26fjp54。有关此问题的任何解决方案吗? - Savan Dholu

0

我一定会使用Magmi 来清理这个:

首先,在Magento内部进行产品导出(系统->导入/导出->配置文件),选择“导出所有产品”。在生成的CSV中,您将拥有每个属性的列,并且您可以删除每个产品的任何不相关的属性值。 这将允许您绕过后端,其中为特定产品设置属性,但不在产品的属性集中设置。

好好查看Magmi Wiki,但是有一些快速提示: Magmi仅导入您指定的列,因此在执行导入时,您可以安全地删除大多数列。 例如,如果我没有导入图像,则始终确保删除图像列(否则可能会丢失所有图像)。 另外,请务必在运行导入之前备份数据库以防万一出现问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接