ITG Filter Easy
Виджет Elementor для AJAX-фильтрации товаров WooCommerce. Работает как боковой фильтр — не выводит товары сам, а управляет виджетом WooCommerce Products через URL-параметры и pre_get_posts. Без перезагрузки страницы.
Лицензия
GNU GPL v3 Плагин распространяется под лицензией GNU GPL v3 или выше.
https://www.gnu.org/licenses/gpl-3.0.html
Как это работает
Перейдите на вкладку «Структура» и добавьте нужные фильтры: категория, цена, бренд, атрибуты товаров.
В Elementor перетащите виджет «ITG Filter» в боковую панель шаблона страницы магазина.
В настройках виджета введите CSS-селектор блока WooCommerce Products (по умолчанию:
.elementor-widget-woocommerce-products).Фильтр обновляет список товаров через AJAX без перезагрузки страницы.
Вкладка «Структура» — атрибуты фильтра
Определяет фильтры в виджете и их порядок. Перетаскивайте строки для изменения порядка.
| Поле | Описание |
|---|---|
| Атрибут | Таксономия или встроенный тип. Встроенные: Категория, Цена, Бренд, Сортировка, Наличие, Акция, Поиск. Атрибуты (pa_*) — автоматически. |
| Тип отображения | Флажки, Радио, Кнопки, Выпадающий список, Мультиселект, Слайдер (только для Цены). |
| Название | Заголовок группы фильтра. Пустое — имя атрибута по умолчанию. |
| Показать заголовок | При выключении заголовок группы скрывается. |
| Открыт по умолчанию | При выключении группа свёрнута, раскрывается по клику. |
| Счётчик в заголовке | Бейдж: сколько значений выбрано в группе. |
| Сортировка / Порядок | По имени, ID, числовому значению. По возрастанию или убыванию. |
| Показать «Все» | Только для Категории. Добавляет «Все категории» для сброса фильтра. |
| Показывать (список) | Только для Категории и Бренда. Ограничивает список выбранными терминами. |
| Подсказка | HTML-текст в попапе «?». Требует включения «Показывать подсказки» в Опциях. |
Вкладка «Опции»
| Опция | Описание |
|---|---|
| Тема | Минимальный (без рамок), Стандартный (с рамками), Контрастный (тёмный фон). |
| Автоприменение | Обновление товаров при каждом изменении фильтра или по нажатию «Применить». |
| Скрыть пустые | Значения и группы с нулевым количеством товаров скрываются. |
| Тень под заголовком | Лёгкая тень под заголовком развёрнутой группы. |
| Показывать подсказки | Иконка «?» рядом с заголовками групп с popup-текстом. |
| Иконка группы | Сторона (лево/право) и стиль (нет, треугольник, ±, шеврон). |
| Валюта бренда | Поле валюты в product_brand. Цены конвертируются по курсу из JSON-фида. |
Темы оформления
Пример: настройка текстового поиска
Фильтр «Текстовый поиск» позволяет вводить ключевое слово прямо в виджете. Список товаров обновляется через AJAX в связке со всеми другими фильтрами.
WooCommerce → ITG Filter → Структура.
Нажмите «+ Добавить атрибут» и выберите «Текстовый поиск» в группе «Встроенные».
Вкладка Опции → «Автоприменение». Товары будут обновляться по мере набора текста (debounce).
URL-параметр:
?itg_search=слово. Ссылку можно сохранить — результаты воспроизводятся.Требования плагина
Проверено Plugin Check (PCP)
| Категория | Результат | Что сделано |
|---|---|---|
Устаревший load_plugin_textdomain() | Исправлено | WP загружает переводы автоматически с WP 4.6 |
wp_unslash() перед санитизацией | Исправлено | Добавлен во все $_POST/$_GET обработчики |
$_SERVER[REQUEST_URI] | Исправлено | Добавлен esc_url_raw() в методе render() |
| Прямые запросы к БД | Аннотировано | Обязательные для фасетного поиска; кэш через transient |
| Интерполяция SQL | Аннотировано | Индексы JOIN — целые числа; phpcs:disable/enable |
error_log() | Аннотировано | Намеренный логгер ошибок курса валют |
16 хуков плагина
Все хуки имеют префикс itg_flt_. Позволяют изменять поведение без редактирования файлов плагина.
itg_flt_defaultsITG_FLT_SettingsДобавить ключи в настройки по умолчанию.
itg_flt_settingsITG_FLT_SettingsПереопределить весь массив настроек.
itg_flt_brand_currencyITG_FLT_CurrencyПереопределить код валюты для бренда.
itg_flt_pivot_rateITG_FLT_CurrencyПереопределить курс обмена. null — пропустить.
itg_flt_converted_priceITG_FLT_CurrencyПостобработка сконвертированной цены.
itg_flt_convert_price_enabledITG_FLT_Currencyfalse — отключить конвертацию для товара.
itg_flt_allowed_orderbyITG_FLT_QueryСписок допустимых значений сортировки.
itg_flt_sanitize_paramsITG_FLT_QueryМассив санитизированных параметров фильтра.
itg_flt_tax_queryITG_FLT_QueryИзменить tax_query перед WP_Query.
itg_flt_meta_queryITG_FLT_QueryИзменить meta_query (цена, наличие).
itg_flt_filtered_countsITG_FLT_QueryФасетные счётчики [term_id => count].
itg_flt_ajax_query_argsITG_FLT_AjaxАргументы WP_Query перед AJAX-запросом.
itg_flt_ajax_responseITG_FLT_AjaxИзменить JSON-ответ AJAX.
itg_flt_price_rangeITG_FLT_PriceДиапазон цен [min, max] для слайдера.
itg_flt_price_range_cache_ttlITG_FLT_PriceTTL кэша диапазона цен (по умолчанию 6 ч).
itg_flt_script_dataITG_FLT_FrontendОбъект JS для фронтенда (ajax_url, nonce, i18n).
Примеры кода
ITG_FLT_Settings
add_filter( 'itg_flt_defaults', function( $defaults ) {
$defaults['my_custom_option'] = true;
return $defaults;
} ); ITG_FLT_Currency — фиксированный курс
add_filter( 'itg_flt_pivot_rate', function( $rate, $code ) {
if ( $code === 'USD' ) return 90.0;
return $rate;
}, 10, 2 );
add_filter( 'itg_flt_converted_price', function( $price ) {
return round( $price / 100 ) * 100;
} ); ITG_FLT_Currency — лог ошибок
При сбое загрузки фида плагин пишет в error_log. Цены всегда отображаются — исходное значение как fallback.
| Ситуация | Сообщение в логе |
|---|---|
| HTTP/сеть | [ITG Filter Easy] Currency feed request failed for <url> |
| JSON невалиден | [ITG Filter Easy] Currency feed JSON parse error (HTTP <code>) |
| Отсутствует "Valute" | [ITG Filter Easy] Currency feed missing "Valute" key |
| Код не найден | [ITG Filter Easy] Currency code <CODE> not found in feed |
| Nominal = 0 | [ITG Filter Easy] Invalid Nominal=0 for currency <CODE> |
grep "ITG Filter Easy" /path/to/error.log
ITG_FLT_Query
add_filter( 'itg_flt_tax_query', function( $tq, $params, $query ) {
$tq[] = [ 'taxonomy' => 'product_visibility', 'field' => 'name', 'terms' => 'featured' ];
return $tq;
}, 10, 3 ); ITG_FLT_Ajax
add_filter( 'itg_flt_ajax_response', function( $response, $query ) {
$response['my_count'] = $query->found_posts;
return $response;
}, 10, 2 ); ITG_FLT_Price
add_filter( 'itg_flt_price_range_cache_ttl', fn() => 60 ); add_filter( 'itg_flt_price_range', fn() => [ 'min' => 0, 'max' => 50000 ] );
Адаптация фида курса валют
По умолчанию плагин ожидает JSON формата ЦБ РФ. Для другого сервиса используйте itg_flt_pivot_rate.
Формат ЦБ РФ (встроенный)
{ "Valute": { "USD": { "Value": 90.15, "Nominal": 1 } } }
// rate = Value / Nominal Подключение своего фида
add_filter( 'itg_flt_pivot_rate', function( $rate, $code ) {
if ( $rate !== null ) { return $rate; }
$key = 'my_rates_' . gmdate( 'Y-m-d' );
$data = get_transient( $key );
if ( $data === false ) {
$resp = wp_remote_get( 'https://example.com/rates.json', [ 'timeout' => 10 ] );
if ( is_wp_error( $resp ) ) { return null; }
$data = json_decode( wp_remote_retrieve_body( $resp ), true );
if ( ! empty( $data ) ) { set_transient( $key, $data, 6 * HOUR_IN_SECONDS ); }
}
if ( isset( $data[ $code ] ) ) { return (float) $data[ $code ]; }
return null;
}, 10, 2 ); Параметры
| Параметр | Значение |
|---|---|
| Опорная валюта | Активная валюта WooCommerce. 1 ВАЛЮТА_БРЕНДА = N единиц валюты магазина. |
| URL фида | WooCommerce → ITG Filter → Опции → URL фида |
| Кэш (TTL) | 6 часов · ключ: itg_flt_cbr_rates_YYYY-MM-DD_<md5> |
| Хук курса | itg_flt_pivot_rate ( float|null $rate, string $code ) |
| Хук цены | itg_flt_converted_price ( float $converted, float $raw, int $brand_id, string $brand_cur, string $store_cur ) |
# Сброс кэша (WP-CLI): wp transient delete --all