重新索引单个产品


10

我想在更新后为单个产品重新编制索引。

现在我使用:

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'foobar');
// edit something
$product->save();

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItem->setForceReindexRequired(true);

Mage::getSingleton('index/indexer')->processEntityAction(
    $stockItem,
    Mage_CatalogInventory_Model_Stock_Item::ENTITY,
    Mage_Index_Model_Event::TYPE_SAVE
);

$product
    ->setForceReindexRequired(true)
    ->setIsChangedCategories(true);

Mage::getSingleton('index/indexer')->processEntityAction(
    $product,
    Mage_Catalog_Model_Product::ENTITY,
    Mage_Index_Model_Event::TYPE_SAVE
);

但这行不通,有什么主意吗?

PS: $product->getId()存在并且正确。

Answers:


10

在Magento CE 1.6和更高版本中,这可以正常工作:

$event = Mage::getSingleton('index/indexer')->logEvent(
    $product,
    $product->getResource()->getType(),
    Mage_Index_Model_Event::TYPE_SAVE,
    false
);
Mage::getSingleton('index/indexer')
    ->getProcessByCode('catalog_url') // Adjust the indexer process code as needed
    ->setMode(Mage_Index_Model_Process::MODE_REAL_TIME)
    ->processEvent($event);

可以使用查询查看可用的索引器代码:

SELECT indexer_code FROM index_process;

在原生的Magento 1.7中有:

+---------------------------+
| indexer_code              |
+---------------------------+
| cataloginventory_stock    |
| catalogsearch_fulltext    |
| catalog_category_flat     |
| catalog_category_product  |
| catalog_product_attribute |
| catalog_product_flat      |
| catalog_product_price     |
| catalog_url               |
| groupscatalog2_category   |
| groupscatalog2_product    |
| tag_summary               |
+---------------------------+

在Magento EE 1.13中,情况有所不同,索引器会在每次cron运行时(每分钟)自动选择更改的实体。

更新

无论如何,以上答案是100%正确的,我认为以下信息可以添加更多内容。

  • 如果您只需要更改产品中的几个属性值并自动更新相对索引表,则可以使用此功能: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • 如果要自己管理重新索引,请使用资源模型: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

例如,我使用以下功能仅快速更新产品中的某些属性。

 public function updateProductAttribute($product_id, $arrayChanges, $reindex = true)
{
    if (!is_array($product_id)) {
        $product_id = array($product_id);
    }

    // ths should trigger all required reindex
    $update = Mage::getSingleton('catalog/product_action');
    // Update value
    if (!$reindex) {
        $update = Mage::getResourceSingleton('catalog/product_action');
    }

    $update->updateAttributes($product_id, $arrayChanges, 0);
}

注意:

如果您需要更改一组产品中相同的属性/值对,则可以传递整个数组product_ids


我将在此处复制user5973的评论,因为它将被删除。@Vinai您是说EE 1.13+在为产品相关数据重新编制索引时没有此性能问题吗?我们在哪里可以确认EE索引器会自动选择更改的实体并仅处理那些实体?
Fabian Blechschmidt

在EE 1.13中,索引器使用MySQL触发器来获取数据库级别的所有更改,并将更新的实体ID记录在变更日志表中。然后,通过cronjobs处理这些变更日志。
维奈2014年

2

我认为您的意思是您要在管理ui中编辑产品后重新为其编制索引。最简单的方法是将索引器模式设置为“保存时更新”。您将必须对与您使用的产品相关的所有索引器执行此操作,其中可能包括:产品属性,产品价格,产品单位数据,类别产品,库存状态。

但是,这可能会减慢产品节省的速度。

另外,也许此链接会有所帮助。请查看评论以及描述如何更新库存的信息。 http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1


2

确保您不在前端或升级脚本上执行此操作,并且当前加载的存储为“ admin”。否则,$ product-> save()将根本无法工作。首先检查,保存产品是否有效。


2

除了@feversocial的答案外,还要确保在调用$ product-> save()之前,您具有要加载到产品上的所有内容。否则,节省下来的东西实际上可以从我经历过的艰难过程中删除产品。

就像保存没有SKU的产品一样,这会中断所有url重写,并使整个站点重定向到此产品页面:S:P


好点的,这就是为什么我认为是更好的使用catolog/product_action方法,所以你不要冒险上述问题
弗拉

1

这些信息有助于更好地了解整个场景。

  • 如果仅需要更改属性值并自动更新相对索引表,则可以使用此功能: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • 如果要自己管理重新索引,请使用资源模型: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

例如,我使用以下功能仅快速更新产品中的某些属性。

public function updateProductAttribute($product_id, $arrayChanges, $reindex = true)
{
    if (!is_array($product_id)) {
        $product_id = array($product_id);
    }

    // ths should trigger all required reindex
    $update = Mage::getSingleton('catalog/product_action');
    // Update value
    if (!$reindex) {
        $update = Mage::getResourceSingleton('catalog/product_action');
    }

    $update->updateAttributes($product_id, $arrayChanges, 0);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.