ランダム製品のブロックを作成
新しいブロックタイプでカスタムモジュールを作成する必要があります。拡張することをお勧めしMage_Catalog_Block_Product_List
ます。デフォルトの製品リストのレイアウトで十分であれば、独自のテンプレートを設計する必要もありません。
次に、オーバーライドする_getProductCollection()
か、拡張しない場合Mage_Catalog_Block_Product_list
は新しいパブリックメソッドを記述しgetProductCollection()
ます。
この方法で製品コレクションを準備する方法:
コレクションフィルター
まず、コレクションを作成し、標準のフィルターを適用します(カタログに表示され、現在のストアで利用可能):
$productCollection = Mage::getModel('catalog/product')->getCollection();
$productCollection
->addStoreFilter()
->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
パフォーマンスの高いランダム選択
ORDER BY RAND()
大きなテーブルでは、リソースを大量に消費する一時テーブルのコピーになるため、パフォーマンスが低下します。すべての結果を一時テーブルにロードし、各行に乱数を割り当て、インデックスなしでソートする必要があります。代わりに、すべてのIDを取得し(これはより高速で、大きなカタログの場合でもデータ量を管理できます)、いくつかをランダムに選択して、これらの行を直接取得します。
そのためには、コレクションのフィルターが適用された後に次のコードを挿入します。
$numberOfItems = 4;
$candidateIds = $productCollection->getAllIds();
$choosenIds = [];
$maxKey = count($candidateIds)-1;
while (count($choosenIds) < $numberOfItems)) {
$randomKey = mt_rand(0, $maxKey);
$choosenIds[$randomKey] = $candidateIds[$randomKey];
}
$productCollection->addIdFilter($choosenIds);
あなたは私のブログでそれについて詳しく読むことができます:http : //www.schmengler-se.de/en/2015/09/show-random-products-in-magento-you-are-doing-it-wrong/
必要な属性を取得する
次に、ロードする属性を指定し、価格とURLインデックスを結合して、適切な価格と製品URLを表示できるようにします。
$productCollection
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addUrlRewrite();
最後に、コレクションを返します。
return $productCollection;
このコレクションは、マリウスの回答Mage_Catalog_Block_Product_List
とforeach ($this->getProductCollection() as $product)
同様に、ブロックまたは独自のテンプレートで使用できます。
CMSにカスタムブロックを挿入する
次のコードを使用しyour/block
て、ブロッククラスのエイリアスであるホームページにブロックを挿入します。
{{block type="your/block" name="random_products" template="catalog/product/list.phtml" column_count="4"}}
必要に応じて、独自のテンプレートを指定します。column_count
によって使用されMage_Catalog_Block_Product_List
ます。
ノート
または、上からすべてのPHPコードをテンプレートに含めることもできますが、これは非常に面倒であり、Magentoのコーディング標準とベストプラクティスに違反しています。
どうやらMagentoには独自の定義済みブロックタイプが付属しているようですが、をcatalog/product_list_random
使用しorder('rand()')
ているため、上記で説明したパフォーマンス上の理由からお勧めしません。