HUSKY - WooCommerce Product Filter Professional

Фильтр WooCommerce: только атрибуты текущей категории

Когда несколько категорий товаров используют один атрибут, фильтр WooCommerce часто предлагает значения, которые на этой странице не имеют смысла: Гриль (Grill) среди холодильников, 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) в «Нет», чтобы убрать числа, пустые термины вернутся на каждой странице. Возможные комбинации:

Show count / Dynamic recount / Hide empty termsЧто видят посетители
No / No / NoВсе термины, без чисел
Yes / No / NoЧисла по всему магазину; термины без единого товара затемнены
Yes / Yes / NoЧисла для текущей категории и выбора; термины с нулём остаются видимыми, но затемнены и недоступны для выбора
Yes / Yes / YesТермины с нулём скрыты; пустые секции исчезают

Третья строка — выбор для случая, когда вы предпочитаете показывать недоступные значения неактивными, а не удалять их. Глобальные опции могут переопределяться ещё в нескольких местах:

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

Другие настройки на этом же экране описаны в документации по вкладке Опции.

Скрыть пустые термины, не показывая счётчик

Самое частое пожелание — скрыть пустые термины, не выводя числа вроде (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;
}

У выбранного термина число никогда не показывается. Это сделано намеренно: пересчёт пропускает термины, которые уже входят в поиск.

Почему после первого выбора исчезают другие значения

Динамический пересчёт сужает форму с каждым выбором: после выбора Brand: 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 mode, который фильтрует и считает по подготовленному файлу данных, а не запросами к базе.

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

Контрольный список, если лишние опции всё ещё показываются

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

Если всё это на месте, а категория всё равно перечисляет значения без товаров, создайте тему на форуме поддержки HUSKY со ссылкой на страницу категории и значением, которое должно быть скрыто.