I have found that magento has two separate ways of handling special prices but I don't know which is the best for my case. I found that catalog price rules are very powerful but I don't know how to loop through them without hardcoding the ID of the rule.

My client needs to have two kinds of special prices: normal discounts (20-30% off some products) and "flash sales" that last a short time (1-2 days). I need to have them show up in the home page and in the category pages, the ones in the home need to be selected by the admin from the backend and the ones in the category pages too, they will be set of 4 products on each page (the ones in the category pages need to be from said category). Then I have a link to a page with all the products that have special prices on them.

The "selecting" part of the deal I really don't know how to do but so far I can't even get the products with a catalog price rule to show up on my home page. I have a block for them and I found this code:

$rule = Mage::getModel('catalogrule/rule')->load(1);   
$rule->setWebsiteIds("1"); $productIdsArray = $rule->getMatchingProductIds(); 
$productsCollection = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect("*") ->addAttributeToFilter("entity_id", array("in", $productIdsArray)); 

But I'm guessing the ->load(1); is hardcoding the ID of the promo, what if the user creates a new price rule then? How do I loop all through all the products that have a rule in them?

I do know how to loop through special price products and maybe I could use them for the flash promos but I think I'll be complicating it with the rest of the features that I need to implement.

Also if you have any advice on how to handle the fact that the user needs to select the 4 featured products I would be very thankful.

1 Answer 1


Perhaps consider the following setup:

Applying normal discounts (20-30% off some products)
Either do this manually on each product or create a category called "Sale Items" and under that a subcategory for each discount bracket, e.g "20 percent", "30 percent", etc. You can then use catalog price rules on each of these categories to get the desired discounts.

Flash sales
Again, create a category for the flash sale and then create a catalog price rule discounting products in this category. You can set a "to" and "from" date on this price rule.

Showing sale products on the homepage
To show products that have a special price applied to them I usually create a new block called Namespace_Module_Block_Product_List_Special (Special.php). It needs to extend Mage_Catalog_Block_Product_List. You can then overwrite the _getProductCollection(). Here's the whole block file:

class Namespace_Module_Block_Product_List_Special extends Mage_Catalog_Block_Product_List

    //default item limit
    protected $_defaultItemLimit = 4;

    public function _construct() {

     * Retrieve product collection
     * @return Mage_Eav_Model_Entity_Collection_Abstract
    protected function _getProductCollection()

        $todayStartOfDayDate  = Mage::app()->getLocale()->date()

        $todayEndOfDayDate  = Mage::app()->getLocale()->date()

        $collection = Mage::getResourceModel('catalog/product_collection');
        $collection = $this->_addProductAttributesAndPrices($collection)
            ->addAttributeToFilter('special_from_date', array('date' => true, 'to' => $todayStartOfDayDate))
            ->addAttributeToFilter('special_to_date', array('or'=> array(
                0 => array('date' => true, 'from' => $todayStartOfDayDate),
                1 => array('is' => new Zend_Db_Expr('null')))
            ), 'left')
            ->addAttributeToSort('special_from_date', 'desc')

        $itemLimit = $this->getItemLimit();
        return $collection;

    public function getItemLimit() {

        if($this->hasData('item_limit')) {
            return $this->getData('item_limit');

        return $this->_defaultItemLimit;


To use it you'll need to add this to your config.xml under the <global> tag:


And then display it on the homepage like so:

{{block type="catalog/product_list_special" name="homepage.products.special" template="catalog/product/list.phtml"}}

Or via layout XML:

<block type="catalog/product_list_special" name="hometabs.products.special" template="catalog/product/list.phtml"/>

You could use the same method to display the special products in each category, but that would require a change to the _getProductCollection() method that checks for the current category. Have a look at Mage_Catalog_Block_Product_list::_getProductCollection() for some ideas on the code to use for this.

  • That's fantastic and I can use some of that but how can I loop through all catalog price rules without hardcoding the ID of the rule? Mar 22, 2013 at 8:30
  • Could you please explain why you need to loop through each rule? You could try something like Mage::getModel('catalogrule/rule')->getCollection() to get a collection of rules (although I haven't worked with catalog rules programmatically). However it sounds like you want it the other way around - get a collection of products that have rules applied to them? Mar 23, 2013 at 3:29
  • I need to visually separate the different rules, each might have a different banner and I might need to select how many of each rule to show on each page Mar 25, 2013 at 17:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.