Reindex singolo prodotto


10

Vorrei reindicizzare un singolo prodotto dopo un aggiornamento.

Adesso uso:

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

Ma questo non funziona, qualche idea?

PS: $product->getId()è esistente e corretto.

Risposte:


10

Funziona bene con Magento CE 1.6 e versioni successive:

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

I codici dell'indicizzatore disponibili possono essere visualizzati utilizzando la query:

SELECT indexer_code FROM index_process;

In un Magento 1.7 nativo ci sono:

+---------------------------+
| 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 è diverso, l'indicizzatore rileva automaticamente le entità modificate su ogni cron run (ogni minuto).

AGGIORNARE

La risposta sopra è corretta al 100% comunque penso che le informazioni qui sotto possano aggiungere qualcosa di più.

  • Se è necessario modificare solo alcuni valori degli attributi in un prodotto e aggiornare automaticamente la relativa tabella dell'indice, è possibile utilizzare questa funzione: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • se si desidera gestire il reindex per proprio uso invece il modello di risorsa: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Ad esempio, utilizzo la seguente funzione per aggiornare velocemente solo alcuni attributi in un prodotto.

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

Nota:

Se è necessario modificare la stessa coppia di attributi / valori in un gruppo di prodotti, è possibile passare l'intero array diproduct_ids


Copierò qui il commento di user5973, perché verrà eliminato. @Vinai stai dicendo che EE 1.13+ non ha questi problemi di prestazioni quando reindicizzi i dati relativi al prodotto? Dove possiamo confermare che l'indicizzatore EE raccoglie automaticamente le entità modificate ed elabora solo quelle?
Fabian Blechschmidt,

In EE 1.13 l'indicizzatore utilizza i trigger di MySQL per rilevare eventuali modifiche a livello di DB e registrare gli ID entità aggiornati in una tabella dei log delle modifiche. Questi log delle modifiche vengono quindi elaborati tramite cronjobs.
Vinai,

2

Presumo che tu intenda voler reindicizzare un prodotto dopo averlo modificato nell'interfaccia utente. Il metodo più semplice è semplicemente impostare la modalità indicizzatore su "aggiorna al salvataggio". Dovresti farlo per tutti gli indicizzatori relativi ai prodotti che stai utilizzando, probabilmente inclusi: Attributi del prodotto, Prezzi del prodotto, Dati piatti del prodotto, Prodotti della categoria, Stato delle scorte.

Tuttavia, ciò probabilmente rallenterà il risparmio del prodotto.

In alternativa, forse questo link ti aiuterà. Si prega di vedere i commenti e descrivono anche come aggiornare lo stock. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1


2

Assicurati di non farlo sul frontend né sugli script di aggiornamento e che l'archivio attualmente caricato è "admin". Altrimenti, $ product-> save () non funzionerà affatto. Verifica innanzitutto che il salvataggio di un prodotto abbia effetto.


2

Oltre alla risposta di @ feversocial, assicurati anche di avere tutto il necessario per essere caricato sul prodotto prima di chiamare $ product-> save (). Altrimenti il ​​risparmio può effettivamente rimuovere le cose dal prodotto che ho sperimentato nel modo più duro.

Come salvare il prodotto senza SKU, il che quindi interrompe la riscrittura di tutti gli URL e fa reindirizzare l'intero sito a questa pagina del prodotto: S: P


Bene, ecco perché penso sia meglio usare l' catolog/product_actionapproccio in modo da non rischiare il problema di cui sopra
Fra

1

Queste informazioni possono essere utili per comprendere un po 'meglio l'intero scenario.

  • Se è necessario modificare solo un valore di attributo e aggiornare automaticamente la relativa tabella dell'indice, è possibile utilizzare questa funzione: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • se si desidera gestire il reindex per proprio uso invece il modello di risorsa: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Ad esempio, utilizzo la seguente funzione per aggiornare velocemente solo alcuni attributi in un prodotto.

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);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.