删除Magento中的多个产品


12

是否可以通过SKU过滤删除多个产品?我大约有1000种产品要删除。

Answers:


17

最快的方法是直接运行此查询。

DELETE FROM `catalog_product_entity` WHERE `sku` IN ('SKU1', 'SKU2', ...., 'SKU1000');

一切都应该很好地级联。属性值将被删除,类别关系将被删除,追加销售,交叉销售及相关等等。

[编辑]
有一个陷阱。感谢STW发现这一点。评论和评分将仍然是孤儿,因为他们的产品表没有外键。


5
不要忘了在此之后重新索引(如果您使用的是扁平产品目录)
Vladimir Kerkhoff 2014年

2
基本上,这是在使用Admin Import / Export工具执行批量删除时所执行的操作。与调用相比,它非常快,->delete()但是会躲避任何侦听事件的代码。Magento库存中的商品,似乎评论和评分将被孤立(当与它们相关的产品被删除时,它们不会被删除)。
STW 2015年

@STW。不错的收获。我完全忘记了评论和评分。
马吕斯

我不确定这是个好主意。保存在eav表中的属性数据呢?那些也删除了吗?
Anurag Patbandha

@AnuragPatbandha。所有catalog_product_entity_*表在该entity_id字段上都有一个FK catalog_product_entity.entity_id。他们应该很好地级联。
马里乌斯

15

充分尊重Marius,但如果可以避免的话,请不要直接与数据库进行交互。如果您的Magento版本和所有扩展在所有正确的地方都没有错误,则可能会自动更新相关表。但是,如果不是这样的话,这种事情可能会破坏您的网站。

相反,您可以使用Magento自己的CSV导入功能。

只需在文件中列出您的SKU,简单如下:

sku
ABC1
ABC2
ABC3

...等等。然后另存为CSV文件。

然后,在系统>导入/导出>导入中,选择实体类型:产品和导入行为:删除实体,然后导入此文件。就是这样!


2
仅供参考-通常,我同意避免直接的数据库交互是最好的;但是,这实际上是Magento通过管理员导入工具删除产品的方式(请参阅Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts()
STW 2015年

假设我要从所选商店删除产品,我的CSV格式是什么。
zus

如果您只想从选定的商店取消分配产品,而不是从数据库中删除它们,则可以尝试使用两列CSV导入:sku和store,请确保store列仅包含要将产品分配到的那些商店ID。 ,选择导入行为:更新并导入。我尚未对此进行测试,因此请谨慎操作!(如果我有时间,我会稍后进行测试并添加其他评论)
Doug McLean

6

您可以通过编程方式进行。创建一个skustodelete.csv,列出要删除的所有skus,之后是继续进行代码的代码

    require_once 'app/Mage.php';
    Mage :: app("default")->setCurrentStore(Mage_Core_Model_App :: ADMIN_STORE_ID);
    $skuAll = array();
    $file_handle = fopen("skustodelete.csv", "r");
    $catalog = Mage::getModel('catalog/product');
   while (!feof($file_handle)) {
     $line_of_text = fgetcsv($file_handle, 1024);
     $allSku = $line_of_text[0];
     $product = $catalog->loadByAttribute('sku', $allSku);
     try {
          $product->delete();
          echo "Product with ID: " . $product->getId() . " Deleted Successfully". PHP_EOL;
     } catch (Exception $e) {
          echo "Product with ID: " . $product->getId() . "cannot be deleted" . PHP_EOL;
     }
}
echo "Finish Delete";

3

无代码方式

在管理部分下Manage Products,将找到包含所有产品的表格。有一个名为的列SKU。您可以在此处根据价值过滤产品。

sku过滤器

然后,按SKU进行过滤后,您可以使用左侧的复选框选择要删除的所有项目。

多选

请注意select all,它将选择整个网格中的所有项目,select visible而将仅选择网格当前页面上的项目。

选择了所需的项目后,您可以使用网格右上方的总体操作按钮并选择删除选项。

删除群众行动

这将提示您确定要删除这些项目。在此弹出窗口中选择是后,它将继续删除您的项目。根据您的索引设置,在此过程之后,您可能必须运行重新索引。


2
“全选”工作效率惊人。意外地在没有任何搜索约束的情况下选择它会真正删除产品目录中的所有内容,并且一旦启动,在删除过程中杀死服务器或内存不足是唯一阻止它的事情。
Fiasco Labs

3

Kevin S,您可以通过csv文件删除产品。只需跟随滚滚脚步

第1步 :

创建一个csv文件,然后越过要从系统中删除的skus。命名为skus.csv

第2步 :

在根目录中创建并替换一个php文件。然后通过下面的代码

require_once '../app/Mage.php';
Mage :: app("default") -> setCurrentStore( Mage_Core_Model_App :: ADMIN_STORE_ID );
$skuAll =array();
$file_handle = fopen("skus.csv", "r");
 while (!feof($file_handle) ) {
    $line_of_text = fgetcsv($file_handle, 1024);
$allSku = $line_of_text[0];

}
$products = Mage::getResourceModel('catalog/product_collection')
    ->addAttributeToSelect('*') 
    ->addAttributeToFilter(
        'sku', array('in' => $allSku)
    )
    ->load();

    if(is_array($products))
    {
        foreach ($products as $key => $pId)
        {
            try
            {
                $product = Mage::getModel('catalog/product')->load($pId)->delete();
                echo "successfully deleted product with ID: ". $pId ."<br />";
            } 
            catch (Exception $e) 
            {
                echo "Could not delete product with ID: ". $pId ."<br />";
            }
        }
    }

注意: 我建议您在运行此代码之前必须先进行备份。希望对您有所帮助。


0

因为列表表

  • catalog_product_entity_varchar,
  • catalog_product_entity_tier_price,
  • catalog_product_entity_media_gallery,
  • catalog_product_entity_media_gallery_value,
  • catalog_product_entity_text,
  • catalog_product_entity_group_price,
  • catalog_product_entity_datetime,
  • catalog_product_entity_decimal,
  • catalog_product_entity_int
  • catalog_category_product
  • catalog_product_link

是catalog_product_entity的外键。

因此,当删除catalog_product_entity中的记录时,上述表的某些记录也将被删除。

代码(实现Marius的答案)删除所有具有entity_id <= 18069的产品:

$adapter = $setup->getConnection("catalog_write");

$where = array(
    'entity_id <= ?' => '18069'
);

$tableCatalogProduct = Mage::getModel("catalog/product")->getResource()->getEntityTable();
$adapter->delete($tableCatalogProduct, $where);


$tableRating = Mage::getModel("rating/rating")->getResource()->getMainTable();
$adapter->delete($tableRating,  $where);

$tableRating = Mage::getModel("review/review")->getResource()->getMainTable();
$adapter->delete($tableRating, $where);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.