Reindex tek ürün


10

Bir güncellemeden sonra tek bir ürünü yeniden dizine eklemek istiyorum.

Şimdi kullanıyorum:

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

Ama bu işe yaramıyor, herhangi bir fikir?

PS: $product->getId()mevcut ve doğrudur.

Yanıtlar:


11

Bu Magento CE 1.6 ve daha yeni sürümlerde iyi çalışır:

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

Kullanılabilir dizin oluşturucu kodları şu sorgu kullanılarak görüntülenebilir:

SELECT indexer_code FROM index_process;

Yerli bir Magento 1.7'de:

+---------------------------+
| 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'te farklıdır, orada indeksleyici her cron çalışmasında (her dakika) değiştirilen objeleri otomatik olarak alır.

GÜNCELLEME

Yukarıdaki cevap% 100 doğrudur, bence aşağıdaki bilgiler daha fazlasını ekleyebilir.

  • Bir üründeki yalnızca birkaç özellik değerini değiştirmeniz ve ilgili dizin tablosunu otomatik olarak güncellemeniz gerekiyorsa, bu işlevi kullanabilirsiniz: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • reindex'i kendi başınıza yönetmek istiyorsanız, bunun yerine kaynak modelini kullanın: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Örneğin, bir üründe yalnızca belirli özellikleri hızlı bir şekilde güncellemek için aşağıdaki işlevi kullanıyorum.

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

Not:

Bir grup üründe aynı özellik / değer çiftini değiştirmeniz gerekirse ,product_ids


Kullanıcı5973'ün yorumunu buraya kopyalayacağım, çünkü silinecek. @Vinai, ürünle ilgili verileri yeniden endekslerken EE 1.13+ ürününün bu performans sorunlarına sahip olmadığını mı söylüyorsunuz? Enerji Verimliliği endeksleyicisinin değiştirilen varlıkları otomatik olarak aldığını ve yalnızca bu varlıkları işlediğini nereden doğrulayabiliriz?
Fabian Blechschmidt

EE 1.13'te dizin oluşturucu, bir DB düzeyinde değişiklikleri almak ve güncellenmiş varlık kimliklerini bir değişiklik günlüğü tablosuna kaydetmek için MySQL tetikleyicilerini kullanır. Bu değişiklik kayıtları daha sonra cronjobs aracılığıyla işlenir.
Vinai

2

Yönetici ürününde düzenledikten sonra bir ürünü yeniden dizine eklemek istediğinizi varsayıyorum. En kolay yöntem, dizin oluşturucu modunu "kaydetme sırasında güncelleme" olarak ayarlamaktır. Muhtemelen aşağıdakileri içeren, kullandığınız ürünlerle ilgili tüm dizin oluşturucular için bunu yapmanız gerekir: Ürün Özellikleri, Ürün Fiyatları, Ürün Düz Verileri, Kategori Ürünleri, Stok Durumu.

Bu muhtemelen ürün tasarrufunu yavaşlatacaktır.

Alternatif olarak belki de bu bağlantı yardımcı olacaktır. Lütfen yorumların yanı sıra hisse senedinin nasıl güncelleneceğini de açıklarlar. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1


2

Bunu ön uçta veya yükseltme komut dosyalarında yapmadığınızdan ve şu anda yüklü olan mağazanın "admin" olduğundan emin olun. Aksi takdirde, $ product-> save () hiç çalışmaz. İlk olarak, bir ürünü kaydetmenin etkili olup olmadığını kontrol edin.


2

Ayrıca @ feversocial'ın yanıtı, $ product-> save () öğesini çağırmadan önce ürüne yüklenmesi gereken her şeye sahip olduğunuzdan emin olun. Aksi takdirde tasarruf gerçekten zor bir şekilde yaşadığım üründen işleri kaldırabilir.

Ürünü bir SKU olmadan kaydetmek gibi, bu da tüm url yeniden yazmalarını kırar ve tüm siteyi bu ürün sayfasına yönlendirir: S: P


İyi bir nokta, bu yüzden catolog/product_actionyaklaşımı kullanmak daha iyi olduğunu düşünüyorum, bu yüzden yukarıdaki sorunu riske
Fra

1

Bu bilgiler tüm senaryoyu biraz daha iyi anlamak için faydalı olabilir.

  • Yalnızca bir özellik değerini değiştirmeniz ve göreli dizin tablosunu otomatik olarak güncellemeniz gerekiyorsa, bu işlevi kullanabilirsiniz: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • reindex'i kendi başınıza yönetmek istiyorsanız, bunun yerine kaynak modelini kullanın: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Örneğin, bir üründe yalnızca belirli özellikleri hızlı bir şekilde güncellemek için aşağıdaki işlevi kullanıyorum.

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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.