HUSKY - WooCommerce Product Filter Professional

Фільтр WooCommerce: показувати лише атрибути поточної категорії

Коли кілька категорій товарів мають спільний атрибут, фільтр WooCommerce часто пропонує значення, які на сторінці не мають сенсу: Гриль серед холодильників, 512 ГБ серед навушників, бренди, яких у цій категорії немає в продажу. Клік по них дає порожній результат. Щоб фільтр WooCommerce показував лише атрибути поточної категорії, HUSKY підраховує товари за кожним терміном на сторінці й ховає терміни з нульовим лічильником. Нижче описано, як це працює, точні налаштування, як прибрати числа з очей і в яких випадках категорія взагалі невідома.

Як фільтр дізнається, що належить до поточної категорії

На сторінці категорії товарів і на будь-якому іншому архіві таксономії товарів (мітка, архів атрибута, бренд) HUSKY запам’ятовує термін, який показує сторінка. Коли ввімкнено Динамічний перерахунок (Dynamic recount), число біля кожного терміна фільтра обчислюється так: товари цієї категорії, що відповідають усьому, що відвідувач уже вибрав, і водночас мають цей термін. Значення, якого не має жоден товар категорії, отримує 0.

Далі Приховувати порожні терміни (Hide empty terms) прибирає з форми кожен термін із 0. Коли зникають усі терміни секції, разом із ними зникає й уся секція, разом із заголовком, тож атрибут, який у категорії не використовується, пропадає з сайдбару. Секція категорій скорочується до підкатегорій категорії, що переглядається; цю частину та її винятки пояснює стаття чому фільтр показує лише підкатегорії.

Налаштовувати щось для кожної категорії окремо не потрібно. Та сама форма в сайдбарі чи в шаблоні категорії сама підлаштовується під кожну сторінку категорії.

Три налаштування, що приховують порожні терміни

Відкрийте налаштування плагіна, вкладку Параметри (Options), і встановіть:

  1. Показувати кількість (Show count): Так
  2. Динамічний перерахунок (Dynamic recount): Так
  3. Приховувати порожні терміни (Hide empty terms): Так

Збережіть, а потім очистіть усі кеші, які можуть зберігати старі лічильники: Кешувати кількість динамічного перерахунку для кожного елемента у фільтрі (Cache dynamic recount number for each item in filter) і Кешувати терміни (Cache terms) у Додатково → Параметри (Advanced → Options), якщо ви ними користуєтеся, а також кеш сторінок вашого сайту.

Ці три опції залежать одна від одної, і сторінка налаштувань це забезпечує: порожній термін можна знайти лише підрахунком. Увімкнення Приховувати порожні терміни (Hide empty terms) вмикає й дві інші, а вимкнення Показувати кількість (Show count) вимикає дві інші. Якщо ви поставите Показувати кількість (Show count) у «Ні», щоб позбутися чисел, порожні терміни повернуться на кожній сторінці. Можливі комбінації:

Показувати кількість / Динамічний перерахунок / Приховувати порожні терміниЩо бачать відвідувачі
Ні / Ні / НіУсі терміни, без чисел
Так / Ні / НіЧисла по всьому магазину; терміни без жодного товару виділені сірим
Так / Так / НіЧисла для поточної категорії та вибору; нульові терміни залишаються видимими, але сірими й недоступними для вибору
Так / Так / ТакНульові терміни приховано; порожні секції зникають

Третій рядок — вибір для тих, хто воліє показувати недоступні значення неактивними, а не прибирати їх. Глобальні опції можуть перекривати ще кілька місць:

  • У безкоштовній версії Приховувати порожні терміни (Hide empty terms) і Приховувати текст кількості термінів (Hide terms count text) (про нього нижче) неактивні; вони входять до преміум-версії.
  • У віджета фільтра HUSKY є власне поле Динамічний перерахунок (Dynamic recount) (За замовчуванням (Default), Ні (No), Так (Yes)). Якщо там вибрано Ні (No), цей віджет ігнорує глобальне налаштування. Шорткод [woof] має такий самий перемикач: dynamic_recount=1 або dynamic_recount=0.
  • Коли ввімкнено режим Turbo, на вкладці Параметри (Options) з’являються окремі копії цих трьох налаштувань для режиму Turbo. Після його ввімкнення задайте їх знову.
  • Таксономію, показану як повзунок діапазону, глобальні опції не перераховують. Відкрийте її додаткові опції (значок шестерні біля таксономії на вкладці Структура (Structure)) і встановіть Увімкнути динамічний перерахунок (Enable dynamic recount) у «Так»; значення без товарів тоді випадають зі шкали повзунка.

