6

This question already has an answer here:

I want to custom sort by option in category Filter For price like this Price: Low to High & Price: High to Low.
Please suggest me how to change sorting option in my site. i am using magento 2.1.2

marked as duplicate by Keyul Shah, Fabian Schmengler, Siarhey Uchukhlebau, Arunendra, Amit Bera Mar 21 '17 at 9:10

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

19

Step 1: Create plugins

app/code/Vendor/Module/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

    <type name="Magento\Catalog\Block\Product\ProductList\Toolbar">
        <plugin name="custom_custom_block_toolbar" type="Vendor\Module\Plugin\Catalog\Block\Toolbar" />
    </type>

    <type name="Magento\Catalog\Model\Config">
        <plugin name="custom_catalog_model_config" type="Vendor\Module\Plugin\Catalog\Model\Config" />
    </type>

</config>

Step 2: Create Config.php

app/code/Vendor/Module/Plugin/Catalog/Model/Config.php

<?php

namespace Vendor\Module\Plugin\Catalog\Model;

class Config
{
    public function afterGetAttributeUsedForSortByArray(
    \Magento\Catalog\Model\Config $catalogConfig,
    $options
    ) {

        $options['low_to_high'] = __('Price - Low To High');
        $options['high_to_low'] = __('Price - High To Low');
        return $options;

    }

}

Step 3: Create Toolbar.php

app/code/Vendor/Module/Plugin/Catalog/Block/Toolbar.php

<?php
namespace Vendor\Module\Plugin\Catalog\Block;

class Toolbar
{

    /**
    * Plugin
    *
    * @param \Magento\Catalog\Block\Product\ProductList\Toolbar $subject
    * @param \Closure $proceed
    * @param \Magento\Framework\Data\Collection $collection
    * @return \Magento\Catalog\Block\Product\ProductList\Toolbar
    */
    public function aroundSetCollection(
    \Magento\Catalog\Block\Product\ProductList\Toolbar $subject,
    \Closure $proceed,
    $collection
    ) {
    $currentOrder = $subject->getCurrentOrder();
    $result = $proceed($collection);

    if ($currentOrder) {
        if ($currentOrder == 'high_to_low') {
            $subject->getCollection()->setOrder('price', 'desc');
        } elseif ($currentOrder == 'low_to_high') {
            $subject->getCollection()->setOrder('price', 'asc');
        }
    }

    return $result;
    }

}
  • Its not working. I tried to apply it in Magento 2.1.6 – Indian Jun 9 '17 at 5:34
  • No. Its not working in firefox as well. Your mention jquery function is not called. – Indian Jun 9 '17 at 6:08
  • 1
    Works like a charm – Shivam May 18 '18 at 11:52
  • 1
    It doesn't work for me for products with special_price. Can you check if it is working with a mixed set of products, without special price and with special price? – amitshree Feb 8 at 6:26
  • 1
    Thanks bro :) working fine with 2.3.0 and tested – Adarsh Ediyottil Aug 21 at 17:23

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