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
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; }?> |
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??
ReplyDeleteI used your code but when I want to sort by popularity I'm getting an error,
ReplyDelete"You cannot define a correlation name 't2' more than once"
@duzenz: I am also facing same issue.. how did you resolve the issue..?
DeleteHi duzenz
ReplyDeletewhat error comes ,can you give a detail ?
How does this sorting works.
ReplyDeleteDoes this sort by most purchased items or most visited items?
Please reply
sorting depends on review counts of products.
DeleteHow can I sort based on bestseller(most sold) instead of the review counts.
DeleteCould you please provide me the sample code for the same?
Hi muk,
ReplyDeleteyou 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')
This article was very helpful in answering alot of questions regarding Magento Integration
ReplyDeleteThere 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
ReplyDeletePagination lost for "Popularity" sort by
ReplyDeleteHi Bansi ,
DeletePagination should works at my end . Where you facing problem?