単一の製品のインデックスを再作成する


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()存在し、正しいです。

回答:


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 2014

EE 1.13では、インデクサーはMySQLトリガーを使用して、DBレベルでの変更を取得し、更新されたエンティティ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アプローチを使用する方が良いと思う理由です。それで、あなたは上記の問題を危険にさらすことはありません
Fra

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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.