Einzelprodukt neu indizieren

10

Ich möchte ein einzelnes Produkt nach einem Update neu indizieren.

Jetzt benutze ich:

$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
);

Aber das funktioniert nicht, irgendwelche Ideen?

PS: $product->getId()ist vorhanden und korrekt.

Bob van Luijt
quelle

Antworten:

10

Dies funktioniert gut in Magento CE 1.6 und neuer:

$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);

Die verfügbaren Indexcodes können mithilfe der folgenden Abfrage angezeigt werden:

SELECT indexer_code FROM index_process;

In einem nativen Magento 1.7 gibt es:

+---------------------------+
| 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               |
+---------------------------+

In Magento EE 1.13 ist das anders. Dort nimmt der Indexer bei jedem Cron-Lauf (jede Minute) automatisch geänderte Objekte auf.

AKTUALISIEREN

Die obige Antwort ist sowieso zu 100% richtig. Ich denke, die folgenden Informationen können noch etwas hinzufügen.

  • Wenn Sie nur wenige Attributwerte in einem Produkt ändern und die relative Indextabelle automatisch aktualisieren müssen, können Sie diese Funktion verwenden: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • Wenn Sie den Neuindex selbst verwalten möchten, verwenden Sie stattdessen das Ressourcenmodell: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Zum Beispiel verwende ich die folgende Funktion, um nur bestimmte Attribute in einem Produkt schnell zu aktualisieren.

 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);
}

Hinweis:

Wenn Sie dasselbe Attribut / Werte-Paar in einer Gruppe von Produkten ändern müssen, können Sie das gesamte Array von übergebenproduct_ids

Vinai
quelle
Ich werde den Kommentar von user5973 hier kopieren, da er gelöscht wird. @ Vinai Wollen Sie damit sagen, dass EE 1.13+ diese Leistungsprobleme bei der Neuindizierung produktbezogener Daten nicht aufweist? Wo können wir bestätigen, dass der EE-Indexer geänderte Entitäten automatisch aufnimmt und nur diese verarbeitet?
Fabian Blechschmidt
In EE 1.13 verwendet der Indexer MySQL-Trigger, um Änderungen auf DB-Ebene zu erfassen und die aktualisierten Entitäts-IDs in einer Änderungsprotokolltabelle aufzuzeichnen. Diese Änderungsprotokolle werden dann über Cronjobs verarbeitet.
Vinai
2

Ich nehme an, Sie meinen, Sie möchten ein Produkt neu indizieren, nachdem Sie es in der Administrator-Benutzeroberfläche bearbeitet haben. Die einfachste Methode besteht darin, den Indexermodus auf "Beim Speichern aktualisieren" zu setzen. Sie müssten dies für alle Indexer tun, die sich auf Produkte beziehen, die Sie verwenden, wahrscheinlich einschließlich: Produktattribute, Produktpreise, Produkt-Flat-Daten, Kategorie Produkte, Lagerstatus.

Dies wird jedoch wahrscheinlich die Produktersparnis verlangsamen.

Alternativ hilft vielleicht dieser Link. Bitte beachten Sie die Kommentare sowie die Beschreibung der Aktualisierung des Bestands. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1

Amok laufen
quelle
2

Stellen Sie sicher, dass Sie dies weder im Frontend noch beim Aktualisieren von Skripten tun und der aktuell geladene Speicher "admin" ist. Andernfalls funktioniert $ product-> save () überhaupt nicht. Überprüfen Sie zunächst, ob das Speichern eines Produkts Auswirkungen hat.

fieberhaft
quelle
2

Stellen Sie neben der Antwort von @ feversocial auch sicher, dass Sie alles haben, was zum Laden des Produkts erforderlich ist, bevor Sie $ product-> save () aufrufen. Andernfalls kann das Speichern tatsächlich Dinge aus dem Produkt entfernen, die ich auf die harte Tour erlebt habe.

Als würde man das Produkt ohne SKU speichern, wodurch alle URL-Umschreibungen unterbrochen werden und die gesamte Website auf diese Produktseite umgeleitet wird: S: P.

OZZIE
quelle
Guter Punkt, deshalb denke ich, ist es besser, catolog/product_actionAnsatz zu verwenden , damit Sie das oben genannte Problem nicht riskieren
Fra
1

Diese Informationen können nützlich sein, um das gesamte Szenario ein wenig besser zu verstehen.

  • Wenn Sie nur einen Attributwert ändern und die relative Indextabelle automatisch aktualisieren müssen, können Sie diese Funktion verwenden: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • Wenn Sie den Neuindex selbst verwalten möchten, verwenden Sie stattdessen das Ressourcenmodell: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Zum Beispiel verwende ich die folgende Funktion, um nur bestimmte Attribute in einem Produkt schnell zu aktualisieren.

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);
}
Fra
quelle