Задача. В 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 |
## Скрыть при фильтрации по атрибуту 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; } } |