Как вариант, создать в таблице product поле со скидкой, например price2. Обновлять кроном раз в сутки.
и исправить в запросе сортировку на:
ORDER BY '.(Tools::getProductsOrder('by', Tools::getValue('orderby'), true) == 'p.price' ? 'price2' : Tools::getProductsOrder('by', Tools::getValue('orderby'), true)).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).' , cp.id_product'.
' LIMIT '.(((int)$this->page - 1) * $n.','.$n));