Magento catalog price rule disappears at night

倖福魔咒の 提交于 2019-11-28 19:44:00
Alexei Yerofeyev

Yes, this is a bug in Magento (or some logic beyond my understanding). When Magento displays products on frontend, it checks if there are catalog rules for this date. And the date used for this check is your local, so in your case GMT+5. However, when catalog rules are being applied, it uses GMT date. So that means that you aren't able to apply rules until 5 AM.

The problem is in Mage_CatalogRule_Model_Action_Index_Refresh::execute() method. You will have to rewrite this function/class either in your extension, or via the local version of the file.

File location: app/code/core/Mage/CatalogRule/Model/Action/Index/Refresh.php

You have to replace line 121:

$timestamp = $coreDate->gmtTimestamp('Today');

with this line:

$timestamp = Mage::app()->getLocale()->date(null, null, null, true)->get(Zend_Date::TIMESTAMP);

After that you should be able to apply the rules.

In magento 1.9.2.2 this didn't work for me. I installed AOE scheduler and using it i changed the catalogrule_apply_all cron expression from 0 1 * * * to 30 */6 * * * and it started working. Hope this helps someone.

As stated above by @Alexei-Zerofezev the problem is with the indexer.

I had this problem as well, the issue exists when there is an offset of the local timezone greater than +01:00.

Basically just because magento is using the gmtTimestamp for the rule date which in the above stated case results in the day before today.

Therefor I developed a small module https://github.com/Chuvisco88/Chuvisco_CatalogRuleFix to fix the issue. If someone ever has this problem, please give it a try.

I used a shell script instead of the (huge) AOE page @Lakshin Karunaratne suggested.

require_once 'abstract.php';

class X043_Shell_PriceRuleSetter extends Mage_Shell_Abstract
{
    public function run()
    {
        // stuff and thingies
        umask(0);
        Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
        setlocale(LC_ALL, 'en_US.UTF-8'); 

        try {
            Mage::getModel('catalogrule/rule')->applyAll();
            Mage::getModel('catalogrule/flag')->loadSelf()
                ->setState(0)
                ->save();
        } catch (Mage_Core_Exception $e) {
            Mage::logException($e);
        } catch (Exception $e) {
            Mage::logException($e);
        }

        return $this;
    }
}

$shell = new X043_Shell_PriceRuleSetter();
$shell->run();

Extends lakshin-karunaratne answer above.

Make sure you move cataloguerule_apply_all away from midnight but not before catalog_product_index_price_reindex_all.

From "Solving Magento"
"Important is that rule prices must be calculated for the current day and before the catalog price re-indexing starts. Otherwise the observer will not get any active rule prices to augment the price index."

Therefore you would need to calculate the offset from GMT time to ensure both cataloguerule_apply_all and catalog_product_index_price_reindex_all are executed on the same day.

This can be easily achieved by using AOE Scheduler https://github.com/AOEpeople/Aoe_Scheduler

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!