Если требуется скрыть товары которых нет в наличии, то необходимо выполнить два условия:
- Включить функцию Управления запасами. Перейдите в раздел WooCommerce > Настройки > вкладка Товары > Запасы и включите функцию управления запасами
- Далее, в нижней части страницы отметьте чекбокс Спрятать отсутствующие товары из каталога
Вот и всё! Теперь давайте посмотрим, как это работает. Перейдём в карточку любого товара к разделу его статуса:
Когда отмечен статус В наличии мы можем наблюдать наш товар на витрине нашего электронного магазина:
Теперь поставим настройку Нет в наличии и снова обратимся к витрине нашего магазина:
Товар исчез. Так мы и ожидали. Но что будет, если попробовать найти его через поиск?
Да! Ожидаемое поведение, хороший UX. Исключенные товары (которых нет в наличии) при этой настройке не доступны для поиска.
Но у нас остался ещё один статус — Предзаказ. Давайте отметим его и посмотрим, что из этого получится.
- Товар появится на витрине
- Товар будет доступен для поиска
Получается, что эта настройка не относится к исключаемой. Но что если нам необходимо показывать товары которые есть в только наличии и скрывать товары которых нет в наличии и которые имеют статус предзаказа? В этом случае быстро задачу можно решить при помощи кода. Небольшой сниппет, который необходимо добавить к функциям вашей активной темы или вот этим безопасным методом.
В WordPress есть специальный хук-action pre_get_posts, который позволяет изменять информацию экземпляра текущего запроса $wp_query и при помощи «сеттеров» мы можем повлиять на текущий запрос. Выглядит в виде кода это примерно так:
add_filter( 'pre_get_posts', 'poet_show_in_stock_only', 100 );
function poet_show_in_stock_only( $query ) {
// не админка и это основной запрос с публичной части сайта
if ( ! is_admin() && $query->is_main_query() ) {
$query->set(
'meta_query',
[
[
'key' => '_stock_status',
'value' => [ 'outofstock', 'onbackorder' ], // исключаем
'compare' => 'NOT IN'
]
]
);
}
}
На самом деле тут нет ничего хитрого. Мы подключились в момент вызова это «экшена» с нашей функцией и сразу начали с проверки того, что: это не административная часть (т.к. запрос предназначен только для публичной, клиентской части сайта). Далее проверка что это основной запрос который выполняется в стандартном цикле WordPress и далее при помощи set мы устанавливаем новые аргументы в наш запрос, в которых исключаем товары со статусом: нет в наличии и предзаказ.
Но этого мало. При помощи условных тегов, которые справедливы только для WooCommerce, мы можем конкретизировать наш запрос и добавить ещё блок условий при которых будет вызываться наш «сеттер»:
add_filter( 'pre_get_posts', 'poet_show_in_stock_only', 100 );
function poet_show_in_stock_only( $query ) {
// не админка и это основной запрос с публичной части сайта
if ( ! is_admin() && $query->is_main_query() ) {
if ( is_shop() || is_product_category() || is_product_tag() ) {
$query->set(
'meta_query',
[
[
'key' => '_stock_status',
'value' => [ 'outofstock', 'onbackorder' ],
'compare' => 'NOT IN'
]
]
);
}
}
}
- is_shop() — Главная архивная страница товаров (как правило адрес /shop/ )
- is_product_category() — Страница Категории товаров
- is_product_tag() — аналогично Категории, но только страница каталога с товарами объединённых определённым тегом (меткой)
После добавления данного кода будут отображаться товары только со статусом В наличии (instock), а Нет в наличии (outofstock) и Предзаказ (onbackorder) — скрыты.