Reindex solo producto


10

Me gustaría reindexar un solo producto después de una actualización.

Ahora uso:

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

Pero esto no funciona, ¿alguna idea?

PD: $product->getId()es existente y correcto.

Respuestas:


10

Esto funciona bien en Magento CE 1.6 y versiones posteriores:

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

Los códigos indexadores disponibles se pueden ver usando la consulta:

SELECT indexer_code FROM index_process;

En un Magento 1.7 nativo hay:

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

En Magento EE 1.13 es diferente, allí el indexador recoge automáticamente las entidades cambiadas en cada ejecución cron (cada minuto).

ACTUALIZAR

La respuesta anterior es 100% correcta de todos modos, creo que la información a continuación puede agregar algo más.

  • Si necesita cambiar solo algunos valores de atributos en un producto y actualizar automáticamente la tabla de índice relativo, puede usar esta función: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • si desea gestionar la reindexación por su cuenta, utilice el modelo de recurso en su lugar: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Por ejemplo, uso la siguiente función para actualizar rápidamente solo ciertos atributos en un producto.

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

Nota:

Si necesita cambiar la misma pareja de atributos / valores en un grupo de productos, puede pasar toda la matriz deproduct_ids


Copiaré el comentario del usuario 5973 aquí, porque se eliminará. @Vinai, ¿estás diciendo que EE 1.13+ no tiene estos problemas de rendimiento al reindexar datos relacionados con el producto? ¿Dónde podemos confirmar que el indexador EE recoge automáticamente las entidades modificadas y procesa solo esas?
Fabian Blechschmidt

En EE 1.13, el indexador utiliza los activadores de MySQL para recoger cualquier cambio en un nivel de base de datos y registrar las ID de entidad actualizadas en una tabla de registro de cambios. Estos registros de cambios se procesan a través de cronjobs.
Vinai

2

Supongo que quiere decir que desea reindexar un producto después de editarlo en la interfaz de usuario administrativa. El método más fácil es simplemente configurar el modo indexador para "actualizar al guardar". Debería hacer esto para todos los indexadores relacionados con los productos que está utilizando, que probablemente incluyen: Atributos del producto, Precios del producto, Datos planos del producto, Categoría Productos, Estado del stock.

Sin embargo, esto probablemente ralentizará el ahorro de productos.

Alternativamente, quizás este enlace ayude. Consulte los comentarios y también describe cómo actualizar el stock. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1


2

Asegúrese de no hacer esto en la interfaz de usuario ni en los scripts de actualización, y la tienda actualmente cargada es "admin". De lo contrario, $ product-> save () no funcionará en absoluto. Compruebe primero que guardar un producto tiene efecto.


2

Además de la respuesta de @ feversocial, también asegúrese de tener todo lo que se necesita para cargar en el producto antes de llamar a $ product-> save (). De lo contrario, el ahorro en realidad puede eliminar cosas del producto que he experimentado por las malas.

Como guardar el producto sin una SKU, lo que rompe todas las reescrituras de URL y hace que todo el sitio redirija a esta página de producto: S: P


Buen punto, por eso creo que es mejor usar el catolog/product_actionenfoque para que no se arriesgue al problema anterior
Fra

1

Esta información puede ser útil para comprender un poco mejor todo el escenario.

  • Si necesita cambiar solo un valor de atributo y actualizar automáticamente la tabla de índice relativo, puede usar esta función: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • si desea gestionar la reindexación por su cuenta, utilice el modelo de recurso en su lugar: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Por ejemplo, uso la siguiente función para actualizar rápidamente solo ciertos atributos en un producto.

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);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.