How To

Magento 2: Show Lowest and Highest Price on Category Page For Configurable Product

Hello Magento Folks?,

I hope all are awesome. Welcome to the Magento How-To Magento 2 blog. Today I am here with another interesting solution of the Magento 2: Show Lowest and Highest Price on Category Page For Configurable Product. Don’t forget to visit our last published blog about How to Custom Maintenance mode Page in Magento 2.

Let’s get started?

Introduction:

When we discuss Magento there are many advantages but when we focus on disadvantages then there is the incapability of displaying a price range for configurable products. Many times customers might be distracted with this and eliminate it to prefer shopping. So, to overcome this problem I will illustrate to you in the solution below.

Steps to Show Lowest and Highest Price on Category Page For Configurable Product:

Step 1: First, we need to create a “Registration.php” file inside our extension at the following path..

app\code\Vendor\Extension

<?php

\Magento\Framework\Component\ComponentRegistrar::register(

    \Magento\Framework\Component\ComponentRegistrar::MODULE,

    'Vendor_Extension',

    __DIR__

);

Step 2: After that, we need to create a “module.xml” file inside the extension, etc folder.

app\code\Vendor\Extension\etc

<?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="Vendor_Extension" setup_version="1.0.0" schema_version="1.0.0"/>

</config>

Step 3: After that, we need to create “di.xml” file inside below path folder to add file in module.

 app\code\Vendor\Extension\etc\frontend 

<?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\ListProduct">

        <plugin name="price_range" type="Vendor\Extension\Plugin\Block\Product\ListProduct" sortOrder="1"/>

    </type>

</config>

Step 4: After that, we need to create a “ListProduct.php” file inside the path folder to add the file in the module.

 app\code\Vendor\Extension\Plugin\Block\Product

<?php

namespace Vendor\Extension\Plugin\Block\Product;

use Magento\ConfigurableProduct\Model\Product\Type\Configurable;




class ListProduct

{

    protected $listProductBlock;

    protected $configurableProduct;

    protected $pricingHelper;

    protected $logger;




    public function __construct(

        Configurable $configurableProduct,

        \Magento\Framework\Pricing\Helper\Data $pricingHelper,

        \Psr\Log\LoggerInterface $logger

    ) {

        $this->configurableProduct = $configurableProduct;

        $this->pricingHelper = $pricingHelper;

        $this->logger = $logger;

    }




    public function aroundGetProductPrice(

        \Magento\Catalog\Block\Product\ListProduct $subject,

        \Closure $proceed,

        \Magento\Catalog\Model\Product $product) {




        if (Configurable::TYPE_CODE !== $product->getTypeId()) {

            return $proceed($product);

        }

        $this->listProductBlock = $subject;

        $priceText = $this->getPriceRange($product);

        return $priceText;

    }




    public function getPriceRange($product)

    {

        $childProductPrice = [];

        $childProducts = $this->configurableProduct->getUsedProducts($product);

        foreach($childProducts as $child) {

            $price = number_format($child->getPrice(), 2, '.', '');

            $finalPrice = number_format($child->getFinalPrice(), 2, '.', '');

            if($price == $finalPrice) {

                $childProductPrice[] = $price;

            } else if($finalPrice < $price) {

                $childProductPrice[] = $finalPrice;

            }

        }




        $max = $this->pricingHelper->currencyByStore(max($childProductPrice));

        $min = $this->pricingHelper->currencyByStore(min($childProductPrice));

        if($min==$max){

            return $this->getPriceRender($product, "$min", '');

        } else {

            return $this->getPriceRender($product, "$min-$max", '');

        }

    }




    protected function getPriceRender($product, $price, $text='')

    {

        return $this->listProductBlock->getLayout()->createBlock('Magento\Framework\View\Element\Template')

            ->setTemplate('Vendor_Extension::product/price/range/price.phtml')

            ->setData('price_id', 'product-price-'.$product->getId())

            ->setData('display_label', $text)

            ->setData('product_id', $product->getId())

            ->setData('display_value', $price)->toHtml();

    }

}

Step 5: Lastly, Create the “price.phtml” file inside the path folder in the module.

app\code\Vendor\Extension\view\frontend\templates\Product\Price\range

<div class="price-box range second price-final_price" data-role="priceBox" data-product-id="<?php /* @escapeNotVerified */ echo $block->getProductId() ?>">

    <span class="special-price">

        <span class="price-container price-final_price">

            <?php if ($block->getDisplayLabel()): ?>

                <span class="price-label"><?php /* @escapeNotVerified */ echo $block->getDisplayLabel(); ?></span>

            <?php endif; ?>

            <span <?php if ($block->getPriceId()): ?> id="<?php /* @escapeNotVerified */ echo $block->getPriceId() ?>"<?php endif;?>

                data-price-amount=""

                data-price-type="finalPrice1"

                class="price-wrapper">

                <span class="price"><?php /* @escapeNotVerified */ echo $block->getDisplayValue();?></span>

            </span>

        </span>

    </span>

</div>

That’s It.

Over to You

So, that was all for the day! With the help of these codes, you can successfully achieve the task of showing the lowest and highest price on the category page for the configurable products in Magento 2. You are free to play around and customize these codes according to your needs for fetching data. If you face any issues while implementing, then contact our Support Team. We will be happy to help you. If the article was helpful then do share with your Magento friends. 

Happy Coding?

Click to rate this post!
[Total: 9 Average: 3.7]
Dhiren Vasoya

Dhiren Vasoya is a Director and Co-founder at MageComp, Passionate ?️ Certified Magento Developer?‍?. He has more than 9 years of experience in Magento Development and completed 850+ projects to solve the most important E-commerce challenges. He is fond❤️ of coding and if he is not busy developing then you can find him at the cricket ground, hitting boundaries.?

Recent Posts

Generating Thumbnails with Spatie Media Library in Laravel 11: A Step-by-Step Guide

Generating image thumbnails is a common requirement in web applications, especially when handling media-heavy content.…

17 hours ago

Enhancing Web Application Security with Laravel’s Built-In Features

In today’s digital landscape, web application security is paramount. As a powerful PHP framework, Laravel…

2 days ago

Magento 2 Extensions Digest October 2024 (New Release & Updates)

October was an exciting month for MageComp! From significant updates across our Magento 2 extension…

2 days ago

Improving Error Handling and Transition Management in Remix with useRouteError and useViewTransitionState

In modern web development, seamless navigation and state management are crucial for delivering a smooth…

1 week ago

Magento Open Source 2.4.8-Beta Release Notes

Magento Open Source 2.4.8 beta version released on October  8, 2024. The latest release of…

2 weeks ago

How to Create Catalog Price Rule in Magento 2 Programmatically?

Hello Magento Friends, Creating catalog price rules programmatically in Magento 2 can be a valuable…

2 weeks ago