Товары которых нет в наличии вниз списка
Отображать товары которых нет в наличии в самом конце списка с учетом разных сортировок и пагинации

В Opencart сортировку товара можно сделать любую, по имени, рейтингу, цене и т.д. Но неудобно то что товары не сортируются по наличию - идут в общем списке по заданной сортировке. Часто, товар которого нет в наличии идет самым первым в списке, что неправильно и не логично.
Отличное решение - располагать товары которых нет в наличии в конце списка. Конечно, можно поставить сортировку p.quantity DESC. При таком решении товары будут сортироваться по количеству, но когда пользователь поставит свою, например по цене, товары которых нет в наличии будут в общем порядке.
Для вывода проданных товаров в конец надо в файле catalog/model/catalog/product.php найти функцию getProducts и там заменить
SELECT p.product_id,
на:
SELECT p.product_id, p.quantity>0 as instock,
и блок
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') { $sql .= " ORDER BY LCASE(" . $data['sort'] . ")"; } elseif ($data['sort'] == 'p.price') { $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)"; } else { $sql .= " ORDER BY " . $data['sort']; } } else { $sql .= " ORDER BY p.sort_order"; }
заменить на:
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') { $sql .= " ORDER BY instock DESC, LCASE(" . $data['sort'] . ")"; } elseif ($data['sort'] == 'p.price') { $sql .= " ORDER BY instock DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)"; } else { $sql .= " ORDER BY instock DESC, " . $data['sort']; } } else { $sql .= " ORDER BY instock DESC, p.sort_order"; }
Таким образом мы товары которых нет в наличии выводим в конце списка.
P.S. Не забудьте обновить кеш модификаторов после внесения правок для Opencart 2 версии.