MAGENTO: How can I reindex data after updating?

I am using the following script to update my inventory. After the update, I want to clear the cache and reindex the data, because the updated value on qty not set on the product page. How can i do this?

 $mageFilename = '../app/Mage.php'; require_once $mageFilename; Mage::setIsDeveloperMode(true); ini_set('display_errors', 1); umask(0); Mage::app('admin'); Mage::register('isSecureArea', 1); Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); set_time_limit(0); ini_set('memory_limit','1024M'); /***************** UTILITY FUNCTIONS ********************/ function _getConnection($type = 'core_read'){ return Mage::getSingleton('core/resource')->getConnection($type); } function _getTableName($tableName){ return Mage::getSingleton('core/resource')->getTableName($tableName); } function _getAttributeId($attribute_code = 'price'){ $connection = _getConnection('core_read'); $sql = "SELECT attribute_id FROM " . _getTableName('eav_attribute') . " WHERE entity_type_id = ? AND attribute_code = ?"; $entity_type_id = _getEntityTypeId(); return $connection->fetchOne($sql, array($entity_type_id, $attribute_code)); } function _getEntityTypeId($entity_type_code = 'catalog_product'){ $connection = _getConnection('core_read'); $sql = "SELECT entity_type_id FROM " . _getTableName('eav_entity_type') . " WHERE entity_type_code = ?"; return $connection->fetchOne($sql, array($entity_type_code)); } function _checkIfSkuExists($sku){ $connection = _getConnection('core_read'); $sql = "SELECT COUNT(*) AS count_no FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?"; $count = $connection->fetchOne($sql, array($sku)); if($count > 0){ return true; }else{ return false; } } function _getIdFromSku($sku){ $connection = _getConnection('core_read'); $sql = "SELECT entity_id FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?"; return $connection->fetchOne($sql, array($sku)); } function _updateStocks($data){ $connection = _getConnection('core_write'); $sku = $data[0]; $newQty = $data[1]; $productId = _getIdFromSku($sku); $attributeId = _getAttributeId(); $sql = "UPDATE " . _getTableName('cataloginventory_stock_item') . " csi, " . _getTableName('cataloginventory_stock_status') . " css SET csi.qty = ?, csi.is_in_stock = ?, css.qty = ?, css.stock_status = ? WHERE csi.product_id = ? AND csi.product_id = css.product_id"; $isInStock = $newQty > 0 ? 1 : 0; $stockStatus = $newQty > 0 ? 1 : 0; $connection->query($sql, array($newQty, $isInStock, $newQty, $stockStatus, $productId)); } /***************** UTILITY FUNCTIONS ********************/ $csv = new Varien_File_Csv(); $data = $csv->getData('stocks.csv'); //path to csv array_shift($data); $message = ''; $count = 1; foreach($data as $_data){ if(_checkIfSkuExists($_data[0])){ try{ _updateStocks($_data); $message .= $count . '> Success:: Qty (' . $_data[1] . ') of Sku (' . $_data[0] . ') has been updated. <br />'; }catch(Exception $e){ $message .= $count .'> Error:: while Upating Qty (' . $_data[1] . ') of Sku (' . $_data[0] . ') => '.$e->getMessage().'<br />'; } }else{ $message .= $count .'> Error:: Product with Sku (' . $_data[0] . ') does\'t exist.<br />'; } $count++; } echo $message; 

I am trying to do this, but the update was very slow. I ran this script before echo $message.

 $processes = Mage::getSingleton('index/indexer')->getProcessesCollection(); $processes->walk('reindexAll'); $processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME)); $processes->walk('save'); 
+4
source share
4 answers

Create one file in the root folder with the following code and run it from a browser, for example http://www.domain.com/indexing.php

 <?php // when you get status "Processing" instead of "Ready" in your index management run this script and it working fine // change the index order as per your requirement currently it 7 for Catalog Search Index you can set as per your requirement require_once 'app/Mage.php'; umask( 0 ); Mage :: app( "default" ); $indexingProcesses = Mage::getSingleton('index/indexer')->getProcessesCollection(); foreach ($indexingProcesses as $process) { $process->reindexEverything(); } ?> 

OR put this code in your code

  $indexingProcesses = Mage::getSingleton('index/indexer')->getProcessesCollection(); foreach ($indexingProcesses as $process) { $process->reindexEverything(); } 

maybe this will help you!

+3
source

Perhaps use cron (help: link 1 , link 2 , link 3 ) to run /shell/indexer.php , in your opinion, would be appropriate.

Indexing takes some time. The slow update you experienced is natural. The same thing happens when you update your index from the backend, it is the same process.

Regarding getting cron working with your installation, I would advise you to find tutorials as it may vary in different environments.

+1
source

You should try reindexEverything() from Mage_index_Model_Process instead

0
source

The answers are given in two valid solutions, here is the third one, which can become interesting when working with some tenth products.

Reindexing may take some time to log, if you have many products, here are two ways to reduce it:

  • use magmi . First reason: it can do what your script does, you can replace it with magmi. im using it with magento 1.7.0.2. Second Reason: it has an on-the-fly indexer , which makes updating url_rewrites and category_products indexes automatically, and even if you update all products, its even faster than full reindex.

  • Magento, can reindex individual products that are faster than full reindex, especially if you are doing additional imports. I do this for products_price_index

     Mage::app('admin')->setUseSessionInUrl(false); Mage::getConfig()->init(); $product_indexer_price = Mage::getResourceSingleton('catalog/product_indexer_price'); $product_indexer_price->reindexProductIds(array($this->m_products[$res['products_id']])); 
0
source

Source: https://habr.com/ru/post/1437536/


All Articles