I'm having a lttle trouble understanding the indexing schema I've put in place. The behaviour is not what I expected...perhaps someone can shed a little light?
I have an auto load feature that uses MAGMI to load CSV files of inventory quantities for several locations...no problem, everything loads as expected. Once the CSV load is complete I programmatically reindex everything...I've used two methods:
1)
$indexer = Mage::getModel('index/indexer')->getProcessByCode('catalog_product_attribute');$indexer->reindexEverything();
$indexer = Mage::getModel('index/indexer')->getProcessByCode('catalog_product_price'); $indexer->reindexEverything();
$indexer = Mage::getModel('index/indexer')->getProcessByCode('catalog_url'); $indexer->reindexEverything();
$indexer = Mage::getModel('index/indexer')->getProcessByCode('catalog_product_flat'); $indexer->reindexEverything();
$indexer = Mage::getModel('index/indexer')->getProcessByCode('catalog_category_flat'); $indexer->reindexEverything();
$indexer = Mage::getModel('index/indexer')->getProcessByCode('catalog_category_product'); $indexer->reindexEverything();
$indexer = Mage::getModel('index/indexer')->getProcessByCode('catalogsearch_fulltext'); $indexer->reindexEverything();
$indexer = Mage::getModel('index/indexer')->getProcessByCode('cataloginventory_stock'); $indexer->reindexEverything();
$indexer = Mage::getModel('index/indexer')->getProcessByCode('tag_summary'); $indexer->reindexEverything();
2)
$indexCollection = Mage::getModel('index/process')->getCollection();
foreach ($indexCollection as $index) {
/* @var $index Mage_Index_Model_Process */
$index->reindexAll();
}
Both work fine, and the reindex can be verified by checking the index management page. After the reindex I also clear the cache with:
Mage::app()->getCacheInstance()->flush();
Mage::app()->cleanCache();
All is gravy up until this point...inventories are updated and show up on the front end as expected, the issue is the following:
Out-of-stock items, quantity=0, items ALSO show up, even though the settings in the back-end are to hide out-of stock items. What really confuses me though is, if I go to the index manager and reindex the "Product Prices" by hand the "Product Prices" and "Stock Status" are reindexed and all is well; the out-of-stock items are once again hidden. Apparently, "Product Prices" has a dependency on "Stock Status," or vise-versa.
I tried to call the "Product Price" reindex a second time programmatically to emulate what I was doing, but the out-of-stock items still show up. Needless to say, this behavior is aggravating...please help if you have insight. I simply want to load inventory, reindex, clear cache, then have out-of-stock items hidden...easy peasy...
Thanks a bunch-
DraftAssassin
If you don't have shell_exec disabled in your php.ini, then try this:
<?php $storePath = '/var/www/yourstorepath'; $command = '/usr/bin/php ' . $storePath . '/shell/indexer.php --reindex all'; shell_exec($command); ?>
You can replace "all" onto:
catalog_product_attribute
catalog_product_price
catalog_url
catalog_product_flat
catalog_category_flat
catalog_category_product
catalogsearch_fulltext
cataloginventory_stock
tag_summary
Unfortunately, the shell_exec is disabled on this server. Any other hints would be greatly appreciated, and thanks for the response.
DraftAssassin
Try this
<?php require_once 'app/Mage.php'; $app = Mage::app('admin'); umask(0); $ids = array(1,2,3,4,5,6,7,8,9); // admin panel-> System-> Index Management // admin/process/some_id/...... foreach($ids as $id) { try { $process = Mage::getModel('index/process')->load($id); $process->reindexAll(); echo "Indexing for Process ID # ".$id." Done<br />"; } catch(Exception $e) { echo $e->getMessage(); } } ?>
This is the way to go (without hardcoded id's, codes or shell_exec):
<?php /* @var $indexer Mage_Index_Model_Indexer */ $indexer = Mage::getSingleton('index/indexer'); foreach ($indexer->getProcessesCollection() as $process) { $process->reindexEverything(); } ?>