Réindexer un seul produit

10

Je voudrais réindexer un seul produit après une mise à jour.

Maintenant j'utilise:

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

Mais cela ne fonctionne pas, des idées?

PS: $product->getId()est existant et correct.

Bob van Luijt
la source

Réponses:

10

Cela fonctionne bien dans Magento CE 1.6 et plus récent:

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

Les codes d'indexation disponibles peuvent être consultés à l'aide de la requête:

SELECT indexer_code FROM index_process;

Dans un Magento 1.7 natif, il y a:

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

Dans Magento EE 1.13, c'est différent, l'indexeur récupère automatiquement les entités modifiées à chaque exécution de cron (toutes les minutes).

METTRE À JOUR

La réponse ci-dessus est 100% correcte de toute façon, je pense que les informations ci-dessous peuvent ajouter quelque chose de plus.

  • Si vous devez modifier seulement quelques valeurs d'attributs dans un produit et mettre à jour automatiquement la table d'index relative, vous pouvez utiliser cette fonction: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • si vous souhaitez gérer la réindexation par vous-même, utilisez plutôt le modèle de recours: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Par exemple, j'utilise la fonction suivante pour mettre à jour rapidement uniquement certains attributs d'un produit.

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

Remarque:

Si vous devez changer le même couple attribut / valeur dans un groupe de produits, vous pouvez passer tout le tableau deproduct_ids

Vinai
la source
Je vais copier le commentaire de user5973 ici, car il sera supprimé. @Vinai dites-vous que EE 1.13+ n'a pas ces problèmes de performances lors de la réindexation des données relatives aux produits? Où pouvons-nous confirmer que l'indexeur EE récupère automatiquement les entités modifiées et ne traite que celles-ci?
Fabian Blechschmidt
Dans EE 1.13, l'indexeur utilise des déclencheurs MySQL pour détecter toutes les modifications au niveau d'une base de données et enregistrer les ID d'entité mis à jour dans une table du journal des modifications. Ces changelogs sont ensuite traités via des cronjobs.
Vinai
2

Je suppose que vous voulez dire que vous souhaitez réindexer un produit après l'avoir modifié dans l'interface utilisateur d'administration. La méthode la plus simple consiste à simplement définir le mode indexeur sur "mise à jour lors de l'enregistrement". Vous devriez le faire pour tous les indexeurs liés aux produits que vous utilisez, y compris probablement: les attributs de produit, les prix des produits, les données sur les produits, les catégories de produits, l'état des stocks.

Cependant, cela ralentira probablement les économies de produits.

Alternativement, peut-être que ce lien vous aidera. Veuillez également consulter les commentaires et décrire comment mettre à jour le stock. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1

runamok
la source
2

Assurez-vous que vous ne le faites pas sur le frontend ni sur les scripts de mise à niveau, et que le magasin actuellement chargé est "admin". Sinon, $ product-> save () ne fonctionnera pas du tout. Vérifiez d'abord que l'enregistrement d'un produit a un effet.

feversocial
la source
2

Outre la réponse de @ feversocial, assurez-vous également que vous avez tout ce qui est nécessaire pour être chargé sur le produit avant d'appeler $ product-> save (). Sinon, la sauvegarde peut en fait supprimer des choses du produit que j'ai vécu à la dure.

Comme enregistrer le produit sans SKU du tout, ce qui interrompt toutes les réécritures d'URL et redirige l'ensemble du site vers cette page de produit: S: P

OZZIE
la source
Bon point, c'est pourquoi je pense qu'il est préférable d'utiliser l' catolog/product_actionapproche afin de ne pas risquer le problème ci-dessus
Fra
1

Ces informations peuvent être utiles pour mieux comprendre l'ensemble du scénario.

  • Si vous devez modifier uniquement une valeur d'attribut et mettre à jour automatiquement la table d'index relative, vous pouvez utiliser cette fonction: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • si vous souhaitez gérer la réindexation par vous-même, utilisez plutôt le modèle de recours: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Par exemple, j'utilise la fonction suivante pour mettre à jour rapidement uniquement certains attributs d'un produit.

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
la source