Как отобразить отсутствующие на складе и снятые с производства товары на последней позиции в списке товаров


Может ли кто-нибудь, пожалуйста, предложить по этому поводу.

На моем веб-сайте более 50 тысяч товаров, и я создал имя атрибута "Товары, снятые с производства" с опцией "да/нет", чтобы отображать статус товара, например, на складе или нет, поэтому нет необходимости отключать продукты для целей SEO, если продукт больше не существует на складе.

Теперь я хочу перечислить товары в приведенном ниже порядке на странице категории и странице результатов поиска, с которыми также должен работать заказ товара сортировка по параметрам фильтра (позиция, цена, название продукта).

  1. Товары на складе
  2. Отсутствуют ли продукты на складе
  3. Снятые с производства продукты

В настоящее время я использую версию magento 2.2.3.

Может ли кто-нибудь, пожалуйста, дать совет, как это будет сделано.

Author: Jack, 2018-12-07

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;
    }
 1
Author: Suman Singh, 2018-12-12 13:48:06