Как отобразить отсутствующие на складе и снятые с производства товары на последней позиции в списке товаров
Может ли кто-нибудь, пожалуйста, предложить по этому поводу.
На моем веб-сайте более 50 тысяч товаров, и я создал имя атрибута "Товары, снятые с производства" с опцией "да/нет", чтобы отображать статус товара, например, на складе или нет, поэтому нет необходимости отключать продукты для целей SEO, если продукт больше не существует на складе.
Теперь я хочу перечислить товары в приведенном ниже порядке на странице категории и странице результатов поиска, с которыми также должен работать заказ товара сортировка по параметрам фильтра (позиция, цена, название продукта).
- Товары на складе
- Отсутствуют ли продукты на складе
- Снятые с производства продукты
В настоящее время я использую версию magento 2.2.3.
Может ли кто-нибудь, пожалуйста, дать совет, как это будет сделано.
1 answers
Вы можете изменить порядок сортировки продуктов для листинга с помощью пользовательского наблюдателя на событии catalog_block_product_list_collection
.
Я предполагаю, что код атрибута "Снятые с производства товары" является discontinued_items_flag
От администратора вы можете выполнить следующие действия:
Перейдите в раздел Магазины->Атрибуты->Товар, затем щелкните и отредактируйте свой атрибут.
Используется в списке продуктов = Да
Используется для сортировки в списке продуктов = Да
Ваш код наблюдателя будет выглядеть например:
$collection = $observer->getEvent()->getCollection();
//If you have multi location inventory
//$websiteId = $this->_storeManager->getStore()->getWebsiteId();
$websiteId = 0;
/* For In/Out of stock Products */
$stockId = 'stock_id';
$collection->getSelect()->joinLeft(
array('_inv' => $collection->getResource()->getTable('cataloginventory_stock_status')),
"_inv.product_id = e.entity_id and _inv.website_id=$websiteId and _inv.stock_id=$stockId",
array('stock_status')
);
$collection->addExpressionAttributeToSelect('in_stock', 'IFNULL(_inv.stock_status,0)', array());
$collection->getSelect()->reset('order');
$collection->addAttributeToSort('in_stock', 'DESC');
$collection->addAttributeToSort('discontinued_items_flag', 'ASC');
return $this;
Для работы с фильтром вы можете сделать следующее:
/* set __construct dependency for \Magento\Framework\App\Request\Http $request */
$sortOrder = $this->request->getParam('product_list_order');
$sortDir = $this->request->getParam('product_list_dir');
$sortDir = (empty($sortDir))?'ASC':$sortDir;
switch ($sortOrder) {
case 'position':
$collection->addAttributeToSort('in_stock', 'DESC');
$collection->addAttributeToSort('discontinued_items_flag', 'ASC');
$collection->addAttributeToSort('position', $sortDir);
break;
case 'name':
//$finalSortOrder = 'name';
$collection->addAttributeToSort('in_stock', 'DESC');
$collection->addAttributeToSort('discontinued_items_flag', 'ASC');
$collection->addAttributeToSort('name', $sortDir);
break;
default:
$collection->addAttributeToSort('in_stock', 'DESC');
$collection->addAttributeToSort('discontinued_items_flag', 'ASC');
$collection->addAttributeToSort('position', $sortDir);
break;
}