Magmi Datapump API - 商品未显示在商店中
Posted
技术标签:
【中文标题】Magmi Datapump API - 商品未显示在商店中【英文标题】:Magmi Datapump API - Item not showing in store 【发布时间】:2017-02-27 18:28:59 【问题描述】:当我使用 Magmi Datapump API 添加产品时,该产品显示在“管理产品”页面中,但该产品在商店中不可见。
我在“管理产品”页面中打开产品进行编辑,然后点击保存,产品就会出现在商店中。当我手动保存产品时,Magento 是否在后端做一些事情?
另外,当我手动保存产品时,我会收到以下消息:
The export profile-product relations has been updated.
此消息以前不存在。
【问题讨论】:
我投票结束这个问题,因为 Stack Overflow 是一个programming-related 问答网站。您的问题与编程无关。也许你应该把它发到magento.stackexchange.com 上? 【参考方案1】:您没有提到您正在使用的 Magento 版本,但我假设它在 1.8/1.9 CE 或更高版本附近。
什么是 Magmi?
Magmi 是一个第三方包/实用程序,可让您将数据直接导入 Magento。它读取 Magento 配置(模型的表名、结构、类型等)并使用它直接写入 mysql 数据库。
这样做的目的是绕过 Magento ORM 层 - 这在某些情况下提供了好处,主要是速度。缺点是除非你这样做是因为你确切地知道你为什么这样做以及它的缺点是什么,否则你会错过 Magento 的 ORM 发生的事情——尤其是事件观察器和写前/写后回调。
当您保存产品时
默认情况下,在 Magento 中,当您在管理界面中保存产品时,它将通过 ORM 通过 $model->save()
操作直接写入数据库。
此过程通过关联(通过 _afterSave
或事件观察者)执行以下两项操作之一(如果您启用了平面产品表,我假设您这样做):
根据您的 Magento 版本,产品平面索引的默认设置在这里很重要。我相信 1.9 默认引入了调度它们,而旧版本默认会同步运行它们。
企业版:如果您运行的是企业版,MySQL 表触发器实际上应该自动检测这些产品记录更改,并通过更改日志表 (*_cl
) 安排重新索引。对于这个问题,我假设您使用的是社区版。
你错过了什么
回到 Magmi - 它直接写入数据库表,因此跳过了 ORM 层,其中包括用于重新索引的命令。
当您在产品的 Magento 管理员中按保存时(并且您说这会使您的更改生效)会自动为该产品执行索引 - 同步。此行为表明您的产品平面索引设置为“保存时”而不是“按计划”运行。这就是为什么您在管理员中再次保存产品后在前端看到产品的原因,纯粹是因为 Magento ORM 触发了该产品的重新索引,将其插入产品平面表(例如catalog_product_flat_1
)。如果您知道,这些表是 Magento 前端在您启用平面表时读取的表 - 这是为了避免 EAV 模型结构的复杂性和许多连接(和配置查找/处理)所需的从产品(和其他)模型中读取。扁平表(索引)在长但单行中包含所需的一切。
你需要做什么
所以 - 说了这么多 - 我们可以假设您的产品平面索引设置为在保存时运行。
我的主要建议是将其更改为“按计划”运行。您可以通过系统 -> 索引管理从 Magento 管理面板执行此操作。
从这里你需要enable the Magento system cron。
如果您的 CE(社区版)版本具有更新变更日志表的 MySQL 表触发器,这将起作用。 You can check for this.
如果没有,您需要手动触发重新索引。根据您调用 Magmi 的方式,您可以选择以下两种方式之一:
Magmi 通过命令行
在您运行 Magmi 导入命令后触发命令行启动的产品相关数据重新索引:
php indexer.php --reindex catalog_product_price,catalog_url,catalog_product_flat
通过 PHP 的 Magmi
如果您从不是从命令行触发的第三方集成脚本运行 Magmi,或者您不想在之后添加像上面那样的 CLI 命令(同样,您没有提及这些细节),您可以在 Magmi 数据泵调用的末尾添加一个重新索引 PHP 脚本:
foreach (...)
$datapump->ingest($data);
$datapump->endImportSession();
// reindex now!
foreach (['catalog_product_price', 'catalog_url', 'catalog_product_flat'] as $indexCode)
$process = Mage::getModel('index/indexer')->getProcessByCode($indexCode);
$process->reindexAll();
TL;DR
确保您在使用 Magmi 导入产品数据后重新编制索引,因为它会跳过通常会为您解决此问题的 Magento ORM。
【讨论】:
感谢您的帮助。两种解决方案都有效。我将在我的脚本中使用 PHP 代码来自动触发索引器。再次感谢你。以及一个很好解释的答案。以上是关于Magmi Datapump API - 商品未显示在商店中的主要内容,如果未能解决你的问题,请参考以下文章