Ползунок диапазона WooCommerce для атрибутов и мета-полей
Мощность, размер, длина, диагональ экрана, год, пробег: числовые данные о товаре требуют ползунка диапазона, а не длинного списка флажков. Ползунок диапазона фильтра WooCommerce для атрибутов легко включить в HUSKY, и так же легко получить ползунок, который показывает 100000 раньше 9000, разбивает 1,9 на два значения или всегда идет от 0 до 100. Причина почти всегда одна: существуют два разных ползунка, и числа они обрабатывают по-разному. В этом руководстве разобраны оба, их настройка и способы исправить неверный порядок, десятичные дроби и пустые диапазоны.
Два ползунка диапазона: значения атрибута или числовое мета-поле
HUSKY может построить ползунок диапазона по данным двух видов, и от выбора зависит, на что способен ползунок.
| Ползунок атрибута (таксономии) | Ползунок мета-поля | |
|---|---|---|
| Данные | Термины глобального атрибута или другой таксономии товаров | Число, хранящееся в мета-данных товара: _length, _weight, числовое поле ACF, любое пользовательское поле |
| Что означает диапазон | Все термины между двумя ползунками в том порядке, в каком они перечислены | Настоящее числовое сравнение: значение между «от» и «до» |
| Положения ползунка | Одна остановка на каждый существующий термин, на равных расстояниях | Любое значение между минимумом и максимумом с вашим шагом |
| Минимум и максимум | Первый и последний термин | Задаются вручную в опции Диапазон (Range) |
| Поля ввода «от/до» | Нет | Да, Показывать поля ввода (Show inputs) |
| Текстовые шкалы (Мягкий, Средний, Жесткий) | Да | Нет, только числа |
| Вариативные товары | Находятся по терминам атрибута товара | Ищутся только собственные мета-данные товара, а не его вариации |
Главное различие: термины атрибута — это текст. WordPress хранит 9000 и 100000 как названия, а не как числа, поэтому ползунок атрибута может лишь идти по списку терминов в заданном порядке. Он ничего не вычисляет. Ползунок мета-поля сравнивает числа в базе данных, поэтому справляется с любым значением в диапазоне, в том числе с таким, которого нет ни у одного другого товара.
Пользовательские атрибуты товара, введенные прямо на вкладке «Атрибуты» товара без глобального атрибута, таксономиями не являются, и ни один тип фильтра их использовать не может. Сначала создайте глобальный атрибут в разделе Товары → Атрибуты (см. управление таксономиями товаров в документации WooCommerce).
Настройка фильтра-ползунка диапазона для атрибутов
- Создайте глобальный атрибут, например Мощность (Power), и добавьте его значения как термины:
5,7.5,10,15. Назначьте их товарам как обычно. - Откройте WooCommerce → Настройки → Products Filter → Структура и задайте для этого атрибута тип Ползунок (Slider). Этот тип добавляет расширение Slider.
- Нажмите кнопку дополнительные опции (additional options) (шестеренка) рядом с атрибутом и задайте параметры ползунка:
- Тип (Type): двойной (double) для диапазона «от и до»; одиночный (single) для одного ползунка, который выбирает все от первого значения до положения ползунка («до 10 кВт»).
- Шаг сетки (Grid step): какие подписи под ползунком видны.
1показывает все,2— каждую вторую,-1скрывает подписи между краями. Полезно, когда длинные значения накладываются друг на друга. - Включить динамический пересчет (Enable dynamic recount): убирает значения без товаров в текущей выдаче (см. ниже).
- Скин ползунка (Slider skin): оформление этого ползунка.
- Оставьте Логику фильтрации (Logic of filtering) в положении ИЛИ (OR). Ползунок отправляет каждый термин выбранного отрезка, например
pa_power=5,7-5,10, а товару достаточно одного из них. При И (AND) товару понадобились бы все термины сразу, и ничего не будет найдено.
Поскольку диапазон — это «термины между ползунками», вся логика ползунка определяется порядком терминов. Если 6.5 в списке стоит после 8.2, диапазон от 6 до 7 его пропустит. Порядок исправляется в следующем разделе.
Значения ползунка атрибута в неверном порядке
Типичные симптомы: 100000 стоит раньше 9000, 10 и 11 раньше 2, отрицательные значения идут как -1, -2, -3, 0, 1, или ползунки прыгают туда-сюда при перетаскивании. Все это — текстовая сортировка. Решение — задать терминам числовой порядок.
Лучший вариант: пусть WooCommerce сортирует атрибут по числам
Откройте Товары → Атрибуты, отредактируйте атрибут и задайте Порядок сортировки по умолчанию (Default sort order) значение Название (числовая) (Name (numeric)). Тогда WooCommerce упорядочит термины по числовому значению их названий, а это охватывает десятичные дроби с точкой, отрицательные числа и названия, начинающиеся с числа, например 10 cm. В дополнительных опциях ползунка оставьте Сортировку терминов (Sort terms) в положении По умолчанию (Default), чтобы HUSKY сохранил этот порядок. Если включена опция Кэшировать термины (Cache terms) (Продвинутые → Опции), после этого нажмите очистить кэш терминов (clear terms cache).
Для текстовой шкалы вместо этого выберите Произвольную сортировку (Custom ordering) и перетащите термины на нужные места на экране атрибута Настроить термины (Configure terms): Мягкий, Средний, Средне-жесткий, Жесткий. То же перетаскивание работает для любого числового списка, порядок которого вы хотите задать вручную.
Собственные параметры HUSKY для сортировки терминов
Опция Сортировка терминов (Sort terms) в дополнительных опциях ползунка переопределяет порядок по умолчанию:
- Название (Title) использует естественную сортировку названий: верна для целых положительных чисел (2 раньше 10) и для названий вроде
10 cm, но не для десятичных и отрицательных чисел. - Числовая (Numeric.) сравнивает целочисленное значение слага термина. Работает только для целых положительных чисел: слаг для
6.5— это6-5, что считается как 6, а WordPress убирает ведущий минус при создании слага, поэтому-3сортируется как 3.
Код: числовой порядок для ползунка любой таксономии
Для пользовательской таксономии, где Название (числовая) (Name (numeric)) из WooCommerce недоступно, сортируйте значения ползунка в коде. Фильтр woof_sort_terms_before_out получает термины каждого фильтра и тип фильтра:
/**
* HUSKY: order the values of every taxonomy range slider by their number
* (decimals with a dot and negative numbers included).
* Child theme functions.php or a code snippets plugin.
*/
add_filter( 'woof_sort_terms_before_out', function ( $terms, $type ) {
if ( 'slider' === $type && is_array( $terms ) ) {
uasort( $terms, function ( $a, $b ) {
return (float) $a['name'] <=> (float) $b['name'];
} );
}
return $terms;
}, 20, 2 );
Термины без числа в начале (текстовая шкала) здесь все считаются равными 0 и сохраняют свой прежний порядок, поэтому сниппет такие ползунки не нарушает.
Десятичные дроби, запятые и неравномерные шаги в ползунках атрибутов
- Записывайте десятичные дроби через точку. Ползунок получает свои подписи одним списком, разделенным запятыми, поэтому термин с названием
1,9превращается в две подписи,1и9, а все позиции после него указывают на неверный термин. Переименуйте такие термины в1.9. К настройке десятичного разделителя магазина это не имеет отношения: названия терминов — обычный текст. - Положения распределены равномерно по терминам, а не по значениям. Термины 1, 2, 5 и 50 получают четыре равных шага. Если ползунок должен выглядеть пропорциональным, добавьте недостающие промежуточные значения как термины.
- Ползунку нужно как минимум два значения. При двух терминах ползунки могут стоять только на двух краях. Если после динамического пересчета осталось меньше двух значений, ползунок не показывается вовсе.
- Выбрать можно только существующие термины. Товар со значением 6.5 находится, только если термин 6.5 существует и лежит между ползунками.
Ползунок диапазона для мета-полей: размеры, годы и другие числа
Когда значение — настоящее измерение, ползунок мета-поля обычно лучше: он сравнивает числа, принимает поля ввода «от/до» и остается быстрым при тысячах разных значений. Настройка с помощью расширения Meta Fields:
- Откройте вкладку Мета-данные (Meta Data) в настройках фильтра. Введите ключ в Добавить свой ключ вручную (Add Custom key by hands) либо воспользуйтесь Получить ключи любого товара по его ID (Get keys from any product by its ID), чтобы увидеть, какие ключи есть у товара.
- Задайте полю тип число (number), а его отображение — Ползунок (Slider). Для текстовых полей и полей даты ползунок не предлагается. Сохраните.
- Откройте дополнительные опции поля и заполните Диапазон (Range) в виде
min^max, например10^250. Задайте Шаг (Step) (подойдет0.5) и при необходимости Префикс (Prefix), Постфикс (Postfix) (cm), Показывать поля ввода (Show inputs) для числовых полей «от/до» и Использовать форматирование (Use prettify) для разделителя тысяч. - Разместите новый элемент фильтра на вкладке «Структура» так же, как любой другой.
Полезные ключи: WooCommerce хранит габариты и вес товара для доставки как _length, _width, _height и _weight. Числовое поле ACF хранится под именем своего поля. Подробности о мета-ключах — в документации по мета-данным.
Что нужно знать о ползунках мета-полей:
- Диапазон никогда не вычисляется. Ползунок показывает ровно тот Диапазон (Range), который вы ввели; пустое поле возвращается к 0–100. Поиск реального минимума и максимума означал бы чтение каждого товара при каждом просмотре страницы. Динамический пересчет определяет, какие фильтры и значения показывать, но не где ползунок начинается и заканчивается. Обновляйте диапазон, когда новые товары выходят за его пределы.
- Храните простые числа с точкой в качестве десятичного разделителя и без разделителя тысяч:
1250.5. База данных читает только число в начале значения, поэтому1,250.5сравнивается как 1, а1250,5— как 1250. - Годы: диапазон вроде
1990^2026, шаг1, а Использовать форматирование (Use prettify) установите в Нет (No), иначе 2026 будет показан как 2 026. - Вариации: ищутся мета-данные самого товара. Если значение есть только у вариаций, сохраните его также у родительского товара или используйте атрибут.
Десятичные значения: woof_slider_meta_query_type
По умолчанию ползунок мета-поля сравнивает значения как NUMERIC, что MySQL рассматривает как целые числа. Тогда товар со значением 10.11 находится в диапазоне 1–10, а 4.2, 4.4 и 4.6 считаются как 4. Чтобы сравнивать десятичные значения, измените тип фильтром woof_slider_meta_query_type:
/**
* HUSKY: compare these meta sliders as decimal numbers.
* Child theme functions.php or a code snippets plugin.
*/
add_filter( 'woof_slider_meta_query_type', function ( $type, $meta_key ) {
if ( in_array( $meta_key, array( '_length', '_width', '_height', 'screen_size' ), true ) ) {
return 'DECIMAL(10,2)'; // up to 99999999.99
}
return $type;
}, 10, 2 );
В DECIMAL(M,D) параметр M — общее число цифр, а D — число цифр после точки. Подберите их под ваше наибольшее значение: при DECIMAL(5,3) максимум равен 99.999, и каждое большее значение считается как 99.999.
Скрыть ползунки, которые не относятся к текущей категории
- Ползунок атрибута: установите Включить динамический пересчет (Enable dynamic recount) в Да (Yes) в его дополнительных опциях. Значения без товаров в текущей категории и при текущем выборе фильтров исчезают, а если остается меньше двух значений, ползунок удаляется. Каждое значение стоит одного дополнительного запроса подсчета, поэтому для атрибутов с сотнями терминов следите за скоростью страницы или используйте ползунок мета-поля.
- Ползунок мета-поля: если на вкладке «Опции» (Options) установить Скрывать пустые термины (Hide empty terms) в Да (Yes), ползунок мета-поля, для которого в текущей выдаче нет товаров в его диапазоне, не показывается.
Ползунок атрибута без значений удаляется скриптом плагина после загрузки страницы, поэтому его заголовок может на мгновение мелькнуть. Этот CSS скрывает его с самого начала (Внешний вид → Настроить → Дополнительный CSS или таблица стилей дочерней темы):
/* HUSKY: hide empty taxonomy sliders before the script removes them */
.woof_container_slider:has(.woof_hide_slider) {
display: none;
}
Когда диапазон есть у самого товара
Ползунок находит товары по одному значению на товар. Если товар охватывает диапазон (подходит для роста 150–190 см, для 3–10 игроков), встроенного поиска по «пересечению диапазонов» нет. Два рабочих варианта:
- Два мета-поля, например
players_minиplayers_max, у каждого свой ползунок. Посетитель, который ищет игру на 4 игроков, ставит первый ползунок на 1–4, а второй — на 4–10. - Атрибут с одним термином на значение (150, 151 ... 190), все подходящие термины назначены товару, а сам атрибут показан в виде ползунка. Назначайте термины массово, а не вручную.
Контрольный список
- Ползунок атрибута: глобальный атрибут, десятичные дроби через точку, Порядок сортировки по умолчанию (Default sort order) — Название (числовая) (Name (numeric)) или термины перетащены в нужный порядок, Логика фильтрации (Logic of filtering) — ИЛИ (OR).
- Ползунок мета-поля: тип поля число (number), простые числовые значения, Диапазон (Range) заполнен как
min^max, десятичный тип для дробных значений. - Много различных значений или настоящие измерения: ползунок мета-поля вместо атрибута с сотнями терминов.
- Ползунки в неподходящих категориях: Включить динамический пересчет (Enable dynamic recount) для ползунков атрибутов, Скрывать пустые термины (Hide empty terms) для ползунков мета-полей.
Если после этих шагов ползунок все еще показывает неверные значения, задайте вопрос на форуме поддержки HUSKY, указав атрибут или мета-ключ, несколько примеров значений и ссылку на страницу.