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
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
la source
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.
la source
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
la source
catolog/product_action
approche afin de ne pas risquer le problème ci-dessusCes 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.
la source