Скрываем товары, которых нет в наличии со страницы каталога и категорий товаров

Это такой пост-дополнение к предыдущему посту, в котором мы сортировали товары по их наличию в интернет-магазине.

В этом уроке я покажу вам такой небольшой сниппет кода для functions.php, после вставки которого, со страницы «Магазин», категорий и меток товаров исчезнут те товары, которых нет в наличии.

Не могу не порекомендовать мой видеокурс по натяжке готовой вёрстки на WooCommerce.

Прежде, чем перейти к сниппетам кода, я хочу показать вам, где это делать в админке (сюрприз).

Как скрыть отсутствующие товары из каталога в админке

То есть по сути теперь, когда вы знаете про эту настроку, код вам уже не понадобится. Хотя с другой стороны, возможно вы захотите как-то по-другому его настроить.

add_filter( 'pre_get_posts', 'truemisha_show_in_stock_only', 25 );
 
function truemisha_show_in_stock_only( $query ) {
 
	if(
		! is_admin()
		&& $query->is_main_query()
		&& ( is_shop() || is_product_category() || is_product_tag() )
	) {
 
		$query->set( 
			'meta_query', 
			array( 
				array(
					'key'       => '_stock_status',
					'value'     => 'outofstock',
					'compare'   => 'NOT IN'
				)
			)
		);
 
	}
 
}

Прежде всего давайте скину вам ссылки на документации функций, используемых в этом сниппете кода:

Теперь давайте поговорим о мета-поле _stock_status в WooCommerce. Если перейти в настройки товара на вкладку «Запасы», то мы увидим три значения в выпадающем списке:

вкладка запасы в настройках товара WooCommerce

Так вот – это как раз три значения мета поля _stock_status:

  • instock – В наличии,
  • outofstock – Нет в наличии,
  • onbackorder – Предзаказ.

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 8

Комментирование этого поста более не доступно.
  • Владимир 3 июня 2020 #

    Спасибо за помощь! У меня возникло несколько вопросов:
    1) к примеру используем какой либо билдер и у него есть аддон вывода товаров из категорий магазина, скажем на главной странице сайта или на другой странице, посте, как в таком случаи выводить товары только "в наличии", проще говоря проверка, является это страницей или постом?
    2) Как выводить товары "в наличии" скажем для "рекомендуемые", "похожие" и т.д.

    • Миша 5 июня 2020 #

      1. Можно законнектить к условию is_page(), но важно не забывать, что в аддонах билдера могут быть свои фильтры-хуки

      2. Убрать строку 7 либо также, проверить на фильтры, там они вероятно есть.

  • Александр 5 июня 2020 #

    Проблема в другом.
    Даже если убрать товары, которых нет в наличии - будут пустые места вместо них в каталоге.
    Это сначала нужно отсортировать товары со статусом "нет в наличии" в самый конец кодом из прошлой статьи об остатках, а потом уже скрывать.

    • Миша 5 июня 2020 #

      У меня на самом деле есть сомнения относительно пустых мест.

      • Александр 18 июня 2020 #

        Протестируйте

  • Alex 14 июля 2020 #

    Миша, подскажи - как сделать - чтоб вариации были товара - в карточке, а которых нет - нельзя было бы выбрать - не могу найти
    Как на алике например - https://www.aliexpress.com/item/4000167087106.html

    • Миша 17 июля 2020 #

      Могу предложить метод get_stock_quantity().

      В контексте:

      $variation = new WC_Product_Variation( $variation_id );
      $stock = $variation->get_stock_quantity();
  • Sevimi 19 сентября 2020 #

    Может знаете, как сделать, что бы в каталоге были отсутствующие товары, но при этом не показывались в похожих?