Один продукт Reindex


10

Я хотів би повторно встановити один продукт після оновлення.

Зараз я використовую:

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

Але це не працює, будь-які ідеї?

PS: $product->getId()існує і правильно.

Відповіді:


11

Це чудово працює у Magento CE 1.6 та новіших версіях:

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

Наявні коди індексатора можна переглянути за допомогою запиту:

SELECT indexer_code FROM index_process;

У рідному Magento 1.7 є:

+---------------------------+
| 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 це інакше, там індексатор автоматично підбирає змінені сутності на кожному запуску хронів (щохвилини).

ОНОВЛЕННЯ

Наведена вище відповідь на 100% вірна, я думаю, що наведена нижче інформація може додати щось більше.

  • Якщо вам потрібно змінити лише кілька значень атрибутів у продукті та автоматично оновити відносну таблицю індексів, ви можете скористатися цією функцією: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • якщо ви хочете керувати реіндексом самостійно, використовуйте модель ресурсу замість цього: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Наприклад, я використовую наступну функцію для швидкого оновлення лише певних атрибутів у продукті.

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

Примітка:

Якщо вам потрібно змінити один і той же пара атрибутів / значень у групі продуктів, ви можете пройти весь масивproduct_ids


Я скопію коментар user5973 тут, оскільки він буде видалений. @Vinai, ви хочете сказати, що у EE 1.13+ не виникає проблем із продуктивністю при повторному декламуванні даних, пов’язаних із продуктом? Де ми можемо підтвердити, що індексатор EE автоматично підбирає змінені сутності та обробляє лише ті?
Fabian Blechschmidt

У EE 1.13 індексатор використовує тригери MySQL для вибору будь-яких змін на рівні БД та запису оновлених ідентифікаторів сутності в таблицю змін. Ці журнали змін потім обробляються за допомогою кронштейнів.
Вінай

2

Я припускаю, що ви маєте на увазі, що хочете перевстановити продукт після редагування його в адміністративному інтерфейсі. Найпростіший метод - просто встановити режим індексатора на "оновлення при збереженні". Ви повинні зробити це для всіх індексаторів, пов’язаних з продуктами, які ви використовуєте, ймовірно, включаючи: Атрибути товару, Ціни на продукти, Дані про плоскі товари, Категорія товарів, Стан запасів.

Це, ймовірно, сповільнить економію продуктів.

Можливо, це посилання допоможе. Будь ласка, дивіться коментарі, а також вони описують, як оновити запас. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1


2

Переконайтеся, що ви цього не робите на передньому сценарії та не оновлюєте сценарії, а завантажений на даний момент магазин є "адміністратором". Інакше $ product-> save () взагалі не працюватиме. По-перше, перевірте, чи зберігає продукт ефект.


2

Окрім відповіді @ flysocial, переконайтесь, що у вас є все необхідне для завантаження на продукт, перш ніж зателефонувати в $ product-> save (). Інакше економія може фактично видалити речі з продукту, який я пережив нелегкий шлях.

Як і збереження продукту без SKU взагалі, який потім порушує всі перезаписи URL-адрес і робить весь сайт переспрямованим на цю сторінку продукту: S: P


Хороший момент, тому я вважаю, що краще використовувати catolog/product_actionпідхід, щоб ви не ризикували вищезгаданим питанням
Фра

1

I ця інформація може бути корисною для розуміння всього сценарію трохи краще.

  • Якщо вам потрібно змінити лише значення атрибута та автоматично оновити відносну таблицю індексу, ви можете скористатися цією функцією: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • якщо ви хочете керувати реіндексом самостійно, використовуйте модель ресурсу замість цього: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Наприклад, я використовую наступну функцію для швидкого оновлення лише певних атрибутів у продукті.

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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.