/ Плагины / Фильтр по наличию

Фильтр по наличию

HIT

22.06.2022

1744

1

Оказывается в последних версиях Woocommerce есть встроенная функция фильтрации по наличию. Через добавление в url параметра filter_stock_status. Можно её использовать для создания фильтра:

Функция вывода списка:

add_action( 'woocommerce_before_shop_loop', 'add_filter_stock', 25 );
function add_filter_stock() { 
	echo '
	<select name="stock-switcher" id="stock-switcher">
		<option value="all">Все товары</option>
		<option value="instock">В наличии</option>		
		<option value="outofstock">Нет в наличии</option>
		<option value="onbackorder">Предзаказ</option>
	</select>
	';
}

Функция с условиями вывода элементов списка в зависимости от текущей категории, т.е. есть ли, например, товары не в наличии.

add_action( 'woocommerce_before_shop_loop', 'add_filter_stock', 25 );
function add_filter_stock() { 

	if ( !is_search() ) {

		$poductcatid = get_queried_object_id();

		$args = array(
			'post_type' => 'product',
			'numberposts' => -1,
			'fields' => 'ids',
			'tax_query' => array(
				array(
					'taxonomy' => 'product_cat',
					'field' => 'id',
					'terms' => $poductcatid
				),
			)
		);

		$products = get_posts( $args );

		foreach($products as $product){
			$produts_status[] = get_post_meta( $product, '_stock_status', true );;
		}
		
		$produts_status_uniq = array_unique($produts_status);
		wp_reset_postdata();	
		
		echo '<select name="stock-switcher" id="stock-switcher"><option value="all">Все товары</option>';
		if (in_array('instock', $produts_status_uniq)) { echo '<option value="instock">В наличии</option>'; }
		if (in_array('onbackorder', $produts_status_uniq)) { echo '<option value="onbackorder">Предзаказ</option>'; }
		if (in_array('outofstock', $produts_status_uniq)) { echo '<option value="outofstock">Нет в наличии</option>'; }
		echo '</select>';		
		
	}

}

Согласно условию (!is_search()) данный фильтр не будет выводится в шаблоне результатов поиска, т.к. в этом случае нужно дорабатывать и скрипт.

Скрипт изменения url:

// Фильтр по наличию
jQuery(document).ready(function($) { 
	
	var url = window.location.href;
	
	if (url.includes("filter_stock_status")) {
		
		var stockcur = url.split('filter_stock_status=')[1];
		$("#stock-switcher").val(stockcur);
		
	}
	
	
	$('#stock-switcher').on('change', function () {
		
		var url = window.location.href;
		url = url.split('?')[0];

		var stockwait = $("#stock-switcher option:selected").val();
		
		if ( stockwait == 'all' ) {
			window.location.replace(url);
		} else {
			window.location.replace(url + '?filter_stock_status=' + stockwait);
		}
		
	});
	
});

Данное решение правильно работает со стандартной пагинацией. Не работает в шаблоне поиска, а также с другими фильтрами.

[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Скидки Woocommerce

Скидки Woocommerce

Добавляем и настраиваем в woocommerce различные системы скидок. Стандартная скидка Woocommerce Можно включить «акционную» цену на товар, к ней можно добавить дату окончания скидки. У товара появляется лэйбл «Распродажа», можно Читать далее »

Акция 20% на каждый 3 и 30% на каждый 4 товар

Акция 20% на каждый 3 и 30% на каждый 4 товар

Поступила нестандартная задача, реализовать акцию 20% на каждый 3 и 30% на каждый 4 товар. Сложность заключалась в том что скидки 20% и 30% должны были действовать на товары начиная Читать далее »

Шорткод вывода товаров по метке

Шорткод вывода товаров по метке

Иногда требуется быстро вывести товары с определенной меткой. Данный шорткод проверял лично — работает. В данной функции предусмотрен вывод товаров по колонкам (wc_get_loop_prop( ‘columns’ )). Шорткод выглядит так: Данный шорткод Читать далее »

/

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

1 комментарий

  1. Филипп

    Огромное спасибо! Кучу всего перепробовал, заработал только данный способ!

Фильтр по наличию Фильтр по наличию
Выводим записи у которых нет миниатюры
Рекомендации для васВыводим записи у которых нет миниатюрыOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.