Вам нужно создать сценарий командной строки оболочки и использовать его, чтобы определить, требуется ли для индекса повторный индекс.
Взгляните на сценарии в папке оболочки (log.php подойдет) в качестве примера того, как создать такой сценарий.
Сценарий, который вы создадите, будет затем проверять состояние индекса и переиндексировать только в том случае, если он находится в состоянии, требующем индексации.
Обычно я создаю свои собственные сценарии оболочки в папке / scripts, так как я не люблю загрязнять оболочку основной папки своим пользовательским кодом.
Для этого у меня есть абстрактный класс, на котором я основываю все свои скрипты, и он содержит код, который позволяет мне легко переиндексировать индексаторы, если они требуют индексации.
вот мой абстрактный класс:
/**
* Abstracted functions for scripts
*
* @category ProxiBlue
* @package Scripts
* @author Lucas van Staden (sales@proxiblue.com.au)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*
*/
require_once dirname(__FILE__) . '/../shell/abstract.php';
class Mage_Shell_Scripts_Abstract extends Mage_Shell_Abstract {
public $_doReindexFlag = false;
public function run() {
die('Please implement a run function inyour script');
}
/**
* Get the category model
* @return Object
*/
public function getCatalogModel() {
return Mage::getModel('catalog/category');
}
/**
* Reindex given indexers.
* Tests if indexer actually needs re-index, and is not in manual state before it does index.
*
* @param array $reIndex
*/
public function reindex(array $reIndex) {
foreach ($reIndex as $indexerId) {
$process = $this->_getIndexer()->getProcessByCode($indexerId);
if ($process->getStatus() == Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX && $process->getMode() != Mage_Index_Model_Process::MODE_MANUAL) {
try {
echo "Reindexing: " . $process->getIndexerCode();
$process->reindexEverything();
} catch (Exception $e) {
mage::logException("{$indexer} Indexer had issues. {$e->getMessage()}");
}
}
}
}
/**
* Get Indexer instance
*
* @return Mage_Index_Model_Indexer
*/
private function _getIndexer() {
return Mage::getSingleton('index/indexer');
}
/**
* Returns a list of cache types.
* @return void
*/
public function getInvalidateCache() {
$invalidTypes = $this->_getInvalidatedTypes();
$result = array();
foreach($invalidTypes as $cache) {
if ($cache->status == 1) {
$result[] = $cache;
}
}
return $result;
}
/**
* Gets a list of invalidated cache types that should be refreshed.
* @return array Array of invalidated types.
*/
private function _getInvalidatedTypes() {
return Mage::getModel('core/cache')->getInvalidatedTypes();
//return $this->_getCacheTypes();
}
/**
* Gets Magento cache types.
* @return
*/
private function _getCacheTypes() {
//return Mage::helper('core')->getCacheTypes();
return Mage::getModel('core/cache')->getTypes();
}
}
Затем класс, основанный на этом, который вызывает переиндексацию после некоторой работы.
require_once dirname(__FILE__) . '/abstract.php';
class Mage_Shell_setCategoryStatus extends Mage_Shell_Scripts_Abstract {
public $_doReindexFlag = true;
public function run() {
/** code stripped out as not warrented for this answer **/
if ($this->_doReindexFlag) {
$this->reindex(array('catalog_product_flat',
'catalog_category_flat',
'catalog_category_product',
'cataloginventory_stock',
'catalogsearch_fulltext',
));
}
}
}
$shell = new Mage_Shell_setCategoryStatus();
$shell->run();