Magmi Datapump API - 商品未在商店中展示

Magmi Datapump API - Item not showing in store

当我使用 Magmi Datapump 添加产品时 API,该产品显示在“管理产品”页面中,但在商店中看不到该产品。

我在“管理产品”页面中打开产品进行编辑,然后点击“保存”,产品就会出现在商店中。当我手动保存产品时,Magento 是否在后端做一些事情?

此外,当我手动保存产品时,我收到此消息:

The export profile-product relations has been updated.

这条消息以前没有。

您没有提到您使用的 Magento 版本,但我假设它是在 1.8/1.9 CE 或更高版本附近。

什么是玛格米?

Magmi 是第三方 package/utility,可让您将数据直接导入 Magento。它读取 Magento 配置(模型的 table 名称、结构、类型等)并使用它直接写入 MySQL 数据库。

这样做的目的是绕过 Magento ORM 层——这在某些情况下提供了好处,主要是速度。缺点是除非你这样做是因为你确切地知道你为什么这样做以及它已经存在的缺点,否则你会错过 Magento 的 ORM 发生的事情 - 特别是事件观察者和 pre/post 写回调。

当您保存产品时

默认情况下,当您在管理界面中保存产品时,在 Magento 中,它将通过 $model->save() 操作通过 ORM 直接写入数据库。

这个过程通过关联(通过_afterSave或事件观察者)做两件事之一(如果你启用了平面产品tables,这我假设你这样做):

  • 重新索引产品平 tables synchronously/in 相同的请求过程
  • 安排通过 cron
  • 执行的产品平 tables 重建索引

根据您的 Magento 版本,产品平面索引的默认设置在这里很重要。我相信 1.9 引入了默认安排它们,而旧版本默认会 运行 它们同步。

企业版:如果您使用的是运行企业版,MySQLtable触发器应该实际检测到这些产品记录更改无论如何自动,并通过更新日志安排重建索引 tables (*_cl)。对于这个问题,我假设您使用的是社区版。

你错过了什么

回到 Magmi - 它直接写入数据库 tables,因此跳过 ORM 层,其中包括重建索引的命令。

当您在产品的 Magento 管理员中按“保存”时(并且您说这会使您的更改生效)索引会自动为此产品执行 - 同步。此行为表明您的产品平面索引设置为 运行 "on save" 而不是 "on schedule"。这就是为什么您在管理员中再次保存产品后会在前端看到该产品的原因,这纯粹是因为 Magento ORM 触发了该产品的重新索引,将其插入产品平面 table(例如 catalog_product_flat_1)。如果您知道,这些 tables 是当您启用平坦 tables 时 Magento 的前端读取的 tables - 这是为了避免 EAV 模型结构的复杂性以及从产品(和其他)模型中读取所需的许多连接(和配置 lookup/processing)。平面 tables(索引)在长但单行中拥有他们需要的一切。

你需要做什么

因此 - 综上所述 - 我们可以假设您的产品平面索引在保存时设置为 运行。

我主要建议您将其更改为 运行 "on schedule"。您可以通过系统 -> 索引管理从 Magento 管理面板执行此操作。

从这里你需要enable the Magento system cron

如果您的 CE(社区版)版本具有更新更新日志 table 的 MySQL table 触发器,这将起作用。 You can check for this.

如果没有,您将需要手动触发重建索引。根据您调用 Magmi 的方式,您可以选择以下两种方式之一:

Magmi 通过命令行

在您 运行 Magmi 导入命令后触发命令行启动产品相关数据的重新索引:

php indexer.php --reindex catalog_product_price,catalog_url,catalog_product_flat

玛格米来自PHP

如果您运行从不是从命令行触发的第三方集成脚本中安装 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。