Magento 2 – Change Default OrderBy Parameter for Search Results

catalogsearchmagento2.3.3

How can I change the default order by value and direction for search results listing page?

The default is set to Relevance but I want to change this permanently to something else i.e. Price for example.

Best Answer

Try a below code. Tested in M2.3.

This will change the sorting option from Relevance to Price only for Search Result Page.

You can change the $defaultSortBy and $directionToSet as per your need.

File - Custom/SortBy/etc/frontend/di.xml

<type name="Magento\CatalogSearch\Block\Result">
    <plugin name="Custom_SortBy::setPriceSortBy" type="Custom\SortBy\Plugin\Search\Block\Result" sortOrder="100"/>
</type>

File - Custom/SortBy/Plugin/Search/Block/Result.php

<?php
namespace Custom\SortBy\Plugin\Search\Block;

use Magento\Framework\View\Element\AbstractBlock;
use Magento\Framework\View\Element\Template\Context as Context;
use Magento\Catalog\Model\Layer\Resolver as LayerResolver;
use Magento\Framework\View\Element\Template as ViewTemplate;
use Magento\Search\Model\QueryFactory;

class Result extends ViewTemplate
{
    public function __construct(
        Context $context,
        LayerResolver $layerResolver,
        QueryFactory $queryFactory,
        array $data =[]
    )
    {
        $this->_catalogLayer = $layerResolver->get();
        $this->_queryFactory = $queryFactory;
        parent::__construct($context, $data);
    }

    public function afterSetListOrders() {

        $query = $this->_queryFactory->get();
        $queryText = $query->getQueryText();

        $category = $this->_catalogLayer->getCurrentCategory();
        $availableOrders = $category->getAvailableSortByOptions();    
        unset($availableOrders['position']);
        $availableOrders['relevance'] = __('Relevance');

        $directionToSet = 'desc';
        $defaultSortBy = 'price';

        if($queryText == 'ABC') {
          $directionToSet = 'asc';
        } elseif($queryText == 'DEF') {
          $directionToSet = 'desc';
        } else {
          $directionToSet = 'desc';
        }

        $this->getLayout()->getBlock('search_result_list')->setAvailableOrders(
            $availableOrders
        )->setDefaultDirection(
            $directionToSet
        )->setDefaultSortBy(
            $defaultSortBy
        );
        return $this;

    }
}

File - Custom/SortBy/etc/module.xml if required

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