Reindexar um único produto

10

Gostaria de reindexar um único produto após uma atualização.

Agora eu 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
);

Mas isso não funciona, alguma idéia?

PS: $product->getId()existe e está correto.

Bob van Luijt
fonte

Respostas:

10

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

Vinai
fonte
Copiarei o comentário de user5973 aqui, porque ele será excluído. @Vinai, você está dizendo que o EE 1.13+ não apresenta esses problemas de desempenho ao reindexar dados relacionados ao produto? Onde podemos confirmar que o indexador EE seleciona automaticamente entidades alteradas e processa apenas essas?
Fabian Blechschmidt
No EE 1.13, o indexador usa gatilhos do MySQL para captar as alterações no nível do banco de dados e registrar os IDs de entidade atualizados em uma tabela de registro de alterações. Esses changelogs são então processados ​​via cronjobs.
Vinai
2

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

enlouquecer
fonte
2

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.

feversocial
fonte
2

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

OZZIE
fonte
Bom ponto, é por isso que eu acho que é melhor usar catolog/product_actionabordagem para que você não arriscar o problema acima
Fra
1

Essas 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.

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
fonte