Pojedynczy produkt Reindex

10

Chciałbym ponownie indeksować pojedynczy produkt po aktualizacji.

Teraz używam:

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

Ale to nie działa, jakieś pomysły?

PS: $product->getId()istnieje i jest poprawny.

Bob van Luijt
źródło

Odpowiedzi:

11

Działa to dobrze w Magento CE 1.6 i nowszych:

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

Dostępne kody indeksatora można wyświetlić za pomocą zapytania:

SELECT indexer_code FROM index_process;

W natywnym Magento 1.7 są:

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

W Magento EE 1.13 jest inaczej, tam indeksator automatycznie pobiera zmienione jednostki przy każdym uruchomieniu crona (co minutę).

AKTUALIZACJA

Powyższa odpowiedź jest w 100% poprawna i tak myślę, że poniższe informacje mogą dodać coś więcej.

  • Jeśli chcesz zmienić tylko kilka wartości atrybutów w produkcie i automatycznie zaktualizować tabelę indeksu względnego, możesz użyć tej funkcji: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • jeśli chcesz samodzielnie zarządzać reindexem, skorzystaj z modelu zasobów: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Na przykład używam następującej funkcji do szybkiej aktualizacji tylko niektórych atrybutów w produkcie.

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

Uwaga:

Jeśli musisz zmienić tę samą parę atrybut / wartości w grupie produktów, możesz przekazać całą tablicęproduct_ids

Vinai
źródło
Skopiuję komentarz user5973 tutaj, ponieważ zostanie usunięty. @Vinai, czy mówisz, że EE 1.13+ nie ma tych problemów z wydajnością podczas ponownego indeksowania danych związanych z produktem? Gdzie możemy potwierdzić, że indeksator EE automatycznie przejmuje zmienione jednostki i przetwarza tylko te?
Fabian Blechschmidt
W EE 1.13 indeksator używa wyzwalaczy MySQL, aby wychwycić wszelkie zmiany na poziomie bazy danych i zapisać zaktualizowane identyfikatory encji w tabeli dzienników zmian. Te dzienniki zmian są następnie przetwarzane przez cronjobs.
Vinai
2

Zakładam, że masz na myśli, że chcesz ponownie zindeksować produkt po edycji w interfejsie administratora. Najłatwiejszą metodą jest ustawienie trybu indeksatora na „aktualizuj przy zapisie”. Musisz to zrobić dla wszystkich indeksatorów powiązanych z produktami, których używasz, prawdopodobnie w tym: atrybuty produktu, ceny produktu, dane produktu płaskiego, kategoria produktów, stan magazynowy.

Prawdopodobnie spowolni to oszczędzanie produktu.

Alternatywnie może ten link pomoże. Zobacz komentarze, a także opisują, jak zaktualizować akcje. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1

runamok
źródło
2

Upewnij się, że nie robisz tego na frontonie ani nie aktualizujesz skryptów, a aktualnie załadowanym sklepem jest „admin”. W przeciwnym razie $ product-> save () w ogóle nie będzie działać. Najpierw sprawdź, czy zapisanie produktu ma skutek.

gorączka
źródło
2

Oprócz odpowiedzi @ feversocial upewnij się, że masz wszystko, co jest potrzebne do załadowania produktu przed wywołaniem $ product-> save (). W przeciwnym razie oszczędzanie może faktycznie usunąć rzeczy z produktu, którego doświadczyłem na własnej skórze.

Podobnie jak zapisanie produktu bez kodu SKU, który następnie przerywa wszystkie przepisywanie adresów URL i powoduje przekierowanie całej witryny na tę stronę produktu: S: P

OZZIE
źródło
Dobra uwaga, dlatego myślę, że lepiej jest zastosować catolog/product_actionpodejście, aby nie ryzykować powyższego problemu
Fra
1

I te informacje mogą być przydatne do lepszego zrozumienia całego scenariusza.

  • Jeśli chcesz zmienić tylko wartość atrybutu i automatycznie zaktualizować względną tabelę indeksu, możesz użyć tej funkcji: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • jeśli chcesz samodzielnie zarządzać reindexem, skorzystaj z modelu zasobów: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Na przykład używam następującej funkcji do szybkiej aktualizacji tylko niektórych atrybutów w produkcie.

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
źródło