I am trying to implement this feature: the filters that are shown in the search results page are only visible if every products in that results page have the attribute linked with the filter populated.
For instance, a search result have 2 products:
- product A with attribute Attribute1 and Attribute2 both populated
- Product B with only the Attribute1 populated
I would like that the filter shown in the search result is only the filter of the Attribute1 (because the product B doesn't have the Attribute2 populated).
I already did this with the layered navigation on categories, by modifying the following file:
/var/www/html/magento/vendor/magento/module-layered-navigation/view/frontend/templates/layer/view.phtm
in the following way:
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
?>
<?php
/**
* Category layered navigation
*
* @var $block \Magento\LayeredNavigation\Block\Navigation
*/
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');
?>
<?php if ($block->canShowBlock()) : ?>
<div class="block filter">
<div class="block-title filter-title">
<strong><?= $block->escapeHtml(__('Shop By')) ?></strong>
</div>
<div class="block-content filter-content">
<?= $block->getChildHtml('state') ?>
<?php if ($block->getLayer()->getState()->getFilters()) : ?>
<div class="block-actions filter-actions">
<a href="<?= $block->escapeUrl($block->getClearUrl()) ?>" class="action clear filter-clear"><span><?= $block->escapeHtml(__('Clear All')) ?></span></a>
</div>
<?php endif; ?>
<?php $wrapOptions = false; ?>
<?php foreach ($block->getFilters() as $filter) : ?>
<?php if (!$wrapOptions) : ?>
<strong role="heading" aria-level="2" class="block-subtitle filter-subtitle"><?= $block->escapeHtml(__('Shopping Options')) ?></strong>
<dl class="filter-options" id="narrow-by-list">
<?php $wrapOptions = true;
endif; ?>
<?php if ($filter->getItemsCount()>1) : ?>
<?php if($filter->getName() != __('Category')) : ?>
<?php if ($category->getProductCollection()->count() == $category->getProductCollection() ->addAttributeToSelect('sku') ->addAttributeToFilter($block->escapeHtml(__($filter->getRequestVar())),array('notnull'=>true))->getSize()) : ?>
<dt role="heading" aria-level="3" class="filter-options-title"><?= $block->escapeHtml(__($filter->getName())) ?></dt>
<dd class="filter-options-content"><?= /* @noEscape */ $block->getChildBlock('renderer')->render($filter) ?></dd>
<?php endif; ?>
<?php else: ?>
<dt role="heading" aria-level="3" class="filter-options-title"><?= $block->escapeHtml(__($filter->getName())) ?></dt>
<dd class="filter-options-content"><?= /* @noEscape */ $block->getChildBlock('renderer')->render($filter) ?></dd>
<?php endif; ?>
<?php endif; ?>
<?php endforeach; ?>
<?php if ($wrapOptions) : ?>
</dl>
<?php endif; ?>
</div>
</div>
<?php endif; ?>
But I cannot do the same with the search result. Can please somebody help me?
Thank you