Back to Top

Reindexing for one product in Magento 2

Updated 17 June 2024

Hello Friends!
In this blog, we will learn how we can do reindexing for one product programmatically.

In Magento 2, when we create a new product or update an existing product, sometimes its inventory and prices don’t update on frontend. And we don’t want to execute the reindexing command from CLI after each change.

In that case, we can create an observer on ‘controller_action_catalog_product_save_entity_after‘ event, which is dispatched in /Magento/Catalog/Controller/Adminhtml/Product/Save Controller class in Magento 2.

And if we are creating or updating a product programmatically then we can add the following code statements in our code.

Here, I have done this in AdminProductSaveAfterObserver.php file inside app/code/Vendor/CustomModule/Observer/ directory.

Searching for an experienced
Magento 2 Company ?
Find out More
<?php
/**
 * Vendor Desc.
 * php version 7.3.*
 *
 * @category  Vendor
 * @package   Vendor_CustomModule
 * @author    Vendor
 * @copyright Copyright (c) Vendor
 * @license   https://eaxmple.com/license.html
 */
namespace Vendor\CustomModule\Observer;

use Magento\Framework\Event\ObserverInterface;

class AdminProductSaveAfterObserver implements ObserverInterface
{
    /**
     * @var \Magento\Framework\Indexer\IndexerRegistry
     */
    protected $indexerRegistry;

    /**
     * Object intialization
     *
     * @param \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry
     */
    public function __construct(
        \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry
    ) {
        $this->indexerRegistry = $indexerRegistry;
    }

    /**
     * Product save after observer
     *
     * @param \Magento\Framework\Event\Observer $observer
     */

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        try {
            $product = $observer->getProduct();
            if (!empty($product)) {
                $productIds = [$product->getId()]; //here you can one or more product Ids in array
                //list of indexers
                $indexList = [
                    'catalog_category_product',
                    'catalog_product_category',
                    'catalog_product_attribute',
                    'cataloginventory_stock',
                    'inventory',
                    'catalogsearch_fulltext',
                    'catalog_product_price',
                    'catalogrule_product',
                    'catalogrule_rule'
                ];
 
                foreach ($indexList as $index) {
                    $categoryIndexer = $this->indexerRegistry->get($index);
                
                    //check is indexer is scheduled
                    if (!$categoryIndexer->isScheduled()) {
                        $categoryIndexer->reindexList($productIds);
                    }
                }
            }
        } catch (\Exception $e) {
            echo $e->getMessage();
        }
    }
}

Hope this will be helpful. Thanks 🙂

Previous Blog: Display dependent fields on Customer Account Edit Page

Next Blog: Detect your device is Mobile or Desktop in Magento 2

. . .

Leave a Comment

Your email address will not be published. Required fields are marked*


Be the first to comment.

Back to Top

Message Sent!

If you have more details or questions, you can reply to the received confirmation email.

Back to Home