ホームページの4つのランダムな製品


7

私が作成したTPLファイル内のPHPを使用して、ホームページで4つのランダムな製品を取得しようとしています。以下のコードでいくつかのフォーマットを使用しているので、foreachループで製品をフォーマットできるようにしたい...

<div class="three columns">
  <div class="product_container no_border">
    <div class="product">
      <a href="product_page.html"><img src="<?php echo $this->getSkinUrl('images/products/place_holder.jpg'); ?>" alt=" "></a>
    </div>

    <div class="product_title">
      <a href="product_page.html">240 Serving Package</a>
    </div>

    <div class="price_hp">$454.99</div>

    <div class="free_shipping">
      <div class="fs"></div>
      Free shipping for this package
    </div>

    <div class="shop_btn">
      <a href="#">ADD TO CART</a>
    </div>
  </div>
</div>

私はGoogleで見つかったいくつかのことを試しましたが、まだ運がありません。配列にカテゴリを設定することは、私がやろうとしていることには確かに有効ですが、カテゴリがランダムである場合にも有効です。

ありがとう!

回答:


9

これを試して。私のために働いた:

$products = Mage::getModel('catalog/product')->getCollection();
$products->addAttributeToSelect(array('name', 'thumbnail', 'price')); //feel free to add any other attribues you need.
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products); 
$products->getSelect()->order('RAND()');
$products->getSelect()->limit(4);
foreach ($products as $product)  : ?>

<div class="three columns">
  <div class="product_container no_border">
    <div class="product">
      <a href="<?php echo $product->getProductUrl()?>"><img src="<?php echo Mage::helper('catalog/image')->init($product, 'thumbnail')->resize(100, 80)?>" alt=""></a>
    </div>

    <div class="product_title">
      <a href="<?php echo $product->getProductUrl()?>"><?php echo $product->getName()?></a>
    </div>

    <div class="price_hp"><?php echo Mage::app()->getStore()->getCurrentCurrency()->format($product->getFinalPrice());?></div>

    <div class="free_shipping">
      <div class="fs"></div>
      Free shipping for this package
    </div>

    <div class="shop_btn">
      <a href="<?php echo Mage::helper('checkout/cart')->getAddUrl($product)?>">ADD TO CART</a>
    </div>
  </div>
</div>
<?php 
endforeach;?>

ねえマリウス!これでうまくいきました。ありがとうございました!(おそらく)カートに追加ボタンが機能しない理由を教えてください。デモはdev.wisefoodsupply.com
Brian Schroeter

実際には、ホームページ以外は何も機能しません。index.phpに対する実行権限がありません。少なくとも、それがエラーメッセージの内容です。
マリウス

2
大規模なカタログでORDER BY RAND()を使用しないでください。パフォーマンスの問題があります
Fabian Schmengler、2015

投稿を編集するつもりはありませんが、確認できますMage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);か?何もしないようです。
sv3n 2018

5年前なんかしてたんだけど……。
マリウス

4

ランダム製品のブロックを作成

新しいブロックタイプでカスタムモジュールを作成する必要があります。拡張することをお勧めし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_Listforeach ($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ます。


ノート

  1. または、上からすべてのPHPコードをテンプレートに含めることもできますが、これは非常に面倒であり、Magentoのコーディング標準とベストプラクティスに違反しています。

  2. どうやらMagentoには独自の定義済みブロックタイプが付属しているようですが、をcatalog/product_list_random使用しorder('rand()')ているため、上記で説明したパフォーマンス上の理由からお勧めしません。


0

カスタムブロックに製品コレクション全体をロードしarray_randて、TPLファイルに返される5つのIDを選択するために使用できます。

http://php.net/manual/en/function.array-rand.php


3
これは良い考えではありません。30kの製品がある場合はどうなりますか?実際、ランダムな製品のリストを作成することは良い考えではありませんが、そうする必要がある場合は、コレクション全体をロードすることはできません。
マリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.