プログラムでMagentoの価格を更新します。この更新後に価格のインデックスを再作成するにはどうすればよいですか。今私はSSHコマンドを使用しました:
php indexer.php --reindex catalog_product_price
以下は、各インデックスのインデックスを再作成します。
for ($i = 1; $i <= 9; $i++) {
$process = Mage::getModel('index/process')->load($i);
$process->reindexAll();
}
forループでIDをハードコーディングするのではなく、Magentoコレクションモデルを使用して各インデックスを読み込むこともできます。
/* @var $indexCollection Mage_Index_Model_Resource_Process_Collection */
$indexCollection = Mage::getModel('index/process')->getCollection();
foreach ($indexCollection as $index) {
/* @var $index Mage_Index_Model_Process */
$index->reindexAll();
}
ただし、価格だけを再インデックス付けする場合は、IDは2です。
$process = Mage::getModel('index/process')->load(2);
$process->reindexAll();
次のように関数getProcessByCodeを呼び出すこともできます。
$process = Mage::getModel('index/indexer')->getProcessByCode('catalog_product_price');
$process->reindexAll();
次のSSHコマンドを使用すると、すべてのインデックスのインデックスを再作成できます。
php shell/indexer.php reindexall
ただし、catalog_product_priceのみのインデックスを再作成する場合は、以下のコードを使用できます。
php shell/indexer.php --reindex catalog_product_price
php -f indexer.php help
このコマンドは、SSHを介したインデックスの再作成に関連するすべてのコマンドに使用できます。
php indexer.php -- reindex [process_code]
e.g: php indexer.php --reindex catalog_product_price
コードの方法が好きな場合は、SSH経由です。以下のコードを実行する必要があります。
$indexer = Mage::getModel('index/indexer')->getProcessByCode('catalog_product_price')
$indexer->reindexEverything();
またはこれを行う:
for ($i = 0; $i <= 8; $i++) {
$process = Mage::getModel('index/process')->load($i);
$process->reindexAll();
}
フラットテーブルを使用していて、なぜ(今日のように)プログラムで更新された価格がフロントエンドに表示されないのか疑問に思っている場合は、インデックスを再作成した後、製品をフラットに再インデックスする必要があります。
php shell/indexer.php -reindex catalog_product_price
php shell/indexer.php -reindex catalog_product_flat
通常の場合:
php shell/indexer.php reindexall
インデックスの再作成の順序に注意してください。
Category Flat Data index was rebuilt successfully in 00:00:00
Product Flat Data index was rebuilt successfully in 00:00:00
Stock Status index was rebuilt successfully in 00:00:00
Catalog product price index was rebuilt successfully in 00:00:00
...
製品フラットは価格の前に索引付けされているため、価格の更新はフラットテーブル(つまり、catalog_product_flat_2)で更新されませんでした。フラットテーブルを調べて、プログラムで更新された価格が設定されていることを確認します。
<?php
namespace Webizon\ApiConnector\Controller\Index;
class Reindex extends \Magento\Framework\App\Action\Action {
/**
* @var \Magento\Indexer\Model\IndexerFactory
*/
protected $indexerFactory;
/**
* @var \Magento\Framework\Indexer\ConfigInterface
*/
protected $config;
/**
* @param Context $context
* @param \Magento\Indexer\Model\IndexerFactory $resultLayoutFactory
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Indexer\Model\IndexerFactory $indexerFactory,
\Magento\Framework\Indexer\ConfigInterface $config
) {
$this->indexerFactory = $indexerFactory;
$this->config = $config;
parent::__construct($context);
}
/**
* Regenerate full index
*
* @return void
* @throws \Exception
*/
public function execute()
{
$params = $this->getRequest()->getParams();
if(isset($params['run'])){
if($params['run'] == 'all'){
$this->reindexAll();
}else{
$this->reindexOne($params['run']);
}
}
}
/**
* Regenerate single index
*
* @return void
* @throws \Exception
*/
private function reindexOne($indexId){
$indexer = $this->indexerFactory->create()->load($indexId);
$indexer->reindexAll();
}
/**
* Regenerate all index
*
* @return void
* @throws \Exception
*/
private function reindexAll(){
foreach (array_keys($this->config->getIndexers()) as $indexerId) {
$indexer = $this->indexerFactory->create()->load($indexerId);
$indexer->reindexAll();
}
}
}
http://www.webizon.in/apiconnector/index/reindex/all= >すべてのインデックスの再作成を実行するには
http://www.webizon.in/apiconnector/index/reindex/indexer_id= >個別のインデックス再作成を実行するには
(例:http ://www.webizon.in/apiconnector/index/reindex/catalog_product_price )-価格インデックスを実行するには