以编程方式更新 Magento 中的产品价格 - 为 foreach() 提供的参数无效


Programatically update product price in Magento - Invalid argument supplied for foreach()

我正在尝试在自定义模块中以编程方式更新产品的价格。这是我的代码:

Mage::setIsDeveloperMode(true); // for debug only
try
{
    $product = Mage::getModel('catalog/product')->load($productId);
    $product->setPrice($newPrice);
    $product->save();
}
catch (Exception $ex)
{
    echo "Error: ". $ex->getMessage();
}

执行此代码时,我收到以下异常:

警告:为 foreach() 提供的参数无效 /home/www-data/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php 在1180行

system.log文件中,我看到这些条目的分配:

2016-03-17T18:01:06+00:00 ERR (3):警告:提供的参数无效 对于 foreach() 在 /home/www-data/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php 在第 1180 行 2016-03-17T18:01:06+00:00 ERR (3):可恢复错误: 参数 3 传递给 Mage_Catalog_Model_Resource_Abstract::_canUpdateAttribute() 必须为 给定的数组类型,在 /home/www-data/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php 在第 1225 行上并在 /home/www-data/public_html/app/code/core/Mage/Catalog/Model/Resource/Abstract.php 在线 543 2016-03-17T18:01:06+00:00 ERR (3):可恢复错误: 参数 3 传递给 Mage_Eav_Model_Entity_Abstract::_canUpdateAttribute() 必须属于 数组类型,给定空值,调用 /home/www-data/public_html/app/code/core/Mage/Catalog/Model/Resource/Abstract.php 在第 545 行并在 /home/www-data/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php 在线 1254 2016-03-17T18:01:06+00:00 ERR (3): 警告: array_key_exists() 期望参数 2 是数组,空值在 /home/www-data/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php 在 1256 行

知道是什么原因造成的吗?我的开发 magento 设置上的相同代码有效,但在生产洋红色中,此错误开始出现,所以我有点困惑。

您可以尝试设置存储:

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

$storeId='store_id';
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$productIds = array('products_ids');
$products = Mage::getModel('catalog/product')->getCollection();
$products->addStoreFilter();
$products->addAttributeToSelect('*');
$products->addAttributeToFilter('entity_id', array('in' => $productIds));
foreach($products as $product)
{
    $price=$product->setPrice('price');
    Mage::app()->setCurrentStore($storeId);
    $product->save(); 
}

试试这段代码,它对我有用。

尝试下面的代码。需要传递存储 ID。这似乎是问题所在。

$array_product = array($productId);
Mage::getSingleton('catalog/product_action')->updateAttributes($array_product, array('price' => $newPrice), $storeId);

如果您以编程方式更新产品,请记下,然后尽量避免 magento 保存功能,该功能非常适合单个产品,但是当您使用大量产品时,会使您的网站变慢。请使用我下面的代码,然后通过SSH使用rendex magento。它会为你工作正常。

$write = Mage::getSingleton('core/resource')->getConnection('core_write');

$write->query("
                      UPDATE catalog_product_entity_decimal val
                      SET  val.value = (".$productPrice['Price'].")
                      WHERE  val.attribute_id = (
                         SELECT attribute_id FROM eav_attribute eav
                         WHERE eav.entity_type_id = 4 
                           AND eav.attribute_code = 'price'
                        )
                        AND val.entity_id = '".$product->getId()."'
                    ");