Інші налаштування на тому самому екрані описує документація вкладки Options.

Приховати порожні терміни, не показуючи кількість

Найпоширеніше бажання — приховати порожні терміни, не виводячи числа на кшталт (12). Залиште всі три опції ввімкненими й відкрийте Додатково → Параметри (Advanced → Options): встановіть Приховувати текст кількості термінів (Hide terms count text) у «Так». Плагін і далі обчислює лічильники — вони потрібні, щоб знати, що порожнє, — але не виводить їх. Щоб зробити це лише для однієї форми, додайте до її шорткоду hide_terms_count=1, наприклад [woof hide_terms_count=1].

Приховування лічильника через CSS також працює для чекбоксів і радіокнопок (.woof_checkbox_count, .woof_radio_count), але не для випадних списків: там число є частиною тексту опції й не має власного елемента. Налаштування охоплює всі типи фільтрів.

Щоб змінити лічильник лише в деяких секціях, скористайтеся хуком woof_term_count_format. Він отримує формат, за замовчуванням (%d), і слаг таксономії:

/*
 * HUSKY: counter format per filter section.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woof_term_count_format', function ($format, $tax_slug) {
    // no numbers at all in the Tags and Brand sections
    if (in_array($tax_slug, array('product_tag', 'pa_brand'), true)) {
        return '';
    }
    // "12" instead of "(12)" everywhere else
    return '%d';
}, 10, 2);

У цих секціях порожні терміни все одно приховуються, бо приховування залежить від обчисленого значення, а не від виведеного тексту. Щоб показувати числа лише на найнижчому рівні дерева категорій, сховайте через CSS лічильники термінів, які мають дочірні (поле Custom CSS вашої теми):

.woof_childs_list_li > .woof_checkbox_label > .woof_checkbox_count {
    display: none;
}

Вибраний термін ніколи не показує число. Так задумано: перерахунок пропускає терміни, які вже входять до пошуку.

Чому після першого вибору зникають інші значення

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

Інша ситуація — коли вибір одного кольору ховає всі інші. Це випливає з логіки секції. Відкрийте додаткові опції таксономії (значок шестерні на вкладці Структура (Structure)) і подивіться на Логіка фільтрації (Logic of filtering):

  • OR (за замовчуванням): товари, що мають принаймні одне з вибраних значень. Кожен інший колір підраховується окремо (в межах вибору в інших секціях), тож кольори, які є в категорії, залишаються.
  • AND: товари, що мають усі вибрані значення одночасно. Лічильник кожного іншого кольору стає «товари, які водночас червоні й сині», зазвичай це 0, тож за Приховувати порожні терміни (Hide empty terms) вони зникають.
  • NOT IN: виключає товари з вибраними значеннями.

Для кольорів, розмірів і більшості атрибутів, де відвідувач хоче «цей або той», правильна логіка — OR. Залишайте AND для властивостей, які мають бути присутні всі разом, наприклад «Wi-Fi і Bluetooth».

Для опцій, що звужуються ще до завантаження товарів (підбір із залежних випадних списків), використовуйте [woof ajax_redraw=1 autosubmit=1]: кожна зміна перемальовує лише форму з перерахованими опціями, а кнопка фільтра завантажує товари. ajax_redraw не призначений для режиму AJAX, тому для такої форми тримайте Спробувати перевести магазин на AJAX (Try to ajaxify the shop) вимкненим.

Сторінка магазину, довільні сторінки та конструктори сторінок

Автоматичне звуження потребує архіву таксономії. В інших місцях поточної категорії немає:

  • Головна сторінка магазину показує весь каталог, тому, доки відвідувач нічого не вибрав, приховуються лише значення, яких немає в жодному товарі магазину. Це правильна поведінка.
  • Сторінка WordPress (головна, посадкова сторінка, сторінка в Elementor чи Divi з переліком однієї категорії) не є архівом категорії, навіть якщо показує лише товари цієї категорії. Фільтр про це не знає й виводить усе.

На такій сторінці вкажіть обом шорткодам, про яку категорію йдеться. Використайте ID терміна з Товари → Категорії (Products → Categories):

[woof taxonomies=product_cat:15]
[woof_products taxonomies=product_cat:15 per_page=12]

Атрибут taxonomies у [woof] змушує лічильники й приховування враховувати цю категорію, а той самий атрибут у [woof_products] обмежує товари, що показуються. Кілька ID однієї таксономії розділяються комами (product_cat:15,16, товари з будь-якої з них), кілька таксономій — знаком плюс (product_cat:15+pa_color:22). Це працює лише за ввімкнених трьох опцій вище. Повне налаштування таких сторінок описано в статті фільтр товарів на довільній сторінці або головній.

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

Якщо фільтр на справжньому архіві категорії все одно поводиться як на сторінці магазину, шаблон архіву теми, можливо, ховає поточну категорію від плагіна; це трапляється здебільшого з блоковими шаблонами. У Додатково → Параметри (Advanced → Options) встановіть Додаткова перевірка сторінки категорії (Additional check of the category page) у «Так».

Легший варіант без динамічного перерахунку

Якщо потрібно лише сховати терміни, яких немає в жодному товарі магазину (старі розміри, бренд, який ви перестали продавати), динамічний перерахунок не потрібен. Цей фрагмент просить WordPress пропускати такі терміни, коли HUSKY їх завантажує:

/*
 * HUSKY: do not list terms that have no published products at all.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woof_get_terms_args', function ($args) {
    $args['hide_empty'] = true;
    return $args;
});

Він нічого не коштує під час завантаження сторінки, але нічого не знає про поточну категорію чи вибір відвідувача: розмір, що є лише у взутті, усе одно показується в категорії сорочок. Якщо ввімкнено Кешувати терміни (Cache terms), після додавання коду очистіть кеш термінів. Той самий фрагмент наведено в FAQ як приховати порожні терміни.

Скільки коштує динамічний перерахунок у великих каталогах

Кожен термін у формі потребує власного запиту підрахунку при кожному перегляді сторінки, зокрема й приховані, тож форма з 300 термінами виконує близько 300 запитів підрахунку. На кількох тисячах товарів це непомітно; на десятках тисяч це може сповільнити кожну сторінку категорії. Перш ніж вимикати функцію:

  • увімкніть Кешувати кількість динамічного перерахунку для кожного елемента у фільтрі (Cache dynamic recount number for each item in filter) у Додатково → Параметри (Advanced → Options);
  • використовуйте dynamic_recount=0 у формах, де звуження не потрібне, наприклад у формі пошуку в шапці;
  • розгляньте режим Turbo, який фільтрує й підраховує за підготовленим файлом даних замість запитів до бази даних.

Подробиці — у статті як прискорити фільтрацію товарів у великих каталогах.

Контрольний список, якщо зайві опції все ще показуються

  • Показувати кількість (Show count), Динамічний перерахунок (Dynamic recount) і Приховувати порожні терміни (Hide empty terms) усі в положенні «Так» (або їхні копії для режиму Turbo, якщо він увімкнений).
  • Числа приховано через Приховувати текст кількості термінів (Hide terms count text), а не вимкненням Показувати кількість (Show count).
  • Поле віджета Динамічний перерахунок (Dynamic recount) має значення За замовчуванням (Default) або Так (Yes); у шорткоді немає dynamic_recount=0.
  • Ви тестуєте на справжньому архіві категорії або в шорткоді на довільній сторінці є taxonomies=.
  • Кеш перерахунку, кеш термінів і кеш сторінок очищено після зміни.
  • Логіка фільтрації атрибута (Логіка фільтрації (Logic of filtering)) — OR, якщо після вибору мають залишатися інші значення.

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