Answers:
最快的方法是直接运行此查询。
DELETE FROM `catalog_product_entity` WHERE `sku` IN ('SKU1', 'SKU2', ...., 'SKU1000');
一切都应该很好地级联。属性值将被删除,类别关系将被删除,追加销售,交叉销售及相关等等。
[编辑]
有一个陷阱。感谢STW发现这一点。评论和评分将仍然是孤儿,因为他们的产品表没有外键。
->delete()
但是会躲避任何侦听事件的代码。Magento库存中的商品,似乎评论和评分将被孤立(当与它们相关的产品被删除时,它们不会被删除)。
catalog_product_entity_*
表在该entity_id
字段上都有一个FK catalog_product_entity.entity_id
。他们应该很好地级联。
充分尊重Marius,但如果可以避免的话,请不要直接与数据库进行交互。如果您的Magento版本和所有扩展在所有正确的地方都没有错误,则可能会自动更新相关表。但是,如果不是这样的话,这种事情可能会破坏您的网站。
相反,您可以使用Magento自己的CSV导入功能。
只需在文件中列出您的SKU,简单如下:
sku
ABC1
ABC2
ABC3
...等等。然后另存为CSV文件。
然后,在系统>导入/导出>导入中,选择实体类型:产品和导入行为:删除实体,然后导入此文件。就是这样!
Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts()
)
您可以通过编程方式进行。创建一个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";
无代码方式
在管理部分下Manage Products
,将找到包含所有产品的表格。有一个名为的列SKU
。您可以在此处根据价值过滤产品。
然后,按SKU进行过滤后,您可以使用左侧的复选框选择要删除的所有项目。
请注意select all
,它将选择整个网格中的所有项目,select visible
而将仅选择网格当前页面上的项目。
选择了所需的项目后,您可以使用网格右上方的总体操作按钮并选择删除选项。
这将提示您确定要删除这些项目。在此弹出窗口中选择是后,它将继续删除您的项目。根据您的索引设置,在此过程之后,您可能必须运行重新索引。
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 />";
}
}
}
注意: 我建议您在运行此代码之前必须先进行备份。希望对您有所帮助。
因为列表表
是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);