これは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