Reindex produk tunggal

10

Saya ingin mengindeks ulang satu produk setelah pembaruan.

Sekarang saya menggunakan:

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

Tapi ini tidak berhasil, ada ide?

PS: $product->getId()ada dan benar.

Bob van Luijt
sumber

Jawaban:

10

Ini berfungsi baik di Magento CE 1.6 dan yang lebih baru:

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

Kode pengindeks yang tersedia dapat dilihat menggunakan kueri:

SELECT indexer_code FROM index_process;

Dalam Magento asli 1,7 ada:

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

Dalam Magento EE 1.13 itu berbeda, di sana pengindeks secara otomatis mengambil entitas yang diubah pada setiap cron run (setiap menit).

MEMPERBARUI

Jawaban di atas adalah 100% benar pula saya pikir informasi di bawah ini dapat menambahkan sesuatu yang lebih.

  • Jika Anda perlu mengubah hanya beberapa nilai atribut dalam suatu produk dan secara otomatis memperbarui tabel indeks relatif Anda dapat menggunakan fungsi ini: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • jika Anda ingin mengelola pengindeksan ulang dengan Anda sendiri, gunakan model resourse: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Sebagai contoh, saya menggunakan fungsi berikut untuk memperbarui secara cepat hanya atribut tertentu dalam suatu produk.

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

catatan:

Jika Anda perlu mengubah pasangan atribut / nilai yang sama dalam kelompok produk, Anda dapat melewati seluruh arrayproduct_ids

Vinai
sumber
Saya akan menyalin komentar pengguna5973 di sini, karena itu akan dihapus. @Vinai, apakah Anda mengatakan bahwa EE 1.13+ tidak memiliki masalah kinerja ini saat mengindeks ulang data terkait produk? Di mana kami dapat mengkonfirmasi bahwa pengindeks EE secara otomatis mengambil entitas yang berubah dan hanya memproses entitas yang berubah?
Fabian Blechschmidt
Dalam EE 1.13 pengindeks menggunakan pemicu MySQL untuk mengambil perubahan pada tingkat DB dan mencatat ID entitas yang diperbarui dalam tabel changelog. Changelogs ini kemudian diproses melalui cronjobs.
Vinai
2

Saya kira Anda berarti Anda ingin mengindeks ulang produk setelah Anda mengeditnya di admin ui. Metode termudah adalah dengan hanya mengatur mode pengindeks ke "perbarui menghemat". Anda harus melakukan ini untuk semua pengindeks terkait dengan produk yang Anda gunakan, mungkin termasuk: Atribut Produk, Harga Produk, Data Flat Produk, Kategori Produk, Status Stok.

Ini mungkin akan memperlambat penghematan produk.

Atau mungkin tautan ini akan membantu. Silakan lihat komentar dan juga menjelaskan cara memperbarui stok. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1

runamok
sumber
2

Pastikan Anda tidak melakukan ini di skrip frontend atau memutakhirkan, dan toko yang saat ini dimuat adalah "admin". Kalau tidak, $ product-> save () tidak akan berfungsi sama sekali. Periksa dulu, bahwa menyimpan produk berpengaruh.

feversocial
sumber
2

Selain jawaban @ feversocial juga pastikan Anda memiliki semua yang perlu dimuat pada produk sebelum menelepon $ product-> save (). Kalau tidak, penghematan sebenarnya dapat menghilangkan hal-hal dari produk yang saya alami dengan cara yang sulit.

Seperti menyimpan produk tanpa SKU sama sekali yang kemudian memecah semua url penulisan ulang dan membuat seluruh situs mengalihkan ke halaman produk ini: S: P

OZZIE
sumber
Poin bagus, itu sebabnya saya pikir lebih baik menggunakan catolog/product_actionpendekatan sehingga Anda tidak mengambil risiko masalah di atas
Fra
1

Saya informasi ini dapat bermanfaat untuk memahami keseluruhan skenario sedikit lebih baik.

  • Jika Anda perlu mengubah hanya nilai atribut dan secara otomatis memperbarui tabel indeks relatif Anda dapat menggunakan fungsi ini: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • jika Anda ingin mengelola pengindeksan ulang dengan Anda sendiri, gunakan model resourse: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Sebagai contoh, saya menggunakan fungsi berikut untuk memperbarui secara cepat hanya atribut tertentu dalam suatu produk.

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
sumber