Posted on

Magento2 : Category Page (Product Listing Page) Custom Sorting Option Not Working

I Want TO Display Product Based On Product Stock On Category Page. I Have Used Code As Below. I Have Used the Around Plugin To Set Collection.

File:- di.xml

VendorModuleetcdi.xml

<type name=”MagentoCatalogBlockProductProductListToolbar”>
<plugin name=”custom_custom_block_toolbar” type=”VenndorModulePluginCatalogBlockToolbar”/>
</type>
<type name=”MagentoCatalogModelConfig”>
<plugin name=”custom_catalog_model_config” type=”VenndorModulePluginCatalogModelConfig”/>
</type>

File:-Toolbar.php

VendorModulePluginCatalogBlockToolbar.php

public function aroundSetCollection(MagentoCatalogBlockProductProductListToolbar $subject,Closure $proceed, $collection)
{
$currentOrder = $subject->getCurrentOrder();

if ($currentOrder == “Stocklowhigh”) {

$collection->setCurPage($collection->getCurPage());
$collection->getSelect()->reset(‘where’);
$collection->getSelect()->reset(‘order’);
$collection->getSelect()->distinct(true)
->joinLeft(
[‘cataloginventory_stock_item’],
‘e.entity_id = cataloginventory_stock_item.product_id’,
[‘cataloginventory_stock_item.qty’,’cataloginventory_stock_item.is_in_stock’]
)->order(‘is_in_stock DESC ‘)->order(‘qty DESC’);
}
}

File:-Config.php

VendorModulePluginCatalogModelConfig.php

public function afterGetAttributeUsedForSortByArray(MagentoCatalogModelConfig $catalogConfig, $results)
{
if($this->helper->getGeneralConfig(‘enable’) == 1){
$results[‘Stocklowhigh’] = __(‘Stock’);
}

return $results;
}

I Tried To Get Sorting Based On a Name With Custom Sorting Order But it Didn’t Work.

For Example:

$collection->setOrder(‘name’,’asc’) //Will Works

if ($currentOrder == “Stocklowhigh”) {
$collection->setOrder(‘name’,’asc’); //Will Not Work
}

If We Code Inside If Condition Page Goes Blank As Per Given Screenshot.

flameshot_screenshot

I Print Current Page Working SQL Query And Found That After using CurrentOrder Condition SQL Query Adds (NULL) In Where Condition.

SQL:-
SELECT `e`.*, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price`, IFNULL(review_summary.reviews_count, 0) AS `reviews_count`, IFNULL(review_summary.rating_summary, 0) AS `rating_summary`, `stock_status_index`.`stock_status` AS `is_salable` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.customer_group_id = 0 AND price_index.website_id = ‘1’ LEFT JOIN `review_entity_summary` AS `review_summary` ON e.entity_id = review_summary.entity_pk_value AND review_summary.store_id = 1 AND review_summary.entity_type = (SELECT `review_entity`.`entity_id` FROM `review_entity` WHERE (entity_code = ‘product’)) INNER JOIN `cataloginventory_stock_status` AS `stock_status_index` ON e.entity_id = stock_status_index.product_id WHERE (NULL)

Leave a Reply

Your email address will not be published.