Isso funciona bem no Magento CE 1.6 e mais recente:
$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);
Os códigos do indexador disponíveis podem ser visualizados usando a consulta:
SELECT indexer_code FROM index_process;
Em um Magento 1.7 nativo, existem:
+---------------------------+
| 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 |
+---------------------------+
No Magento EE 1.13 é diferente, lá o indexador pega automaticamente as entidades alteradas em cada execução do cron (a cada minuto).
ATUALIZAR
A resposta acima é 100% correta, de qualquer maneira, acho que as informações abaixo podem adicionar algo mais.
Se você precisar alterar apenas alguns valores de atributos em um produto e atualizar automaticamente a tabela de índice relativa, poderá usar esta função:
Mage::getSingleton('catalog/product_action')->updateAttributes();
se você quiser gerenciar a reindexação por conta própria, use o modelo de recurso: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();
Por exemplo, eu uso a seguinte função para atualizar rapidamente apenas determinados atributos em um produto.
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:
Se você precisar alterar o mesmo par de atributos / valores em um grupo de produtos, poderá passar toda a matriz deproduct_ids
Eu presumo que você quer dizer que deseja reindexar um produto após editá-lo na interface do usuário do administrador. O método mais fácil é definir o modo do indexador como "atualização ao salvar". Você precisaria fazer isso para todos os indexadores relacionados aos produtos que estiver usando, provavelmente incluindo: Atributos do produto, preços do produto, dados planos do produto, categoria Produtos, status de estoque.
Isso provavelmente diminuirá a economia do produto.
Alternativamente, talvez esse link ajude. Consulte os comentários e eles descrevem como atualizar o estoque também. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1
fonte
Verifique se você não está fazendo isso nos scripts de interface ou atualização, e se o armazenamento carregado no momento é "admin". Caso contrário, $ product-> save () não funcionará. Verifique primeiro se o salvamento de um produto tem efeito.
fonte
Além da resposta do @ feversocial, verifique também se você tem tudo o que é necessário para ser carregado no produto antes de chamar $ product-> save (). Caso contrário, a economia pode realmente remover coisas do produto que eu experimentei da maneira mais difícil.
Como salvar o produto sem um SKU, que interrompe todas as reescritas de URL e faz com que todo o site seja redirecionado para esta página de produto: S: P
fonte
catolog/product_action
abordagem para que você não arriscar o problema acimaEssas informações podem ser úteis para entender um pouco melhor todo o cenário.
Se você precisar alterar apenas um valor de atributo e atualizar automaticamente a tabela de índice relativa, poderá usar esta função:
Mage::getSingleton('catalog/product_action')->updateAttributes();
se você quiser gerenciar a reindexação por conta própria, use o modelo de recurso:
Mage::getResourceSingleton('catalog/product_action')->updateAttributes();
Por exemplo, eu uso a seguinte função para atualizar rapidamente apenas determinados atributos em um produto.
fonte