2

我正在尝试从目录中删除产品。

每当我尝试使用管理界面(批量或单一操作)删除产品时,它都会向我抛出500 internal server error。每当我尝试使用脚本(以编程方式)删除产品时,它都会挂在 delete 方法调用上

即使打开了日志记录,也不会显示错误输出,不会抛出异常并且日志是静默的。

这是我在脚本中使用的示例代码:

//...
$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 {
        $product->delete(); // this is the line where it hangs
        print $product->getSku() . " deleted" . PHP_EOL;
    } catch (Exception $e) {
        print $e->getMessage();
    }
}

有没有人有过这样的经历,可能是什么原因?

据我所知,它是 Magento Enterprise 1.11,它对应于 Magento Community 1.6。

4

3 回答 3

5

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();
?> 
于 2013-01-12T05:32:08.720 回答
0

我们找到了解决此问题的方法,可以帮助遇到此问题的任何人完成任务。

导出您要删除的所有产品,然后使用“删除实体”操作导入它们。

从管理员界面或自定义脚本中删除产品的问题仍然存在,我将继续对此进行调查,并将相应地更新答案。

于 2013-01-14T10:52:52.997 回答
0

要按产品 SKU 删除产品,请使用以下代码:

<?php
//...
$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 {

        $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $product->getSku());

        $product->delete();
        echo $product->getSku() . " deleted" . PHP_EOL;

    } catch (Exception $e) {
        echo $e->getMessage();
    }
}
于 2017-01-05T05:56:42.583 回答