Ноя
21
0

Як сховати відсутні товари в Woocommerce шорткодах та схожих товарах

Woocommerce товари не в наявностіБуквально сьогодні вирішував задачі, озвучені в заголовку статті, тому спішу поділитись з вам цим досвідом. Даний пост буде корисним доповненням до недавнього огляду модуля WHWS Display In Stock Products First який автоматично виводить всі відсутні товари в кінці глобального каталогу магазину. Але, на жаль, він не спрацьовує для шорткодів та списку схожих продуктів (Related Products). Тому потрібні додаткові сніпети.

Також на початку посту хочу залишити лінк на глобальний пост про наявність товарів в Woocommerce (опцію is_in_stock і т.п.), де зібрана різна інформація по темі, є приклади коду та трохи корисних посилань. Можливо пізніше я його перепишу, але поки не це немає часу.

Прибираємо товари з шорткодів Woocommerce (woocommerce_shortcode_products_query)

Для цієї задачі будемо юзати фільтр woocommerce_shortcode_products_query, який дозволяє задати спеціальні параметри вибірки (query запросу). Код додаєм до файлу функцій functions.php в вашому шаблоні.

add_filter( 'woocommerce_shortcode_products_query', function( $query_args, $atts, $loop_name ){
    if ( ( $loop_name == 'products' ) OR (( $loop_name == 'sale_products' ))){
        $query_args['meta_query'] = array( array(
            'key'     => '_stock_status',
            'value'   => 'outofstock',
            'compare' => 'NOT LIKE',
        ) );
    }
    return $query_args;
}, 10, 3);

Важливо! Тут в коді є параметр $loop_name, який означає назву Woocommerce шорткода, з яким ми працюємо. Як бачите я одночасно змінюю вибірку для загального шорткода продуктів [products] та товарів з розпродажу [sale_products]. В вашому магазині можуть буті і інші варіанти – враховуйте це. Якщо вам не потрібна така умова – просто приберіть блок IF з коду.

Момент2. Також в параметрах ви можете бачити використання meta_query де для ключа _stock_status виконується порівняння зі значенням «outofstock». Теоретично, тут можна трохи підправити логіку роботи щоб перевіряти наявність (instock) з параметром compare = IN (але я не пробував). Навіщо це треба? В ході тестування мені поки не попадались товари «під замовлення» (backorder products), тому є вірогідність, що код їх також відсіює. Цей момент треба тестити/дороблювати, якщо перед вами стоїть така задача.

Бонус. На просторах інтернету знайшов дещо схожий приклад коду який дозволить не просто прибрати відсутні товари, а видалити з відображення шоркодів небажану категорію. Для цього знов ж таки використовуємо фільтр woocommerce_shortcode_products_query але з іншими параметрами:

add_filter( 'woocommerce_shortcode_products_query', 'bbloomer_exclude_cat_shortcodes' );
function bbloomer_exclude_cat_shortcodes( $query_args ){ 
   $query_args['tax_query'][] = array( array( 
      'taxonomy' => 'product_cat', 
      'field' => 'slug', 
      'terms' => array( 'black' ), // Don't display products from this category
      'operator' => 'NOT IN'
   )); 
   return $query_args;
}

Я так розумію, що по схожій логіці в фільтр можна додавати обмеження по іншим опціям: даті, тегам і т.п.

Як прибрати відсутні товари зі схожих продуктів Woocommerce

Я пробував досить багато різних сніпетів, але вони не спрацьовували. Допоміг варіант коду з цієї статті. Додаєте його в файл функцій functions.

add_filter( 'woocommerce_related_products', 'exclude_oos_related_products', 10, 3 );
function exclude_oos_related_products( $related_posts, $product_id, $args ){
    $out_of_stock_product_ids = (array) wc_get_products( array(
          'status'       => 'publish',
          'limit'        => -1,
          'stock_status' => 'outofstock',
          'return'       => 'ids',
      ) );
 
    $exclude_ids = $out_of_stock_product_ids;
 
    return array_diff( $related_posts, $exclude_ids );
}

Нюанси. Єдиним мінусом цього рішення є те, що код не заміняє товари не в наявності на інші, а просто видаляє його з «фінальної видачі», тому в одному випадку у вас може відображатися 3 товара, в іншому – 2, 4 і т.п.

В шаблоні, з яким я працюю, є схожа по логіці функція woocommerce_output_related_products_args де навіть задані якісь аргументи. Я бачив в інтернеті приклади як у неї додавали параметр meta_query, але у мене це не працює!

Код для Woocommerce

Лише за рахунок сніпету, вказаного вище, мені вдалося вирішити мою задачу. Якщо у вас є інші варіанти рішень – присилайте лінки/інфу в коментах.

рейтинг Оцените статью:
Ужасная статьяНичего интересногоТак себеНормальноХорошоКлассный постВ закладки!
(голосов - 28, средний балл: 2,89 из 7)
Загрузка...

категория Категории: WooCommerce;
теги Теги: , , , , .
Оставить комментарий


Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!

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

Поиск:
Последние посты
Лучшее в категории

Облако тегов
Скажи свое мнение!

В чем основные плюсы Wordpress?

Посмотреть результаты

Загрузка ... Загрузка ...
Друзья проекта
Последние новости