I have asked this before but never found an answer.
If a simple product has a discounted price, it will show the original price crossed out and the discounted price on the category page.
However, if it is a configurable product with multiple color options and the options all have the same price and discount. It only shows the discounted price, not the original crossed out.
Any ideas how to fix this ?
Hello @mousepad,
I copied below file into my theme and removed !$block->isProductList() && on line 22:
vendor/magento/module-configurable-product/view/base/templates/product/price/final_price.phtml
<?php if (!$block->isProductList() && $block->hasSpecialPrice()): ?>
and both prices now show up.
Both show up also if only one simple product is special-priced so this could be a good solution only when all simples are special-priced, otherwise for those which are not, it shows inconsistent data.
--
If my answer is useful, please Accept as Solution & give Kudos
Any other solutions ??
This is a serious bug in Magento
vendor/magento/module-configurable-product/view/base/templates/product/price
original file -
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
// @codingStandardsIgnoreFile
?>
<?php
/** @var \Magento\ConfigurableProduct\Pricing\Render\FinalPriceBox$block */
/** @var \Magento\Framework\Pricing\Price\PriceInterface $priceModel */
$priceModel = $block->getPriceType('regular_price');
/** @var \Magento\Framework\Pricing\Price\PriceInterface $finalPriceModel */
$finalPriceModel = $block->getPriceType('final_price');
$idSuffix = $block->getIdSuffix() ? $block->getIdSuffix() : '';
$schema = ($block->getZone() == 'item_view') ? true : false;
?>
<?php if ($finalPriceModel->getAmount()->getValue() !== null): ?>
<span class="normal-price">
<?php
$arguments = [
'display_label' => __('As low as'),
'price_id' => $block->getPriceId('product-price-' . $idSuffix),
'price_type' => 'finalPrice',
'include_container' => true,
'schema' => $schema
];
/* @noEscape */ echo $block->renderAmount($finalPriceModel->getAmount(), $arguments);
?>
</span>
<?php if (!$block->isProductList() && $block->hasSpecialPrice()): ?>
<span class="old-price sly-old-price no-display">
<?php /* @escapeNotVerified */ echo $block->renderAmount($priceModel->getAmount(), [
'display_label' => __('Regular Price'),
'price_id' => $block->getPriceId('old-price-' . $idSuffix),
'price_type' => 'oldPrice',
'include_container' => true,
'skip_adjustments' => true
]); ?>
</span>
<?php endif; ?>
<?php endif; ?>
<?php if ($block->showMinimalPrice()): ?>
<?php if ($block->getUseLinkForAsLowAs()):?>
<a href="<?php /* @escapeNotVerified */ echo $block->getSaleableItem()->getProductUrl(); ?>" class="minimal-price-link">
<?php /* @escapeNotVerified */ echo $block->renderAmountMinimal(); ?>
</a>
<?php else:?>
<span class="minimal-price-link">
<?php /* @escapeNotVerified */ echo $block->renderAmountMinimal(); ?>
</span>
<?php endif?>
<?php endif; ?>
try this code
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
// @codingStandardsIgnoreFile
?>
<?php
/** @var \Magento\ConfigurableProduct\Pricing\Render\FinalPriceBox$block */
/** @var \Magento\Framework\Pricing\Price\PriceInterface $priceModel */
$priceModel = $block->getPriceType('regular_price');
/** @var \Magento\Framework\Pricing\Price\PriceInterface $finalPriceModel */
$finalPriceModel = $block->getPriceType('final_price');
$idSuffix = $block->getIdSuffix() ? $block->getIdSuffix() : '';
$schema = ($block->getZone() == 'item_view') ? true : false;
?>
<?php if ($finalPriceModel->getAmount()->getValue() !== null): ?>
<span class="normal-price">
<?php
$arguments = [
'display_label' => __('As low as'),
'price_id' => $block->getPriceId('product-price-' . $idSuffix),
'price_type' => 'finalPrice',
'include_container' => true,
'schema' => $schema
];
/* @noEscape */ echo $block->renderAmount($finalPriceModel->getAmount(), $arguments);
?>
</span>
<?php if ($block->hasSpecialPrice()): ?>
<span class="old-price">
<?php /* @escapeNotVerified */ echo $block->renderAmount($priceModel->getAmount(), [
'display_label' => __('Regular Price'),
'price_id' => $block->getPriceId('old-price-' . $idSuffix),
'price_type' => 'oldPrice',
'include_container' => true,
'skip_adjustments' => true
]); ?>
</span>
<?php endif; ?>
<?php endif; ?>
<?php if ($block->showMinimalPrice()): ?>
<?php if ($block->getUseLinkForAsLowAs()):?>
<a href="<?php /* @escapeNotVerified */ echo $block->getSaleableItem()->getProductUrl(); ?>" class="minimal-price-link">
<?php /* @escapeNotVerified */ echo $block->renderAmountMinimal(); ?>
</a>
<?php else:?>
<span class="minimal-price-link">
<?php /* @escapeNotVerified */ echo $block->renderAmountMinimal(); ?>
</span>
<?php endif?>
<?php endif; ?>
Great! This worked for me. After spending hours searching....
This actually worked for me.
Copy final_price.phtml from:
/app/code/Magento/Catalog/view/base/templates/product/price/final_price.phtml
to:
in this i did created /price/ folder and copy the filefinal_price.phtml there (since it didn't existed in my themplate)
/app/design/frontend/Magento/luma/Magento_ConfigurableProduct/templates/product/price/final_price.phtml
FINAL CODE for: final_price.phtml
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ /** @var \Magento\ConfigurableProduct\Pricing\Render\FinalPriceBox$block */ /** @var \Magento\Framework\Pricing\Price\PriceInterface $priceModel */ $priceModel = $block->getPriceType('regular_price'); /** @var \Magento\Framework\Pricing\Price\PriceInterface $finalPriceModel */ $finalPriceModel = $block->getPriceType('final_price'); $idSuffix = $block->getIdSuffix() ? $block->getIdSuffix() : ''; $schema = ($block->getZone() == 'item_view') ? true : false; ?> <span class="normal-price"> <?= /* @noEscape */ $block->renderAmount($finalPriceModel->getAmount(), [ 'price_id' => $block->getPriceId('product-price-' . $idSuffix), 'price_type' => 'finalPrice', 'include_container' => true, 'schema' => $schema, ]); ?> </span> <?php if ($block->hasSpecialPrice()): ?> <span class="old-price sly-old-price"> <?= /* @noEscape */ $block->renderAmount($priceModel->getAmount(), [ 'price_id' => $block->getPriceId('old-price-' . $idSuffix), 'price_type' => 'oldPrice', 'include_container' => true, 'skip_adjustments' => true ]); ?> </span> <?php endif; ?> <?php if ($block->showMinimalPrice()) : ?> <?php if ($block->getUseLinkForAsLowAs()) :?> <a href="<?= $block->escapeUrl($block->getSaleableItem()->getProductUrl()) ?>" class="minimal-price-link"> <?= /* @noEscape */ $block->renderAmountMinimal() ?> </a> <?php else :?> <span class="minimal-price-link"> <?= /* @noEscape */ $block->renderAmountMinimal() ?> </span> <?php endif?> <?php endif; ?>
This works in 2.4.5. The only change you should make in
./vendor/magento/configurable-product/view/base/templates/product/price/final_price.phtml
is to remove
sly-old-price no-display
classes.
./vendor/magento/module-configurable-product/view/adminhtml/web/js/configurable.js overrides CSS if it finds sly-old-price and there's some config setting for it, but I didn't bother to dig deeper. no-display is there to hide the span by default to defer its rendering to js.
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ /** @var \Magento\ConfigurableProduct\Pricing\Render\FinalPriceBox$block */ /** @var \Magento\Framework\Pricing\Price\PriceInterface $priceModel */ $priceModel = $block->getPriceType('regular_price'); /** @var \Magento\Framework\Pricing\Price\PriceInterface $finalPriceModel */ $finalPriceModel = $block->getPriceType('final_price'); $idSuffix = $block->getIdSuffix() ? $block->getIdSuffix() : ''; $schema = ($block->getZone() == 'item_view') ? true : false; ?> <span class="normal-price"> <?= /* @noEscape */ $block->renderAmount($finalPriceModel->getAmount(), [ 'display_label' => __('As low as'), 'price_id' => $block->getPriceId('product-price-' . $idSuffix), 'price_type' => 'finalPrice', 'include_container' => true, 'schema' => $schema, ]); ?> </span> <?php if (!$block->isProductList() && $block->hasSpecialPrice()) : ?> <span class="old-price"> <?= /* @noEscape */ $block->renderAmount($priceModel->getAmount(), [ 'display_label' => __('Regular Price'), 'price_id' => $block->getPriceId('old-price-' . $idSuffix), 'price_type' => 'oldPrice', 'include_container' => true, 'skip_adjustments' => true ]); ?> </span> <?php endif; ?> <?php if ($block->showMinimalPrice()) : ?> <?php if ($block->getUseLinkForAsLowAs()) :?> <a href="<?= $block->escapeUrl($block->getSaleableItem()->getProductUrl()) ?>" class="minimal-price-link"> <?= /* @noEscape */ $block->renderAmountMinimal() ?> </a> <?php else :?> <span class="minimal-price-link"> <?= /* @noEscape */ $block->renderAmountMinimal() ?> </span> <?php endif?> <?php endif; ?>
@mousepad wrote:I have asked this before but never found an answer.
If a simple product has a discounted price, it will show the original price crossed out and the discounted price on the category page like ev brake pads shown in its website.
However, if it is a configurable product with multiple color options and the options all have the same price and discount. It only shows the discounted price, not the original crossed out.
Any ideas how to fix this ?
Thanks for that question. I also looking for answer but don't know how to do question. i also apply method from answer and it works.