Как в WooCommerce отображать товары только из наличия?

Если требуется скрыть товары которых нет в наличии, то необходимо выполнить два условия:

  1. Включить функцию Управления запасами. Перейдите в раздел WooCommerce > Настройки > вкладка Товары > Запасы и включите функцию управления запасами
  1. Далее, в нижней части страницы отметьте чекбокс Спрятать отсутствующие товары из каталога
спрятать товары которых нет в наличии

Вот и всё! Теперь давайте посмотрим, как это работает. Перейдём в карточку любого товара к разделу его статуса:

статус наличия

Когда отмечен статус В наличии мы можем наблюдать наш товар на витрине нашего электронного магазина:

В наличии

Теперь поставим настройку Нет в наличии и снова обратимся к витрине нашего магазина:

Нет в наличии

Товар исчез. Так мы и ожидали. Но что будет, если попробовать найти его через поиск?

товар не доступен для поиска

Да! Ожидаемое поведение, хороший UX. Исключенные товары (которых нет в наличии) при этой настройке не доступны для поиска.

Но у нас остался ещё один статус — Предзаказ. Давайте отметим его и посмотрим, что из этого получится.

  1. Товар появится на витрине
  2. Товар будет доступен для поиска

Получается, что эта настройка не относится к исключаемой. Но что если нам необходимо показывать товары которые есть в только наличии и скрывать товары которых нет в наличии и которые имеют статус предзаказа? В этом случае быстро задачу можно решить при помощи кода. Небольшой сниппет, который необходимо добавить к функциям вашей активной темы или вот этим безопасным методом.

В 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) — скрыты.

Автор

Evgeni

Веб-разработчик, фрилансер и фанат WordPress с 2012 года. На этом сайте делюсь заметками для начинающих по разработке на WordPress. Надеюсь увидеть вас в числе своих подписчиков.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *