Задача. В WooCommerce есть проблема со стандартным виджетом фильтра по атрибуту и вариативными товарами. Когда в вариативном товаре нет в наличии какого-то варианта по атрибуту, то при фильтрации по это опции все равно товар отображается. Например, есть товар у него и несколько вариаций по атрибуту «размер»: 36, 40, 43. Если вариант 42 закончился и его нет в наличии, то при фильтрации по размеру 42 пользователь все равно может увидеть этот товар, хотя его нет в наличии.
Решение 1. Самое простое — это скрыть из Магазина товары которых нет в наличии в настройках Woocommerce — Настройки — Товары — Запасы — Видимость закончившихся (Спрятать отсутствующие товары из каталога)
(Изображение 1).
Но такой вариант не всегда уместен, т.к. товары скроются совсем из каталога, а не только при фильтрации. И с точки зрения SEO, лучше оставлять все товары.
Решение 2. Чтобы скрыть вариативные товары по опции которой нет в наличии именно при фильтрации, в functions.php
вставляем Код №1. В нем нужно заменить xxx-my-attribute
на свой атрибут (слаг атрибута? Изображение 2).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
## Скрыть при фильтрации по атрибуту xxx-my-attribute товары не в наличии (для вариативных товаров)
add_filter( ‘woocommerce_product_is_visible’, ‘hide_product_with_outofstock_variation’, 10, 2 );
if(!function_exists(‘hide_product_with_outofstock_variation’)){
function hide_product_with_outofstock_variation( $is_visible, $id ) {
$product = wc_get_product($id);
if ( $product–>is_type(‘variable’)) { // if variation product is out of stock
$available = $product–>get_available_variations();
if ( $available )foreach ( $available as $instockvar ) {
if(isset($_GET[‘filter_xxx-my-attribute’])){
$destostock = $_GET[‘filter_xxx-my-attribute’];
if($destostock ==$instockvar[‘attributes’][‘attribute_pa_xxx-my-attribute’]){
if($instockvar[‘is_in_stock’]){
$is_visible = true;
}else{
$is_visible = false;
}
}
}
}
}
return $is_visible;
}
}
|