Переиндексировать один продукт

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()существует и правильно.

Боб ван Луийт
источник

Ответы:

10

Это отлично работает в 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 все по-другому: индексатор автоматически выбирает измененные объекты при каждом запуске cron (каждую минуту).

ОБНОВИТЬ

Приведенный выше ответ в любом случае на 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

Vinai
источник
Я скопирую комментарий user5973 здесь, потому что он будет удален. @ Vinai Вы говорите, что EE 1.13+ не имеет проблем с производительностью при переиндексации данных, связанных с продуктом? Где мы можем подтвердить, что индексатор EE автоматически выбирает измененные объекты и обрабатывает только те из них?
Фабиан Блехшмидт
В EE 1.13 индексатор использует триггеры MySQL для сбора любых изменений на уровне БД и записи обновленных идентификаторов сущностей в таблицу журнала изменений. Эти изменения вносятся в cronjobs.
Винай
2

Я предполагаю, что вы имеете в виду, что вы хотите переиндексировать продукт после редактирования в интерфейсе администратора. Самый простой способ - просто установить режим индексатора на «обновление при сохранении». Это необходимо сделать для всех индексаторов, связанных с продуктами, которые вы используете, возможно, включая: атрибуты продуктов, цены продуктов, данные о продуктах, категории продуктов, состояние запасов.

Это, вероятно, замедлит экономию продукта.

В качестве альтернативы, возможно, эта ссылка поможет. Пожалуйста, смотрите комментарии, а также они описывают, как обновить акции, а также. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1

буйствовать
источник
2

Убедитесь, что вы не делаете это ни в интерфейсе, ни в сценариях обновления, и в данный момент загружено хранилище «admin». В противном случае $ product-> save () не будет работать вообще. Сначала проверьте, что сохранение продукта имеет эффект.

feversocial
источник
2

Помимо ответа @ feversocial, прежде чем вызывать $ product-> save (), убедитесь, что у вас есть все необходимое для загрузки в продукт. В противном случае экономия может фактически удалить вещи из продукта, который я испытал на своем пути.

Подобно тому, как сохранить продукт без SKU, что нарушает все перезаписи URL и делает весь сайт перенаправленным на эту страницу продукта: S: P

Ozzie
источник
Хороший вопрос, поэтому я думаю, что лучше использовать catolog/product_actionподход, чтобы не рисковать вышеупомянутой проблемой
Fra
1

Эта информация может быть полезна для лучшего понимания всего сценария.

  • Если вам нужно изменить только значение атрибута и автоматически обновить таблицу относительных индексов, вы можете использовать эту функцию: 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);
}
От
источник