Magento 产品必须从 php 中的 'admin' 中删除。您必须声明要从安全区域中删除。在外部脚本中,您通常会使用 Mage::app('admin'); 但是您可以像我在下面那样声明“isSecureArea”。
此外,捕获 Mage_Core_Exception 以查看问题可能是什么。
try {
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('sku')->addStoreFilter($store_id);
$collection->load();
// collection is not empty I checked
foreach ($collection as $product) {
try {
// Register a secure area to simulate 'admin'
Mage::register('isSecureArea', true);
$product->delete(); // this is the line where it hangs
Mage::unregister('isSecureArea');
print $product->getSku() . " deleted" . PHP_EOL;
} catch (Exception $e) {
print $e;
}
}
} catch (Mage_Core_Exception $e) {
echo( $e->getMessage() );
}
编辑:快速谷歌搜索导致另一个解决方案。
http://www.fortwaynewebdevelopment.com/magento-delete-products-programmatically/
这个看起来应该位于您的 magento 根目录中的文件中。它会删除所有产品,所以要小心,但它的处理方式不同。它不使用集合,而是通过首先解析产品 id 来加载每个产品对象,然后再解析它们。我考虑过先提出这个建议,但收集模型始终是“magento 方式”,并且是一个很好的第一次尝试!
我注意到有时作为集合一部分的对象与加载的对象模型有点不同。Magento 就是这样有点古怪。希望这可能会有所帮助。
<?php
function deleteAllProducts()
{
require_once 'app/Mage.php';
Mage :: app("default") -> setCurrentStore( Mage_Core_Model_App :: ADMIN_STORE_ID );
$products = Mage :: getResourceModel('catalog/product_collection')->setStoreId(1)->getAllIds();
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 />";
}
}
}
}
deleteAllProducts();
?>