Pure Filter for WooCommerce — это лёгкий, быстрый и стильный AJAX-фильтр товаров для WooCommerce, выполненный в монохромном fashion-стиле. Плагин позволяет создавать неограниченное количество пресетов фильтрации с гибкими настройками и выводить их через шорткод [pure_filter].
Ключевая особенность — динамический faceted search: при выборе фильтров автоматически обновляются не только товары, но и сами блоки фильтрации (скрываются пустые категории, атрибуты и т.д.), обеспечивая умную навигацию по каталогу.
Версия: 1.1.8
Требования: WordPress 5.6+, PHP 7.4+, WooCommerce 5.0+
Структура файлов плагина Pure Filter for WooCommerce
pure-filter/
│
├── pure-filter.php # Главный файл плагина (бутстрап)
│ │ - Объявляет константы (PURE_FILTER_VERSION, PURE_FILTER_PATH и т.д.)
│ │ - Проверяет наличие WooCommerce
│ │ - Подключает классы Admin и Public
│ │ - Регистрирует хук активации
│ │ - Выводит уведомление, если WooCommerce не активен
│
├── uninstall.php # Скрипт деинсталляции
│ │ - Очищает опции плагина при удалении
│
├── assets/
│ ├── css/
│ │ └── pure-filter.css # Фронтенд-стили (959 строк)
│ │ - Монохромный fashion-дизайн
│ │ - Кастомные чекбоксы, селекты, swatches
│ │ - Dual range slider
│ │ - Макеты Horizontal / Vertical (desktop + mobile)
│ │ - Стили пагинации и Load More
│ │ - Анимации и AJAX loading bar
│ │
│ └── js/
│ └── pure-filter.js # Фронтенд-скрипт (jQuery)
│ - Сбор данных формы и отправка AJAX
│ - Управление dropdown'ами (open/close)
│ - Dual range slider (синхронизация ползунков и полей)
│ - Load More (append товаров)
│ - Faceted search (обновление блоков фильтра)
│ - Applied filters ("активные фильтры" теги)
│ - Rate limit на стороне клиента
│
└── includes/
├── class-pure-filter-admin.php # Админ-панель (600 строк)
│ - Меню: Pure Plugins → Filter
│ - Таблица списка пресетов (с шорткодами)
│ - Форма создания/редактирования пресета:
│ • Общие настройки (имя, layout, пагинация, target_query_id)
│ • Стандартные фильтры (категории, цена, наличие, сортировка)
│ • Атрибуты товаров (4 типа отображения, порядок, сортировка терминов)
│ - Обработка сохранения и удаления пресетов
│ - Стили админ-панели (inline CSS)
│
└── class-pure-filter-public.php # Публичная часть (2197 строк)
- Регистрация шорткода [pure_filter]
- Подключение CSS/JS на фронтенде
- Построение WP_Query из GET-параметров фильтра
- Модификация основного WooCommerce запроса
- AJAX-обработчик (handle_ajax_filtering):
• Rate limiting
• Кэширование (2 мин)
• Сборка запроса с учётом всех фильтров
• Рендеринг товаров, пагинации, обновлённых фильтров
- Faceted Search (get_filtered_product_ids):
• Определение ID товаров для каждого фильтра
• Кэширование через транзиенты
- Отрисовка блоков фильтрации:
• render_categories_section() — 3 типа (list, checkbox, dropdown)
• render_price_section() — dual range slider
• render_stock_section() — наличие / скидка
• render_sorting_section() — 6 вариантов
• render_attribute_section() — 4 типа (checkbox, color, text, dropdown)
- Работа с вариативными товарами:
• get_product_ids_by_attribute() — поиск по postmeta вариаций
• get_attribute_terms_for_products() — термины с учётом stock_status
- Интеграция с Pure Query:
• override_pure_query_pagination_type()
• is_pure_query_pagination_managed_by_filter()
- Работа со шорткодами WooCommerce:
• override_shortcode_products_query()
• filter_shortcode_atts()
- Определение активного пресета:
• get_current_preset_id() — с fallback'ами
• get_active_filter_preset_id() — без fallback для Pure Query
• get_page_filter_preset_id() — парсинг шорткода на странице
- Управление пагинацией:
• maybe_override_loop_pagination() — стандартный WC loop
• render_shortcode_pagination() — шорткоды WooCommerce
• render_load_more_button() — кнопка "Загрузить ещё"
- Блокировка Layered Navigation WooCommerce:
• bypass_woocommerce_layered_nav_filters()
Основные возможности
- Неограниченное количество пресетов фильтров — создавайте разные наборы фильтров для разных страниц
- Полная AJAX-фильтрация — переключение фильтров, сортировка и пагинация без перезагрузки страницы
- Динамический Faceted Search — фильтры автоматически показывают только релевантные опции (скрывают пустые категории/атрибуты)
- 4 типа отображения атрибутов: чекбоксы, цветовые swatches, текстовые кнопки, выпадающие списки
- 3 типа отображения категорий: список, чекбоксы, dropdown
- Ценовой фильтр с dual range slider — два ползунка и числовые поля ввода
- Фильтр по наличию — "В наличии" и "Со скидкой"
- Встроенная сортировка товаров — 6 вариантов сортировки
- Два макета — горизонтальный (строка dropdown'ов) и вертикальный (сайдбар)
- Раздельные настройки layout для desktop и mobile
- Три режима пагинации: постраничная, "Загрузить ещё" (Load More), отключена
- Интеграция со стандартными шорткодами WooCommerce —
[products],[sale_products],[best_selling_products],[recent_products],[product_category] - Совместимость с Divi et_pb_shop — работает с модулем магазина Divi
- Интеграция с Pure Query — расширенная работа с кастомными запросами
- Умное кэширование — AJAX-ответы кэшируются на 2 минуты для снижения нагрузки
- Защита от злоупотреблений — rate limiting анонимных AJAX-запросов (макс. 120 запросов в минуту)
- Монохромный fashion-стиль — минималистичный чёрно-белый дизайн, легко кастомизируется
Конфигурация (Админ-панель)
Список пресетов
В админ-панели отображается таблица всех созданных пресетов с информацией:
- Название — внутреннее имя пресета
- Layout — выбранные макеты для desktop и mobile
- Компоненты — список включённых фильтров (категории, цена, наличие, сортировка, атрибуты)
- Шорткод — готовый шорткод для копирования
Доступные действия: Добавить новый, Редактировать, Удалить.
Создание/Редактирование пресета
Общие настройки
| Параметр | Описание |
|---|---|
| Название фильтра | Внутреннее имя для администрирования |
| ID контейнера (target_query_id) | HTML ID контейнера с товарами (без #). Указывается для точной привязки к Pure Query. Если оставить пустым — используется автоматическое определение цели |
| Desktop Layout | Horizontal (строка dropdown'ов) или Vertical (сайдбар) |
| Mobile Layout | Horizontal (аккордеон) или Vertical (вертикальный стек) |
| Товаров на странице | Количество товаров. Пусто = настройки WooCommerce по умолчанию |
| Пагинация | Не показывать, По страницам, Кнопка "Загрузить ещё" |
Стандартные фильтры
Категории (вкл/выкл)
- Заголовок секции (по умолчанию "Категории")
- Тип отображения:
Sleek Text List(список ссылок),Checkboxes,Monochrome Dropdown - Порядок сортировки (число)
Цена (вкл/выкл)
- Заголовок секции (по умолчанию "Цена")
- Порядок сортировки
Наличие (вкл/выкл)
- Заголовок секции (по умолчанию "Наличие")
- Порядок сортировки
Сортировка (вкл/выкл)
- Заголовок секции (по умолчанию "Сортировка")
- Сортировка по умолчанию:
Исходная,По популярности,По рейтингу,По новизне,Цена: по возрастанию,Цена: по убыванию - Порядок сортировки
Атрибуты товаров
Для каждого атрибута WooCommerce (Size, Color и т.д.) доступны:
| Параметр | Описание |
|---|---|
| Вкл/Выкл | Чекбокс включения атрибута в фильтр |
| Заголовок | Отображаемый заголовок секции |
| Тип отображения | Standard Checkboxes, Color Swatches, Text Buttons, Dropdown List |
| Порядок | Число для сортировки секций |
| Сортировка терминов | WooCommerce Order, Name (Alphabet), Term ID, Product Count |
Детальное описание блоков фильтрации
Категории
- На страницах категорий показываются только дочерние подкатегории текущей категории
- На странице магазина (shop) показываются все категории иерархически
- Если у текущей категории нет подкатегорий, блок категорий скрывается
- Работает динамический подсчёт: отображаются только категории, содержащие товары после применения других фильтров
- Три типа отображения:
- Sleek Text List — список ссылок с количеством товаров, активная подсвечивается жирным
- Checkboxes — чекбоксы с названием и количеством
- Monochrome Dropdown — выпадающий список с вложенностью и префиксами
Ценовой диапазон
- Dual range slider — два ползунка для минимальной и максимальной цены
- Числовые поля ввода — можно ввести цену вручную, отображаются с символом валюты
- Значения автоматически подстраиваются под актуальный диапазон цен отфильтрованных товаров
- Минимальные/максимальные значения рассчитываются из таблицы
wc_product_meta_lookup
Наличие (Stock Status)
- Чекбокс "В наличии" —
instock - Чекбокс "Со скидкой" —
onsale(товары, участвующие в распродаже)
Сортировка (Product Sorting)
6 вариантов:
- Исходная сортировка (
menu_order) — по умолчанию - По популярности (
popularity) - По рейтингу (
rating) - По новизне (
date) - Цены: по возрастанию (
price) - Цены: по убыванию (
price-desc)
Сортировка встроена непосредственно в фильтр, а не использует стандартный WooCommerce dropdown. Это позволяет AJAX-обновлению корректно подхватывать сортировку.
Атрибуты (4 типа отображения)
1. Standard Checkboxes
- Классические чекбоксы с кастомным чёрным квадратом
- Автоматически разбиваются на колонки: 2 колонки при >10 элементах, 3 колонки при >20
2. Color Swatches (цветовые образцы)
- Круглые цветные маркеры (14px)
- Автоматическое определение цвета: сначала проверяются meta-поля (
pure_attr_color,color,hex,bg_colorи др.), затем встроенная карта цветов (включая русские названия: "чёрный", "белый", "красный" и т.д.) - Активный цвет обводится чёрной рамкой
- Сетка 10xN: максимум 10 цветов в колонке
- Для светлых цветов (белый, молочный) добавляется серая рамка
3. Text Buttons (текстовые кнопки)
- Например для размеров (S, M, L, XL)
- Минимальная ширина 32px, высота 32px
- Активное состояние: чёрный фон, белый текст
- Hover: чёрная рамка
4. Dropdown List (выпадающий список)
- Стилизованный select с кастомной SVG-стрелкой
- Первый пункт: "Выбрать [Название]"
Динамический Faceted Search
Плагин использует механизм умного пересчёта фильтров. Когда пользователь выбирает фильтр:
- Определяются ID товаров, соответствующие выбранным фильтрам (кроме одного — "исключённого" фильтра)
- Для исключённого фильтра пересчитываются доступные опции — показываются только те, у которых есть товары в текущей выборке
- Это работает для:
- Категорий — показываются только категории с товарами
- Атрибутов — показываются только термины атрибутов с товарами (с учётом вариаций!)
- Цены — диапазон подстраивается под актуальные цены
Важно: Текущие активные опции всегда остаются видимыми, даже если временно не имеют товаров.
AJAX-фильтрация
Как работает
- При изменении любого фильтра (чекбокс, select, ползунок) JS собирает все данные формы
- Отправляет POST-запрос на
admin-ajax.phpс actionpure_filter_ajax - Сервер строит WP_Query с учётом всех фильтров и возвращает JSON:
products_html— HTML блока товаровfilters_html— обновлённый HTML блоков фильтрации (для faceted search)pagination_html— HTML пагинацииonly_items_html— только элементы<li>(для load more на страницах >1)max_num_pages— общее количество страницpagination_type— тип пагинации
Безопасность
- Rate limiting: максимум 120 AJAX-запросов в минуту для анонимных пользователей
- Лимит на размер строки запроса: 8192 символа
- Лимит на количество параметров: 30
- Максимальная страница: 1000
Кэширование
- AJAX-ответы кэшируются на 2 минуты (транзиенты WordPress)
- Ключ кэша включает: страницу, фильтры, категорию, колонки, пресет, query ID, shop URL, ID сессии
- Это обеспечивает быстрый повторный запрос без полного перестроения запроса
Макеты (Layouts)
Desktop
Horizontal (по умолчанию):
- Все секции фильтра выстраиваются в ряд с помощью flexbox
- Каждая секция — это заголовок-кнопка, при нажатии открывается dropdown с содержимым
- Плавная анимация появления (fadeInSlide)
- Кнопка "Сбросить фильтры" прижата к правому краю
- Идеально для широких экранов
Vertical:
- Секции располагаются вертикально, как в сайдбаре
- Весь контент всегда виден (без dropdown'ов)
- Тонкая правая граница для визуального отделения
Mobile (<768px)
Horizontal:
- Секции располагаются вертикально (аккордеон)
- Каждый заголовок — кнопка с иконкой стрелки
- Контент открывается/закрывается по клику
- Колонки для чекбоксов уменьшаются до 2
Vertical:
- Вертикальный стек секций
- Каждая секция разделена тонкой линией
- Весь контент всегда виден
Пагинация
Три режима:
По страницам (Pages)
- Стандартная постраничная навигация WooCommerce
- Номера страниц в чёрно-белом стиле
- Активная страница — чёрный фон, белый текст
- Адреса страниц корректируются: берётся реальный URL магазина вместо
admin-ajax.php
Загрузить ещё (Load More)
- Кнопка "Загрузить ещё" в центре под товарами
- При загрузке следующей страницы товары добавляются к уже отображённым (append)
- Кнопка блокируется на время загрузки (класс
pure-loading) - Скрывается, когда все товары загружены
- На прямом визите
/page/X/загружаются товары со страниц 1..X включительно
Не показывать
- Стандартная пагинация WooCommerce удаляется
- Полезно для лендингов или страниц, где должны отображаться все товары сразу
Совместимость с Pure Query
Плагин может работать в паре с Pure Query:
- Привязка по target_query_id — фильтр может быть явно привязан к конкретному блоку Pure Query
- Управление пагинацией — фильтр переопределяет пагинацию Pure Query (постраничная, load more, отключена)
- Совместная сортировка — используется единая система сортировки Pure Query
- Рендеринг карточек товаров — при активном Pure Query товары отображаются через
Pure_Query_Render::render_card_for_product(), что обеспечивает кастомный дизайн карточек
Фильтр не вмешивается в независимые блоки Pure Query на страницах без фильтра.
Работа со стандартными шорткодами WooCommerce
Плагин перехватывает следующие шорткоды WooCommerce:
[products][product_category][recent_products][sale_products][best_selling_products]- Модуль
et_pb_shop(Divi)
Что делает:
- Применяет активные GET-фильтры к запросу шорткода
- Переопределяет количество товаров на странице (из пресета)
- Для load more — скрывает стандартную пагинацию WooCommerce
Шорткод
[pure_filter id="preset_xxx"]
Где id — идентификатор пресета, созданного в админ-панели. Шорткод можно разместить на любой странице, в том числе на странице магазина.
На страницах категорий фильтр автоматически определяет текущую категорию контекстно (через is_product_category()) и передаёт её в AJAX-запросы.
Стилизация (CSS)
Плагин поставляется с полностью кастомным CSS в монохромном стиле:
- Чёрно-белая палитра — основные цвета:
#000000(чёрный),#ffffff(белый),#e5e5e5(серый),#888888(тёмно-серый) - Типографика —
-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif - Все буквы заглавные —
text-transform: uppercaseдля заголовков и элементов - Минималистичные анимации — плавные переходы (0.2s ease), масштабирование при hover
- Кастомные чекбоксы — скрыты нативные, используются стилизованные чёрные квадраты с галкой
- Кастомные селекты — скрыт нативный
appearance, добавлена SVG-стрелка - Лоадер — тонкая чёрная линия, анимированная от левого края к правому
В админ-панели используется аналогичный стиль для единообразия.
Дополнительные технические детали
Обработка вариативных товаров
Плагин корректно обрабатывает вариативные товары:
- Для простых товаров — стандартные term_relationships
- Для вариативных — поиск по postmeta
attribute_pa_*с учётом stock_status - Вариации "Any" (пустое значение meta) также учитываются через term_relationships родительского товара
Блокировка стандартной Layered Nav
Плагин принудительно отключает встроенную Layered Navigation WooCommerce через bypass_woocommerce_layered_nav_filters(), чтобы избежать конфликтов и дублирования фильтрации.
Автоматическое определение пресета
Плагин определяет активный пресет следующим образом:
- По POST (AJAX) — из параметра
preset_id - По шорткоду на странице — парсинг
[pure_filter id="..."] - Проверка страницы магазина и страниц категорий
- Fallback — первый пресет в базе




