如何防止Magento在以编程方式更新产品时覆盖来自其他网站/商店的属性值


How to prevent Magento to overwrite attribute values from another Website / Store while updating products programmatically

我已经实现了自定义Magento模块,该模块循环来自外部服务的数据,并在Magento多语言,多商店网站中更新价格,重量,名称和一些其他产品属性。

我的解决方案非常简单(在 Cron 每天调用的模型中),如下所示:

/* THIS IS CODE SNIPPET INSIDE FOREACH LOOP */
$storeId = (string)$jobConfig->store; //cron for each store
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$extistingProduct = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);
$extistingProduct->setPrice($newPrice); //update price
//some code here dealing with Associated products of Configurable product probably not relevant
//...
$extistingProduct->setCanSaveConfigurableAttributes(true);
$extistingProduct->setCanSaveCustomOptions(true);
$extistingProduct->setConfigurableAttributesData($configurableAttributesData);
// This tells Magento to associate the given simple products to this configurable product..
$extistingProduct->setConfigurableProductsData($configurableProductsData);
$extistingProduct->setStoreId($storeId);
$extistingProduct->save();

我每天都在 cron 中运行这个,分别为每个商店运行。它通常可以正常工作,只更改每个商店每种产品的价格,但有时会发生奇怪的事情(例如每 2 个月一次) - 除了价格之外的所有其他属性都会从商店 X 覆盖到当前商店$storeId。这意味着我的所有英文产品描述对于所有受影响的产品都变为德语(例如)。

我不知道这是怎么发生的,因为每次调试它都能正常工作,只更改我明确设置的当前范围内的价格,但保留所有其他产品属性不变。似乎它从商店X加载所有产品数据,设置价格,然后存储所有要存储的值,这些值是在通过调用$extistingProduct->setStoreId($storeId)保存产品之前设置的

发生这种情况时,所有属性都会从同一商店被覆盖(例如,所有英语文本都变为德语,但在其他情况下,所有文本都将变为西班牙语 - 它们都来自一个随机商店)。

有没有人知道这怎么可能发生?我做错了什么?

是的,整个"逻辑"在Magento中非常讨厌。以下是您需要了解的内容:

当您加载产品时,您加载当前设置为范围的内容,在您的情况下是默认的管理员范围。因此,您正在做的是从管理范围加载并将其保存到店面中。因此,如果发生"随机"语言更改,请检查该产品的默认值是什么,您可能会感到惊讶。

我的建议:

  1. 确保将每个产品加载到要存储它的同一范围内,因此在加载之前设置范围
  2. 请记住,每次存储产品时都会覆盖网站/全局属性
  3. 尽量避免使用内置的加载/保存方法,而是使用其他直接写入属性的方法,并且仅用于所需的范围

我们有一个广泛的自定义产品导入/更新机制,为了使所有内容都与加载/保存一起使用,我们首先更改并保存全局值,然后为每个店面更改店面特定值加载/保存。

我每天都做和你一样的行为,我用 L. Palaiokostas 提到的 magmi 实现了一个 cron。它运行良好,我每天像这样同步 200k 产品。我所做的是制作一个临时表,在那里我收集所有外部数据,并使用magmi执行我的请求,将洋红色的数据与我的临时表进行比较。这给了我一个由magmi自动更新或创建的增量。

一开始我持怀疑态度,并为此花了几个星期,但它从一年来一直没有麻烦!

希望这会有所帮助。

我遇到了类似的问题,我找不到使用Magento的本机功能的方法。我最终使用Magmi(更具体地说是Magmi的API)来正确创建/更新我的产品。

附言我知道这不是"Magento's Way",但这是我花了很多时间研究后发现的唯一方法。所以我把它作为替代解决方案发布。