Sort Products by popularity count in Magento

Advance shorting option for category/list page in magento
Note: Please Make  folder structure app/code/local  and place all files in same structure in this folder ,If you make changes in core files its your risk.please make proper backup for core files if you modify that .


Step -1.
For Advance shorting option you have to create new collection by overriding Collection class.Overrride the collection class(/app/code/core/Mage/Catalog/Model/Resource/Product/collection.php and create a new function
<?php 
public function sortByReview($dir){
 $table = $this->getTable('review/review');
 $entity_code_id = Mage::getModel('review/review')->getEntityIdByCode(Mage_Rating_Model_Rating::ENTITY_PRODUCT_CODE); 
 $cond = $this->getConnection()->quoteInto('t2.entity_pk_value = e.entity_id and ','').$this->getConnection()->quoteInto('t2.entity_id = ? ',$entity_code_id); 
 $this->getSelect()->joinLeft(array('t2'=>$table), $cond,array('review' => new Zend_Db_Expr('count(review_id)'))) 
->group('e.entity_id')->order("review $dir"); 
 }

 ?>


Step-2 Find the file config.php(/app/code/core/Mage/Catalog/Model/config.php) and search for     getAttributeUsedForSortByArray(), And add here search option name  you get an array which you want to show in  toolbar drop-down in product-listing  page in your magento store.(line 4)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php public function getAttributeUsedForSortByArray()
   {
       $options = array(
              'popularity'  => Mage::helper('catalog')->__('Popularty'),
             'topsellings'  => Mage::helper('catalog')->__('Top Selling') 
 );
       foreach ($this->getAttributesUsedForSortBy() as $attribute) {
           /* @var $attribute Mage_Eav_Model_Entity_Attribute_Abstract */
           $options[$attribute->getAttributeCode()] = $attribute->getStoreLabel();
       }
       return $options;
   }
  ?>

Step:3 Finally call overridden collection(created onStep-1) when Popularity attribute  (created on step 2) selected for sorting in list page. for this find

/app/code/core/Mage/Catalog/Block/Product/List /toolbar.php
and include these lines.(line no..11 to 17) in setCollection method.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php
public function setCollection($collection)
   {
       $this->_collection = $collection;
       $this->_collection->setCurPage($this->getCurrentPage());
       // we need to set pagination only if passed value integer and more that 0
       $limit = (int)$this->getLimit();
       if ($limit) {
           $this->_collection->setPageSize($limit);
       }
        if($this->getCurrentOrder() == 'popularity'){
           $this->_collection->sortByReview($this->getCurrentDirection());
       }
     else if ($this->getCurrentOrder()) {
       
           $this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
    }
   
       return $this;
   }?>
Now you can see popularity option working in product listing page.

Comments

  1. Can't you set this from the admin panel by creating an attribute named 'popularity' and then set that to sort by option under the relevant category??

    ReplyDelete
  2. I used your code but when I want to sort by popularity I'm getting an error,

    "You cannot define a correlation name 't2' more than once"


    ReplyDelete
    Replies
    1. @duzenz: I am also facing same issue.. how did you resolve the issue..?

      Delete
  3. Hi duzenz
    what error comes ,can you give a detail ?

    ReplyDelete
  4. How does this sorting works.
    Does this sort by most purchased items or most visited items?

    Please reply

    ReplyDelete
    Replies
    1. sorting depends on review counts of products.

      Delete
    2. How can I sort based on bestseller(most sold) instead of the review counts.

      Could you please provide me the sample code for the same?

      Delete
  5. Hi muk,
    you can do this by 'ordered_qty'
    using query
    $collection->getSelect()
    ->joinLeft(
    'sales_flat_order_item AS order_item',
    'e.entity_id = order_item.product_id',
    'SUM(order_item.qty_ordered) AS ordered_qty')
    ->group('e.entity_id')
    ->order('ordered_qty DESC')

    ReplyDelete
  6. This article was very helpful in answering alot of questions regarding Magento Integration

    ReplyDelete
  7. There are so many options to sort by (e.g. popularity, reviews cont, date added, presence in wishlists, etc.) that it seems hard for me to add them programmatically. I'd better use some extension, like http://amasty.com/improved-sorting.html

    ReplyDelete
  8. Pagination lost for "Popularity" sort by

    ReplyDelete
    Replies
    1. Hi Bansi ,
      Pagination should works at my end . Where you facing problem?

      Delete

Post a Comment

Popular posts from this blog

Safe name of a file by php