WooCommerce: как добавить кастомный фильтр по мета-полю в GeneratePress

Диагностика проблемы: отсутствие необходимого фильтра по мета-данным товара

В стандартном WooCommerce и GeneratePress нет встроенного функционала для фильтрации товаров по кастомным мета-полям, например, по дополнительным параметрам, добавленным через плагин или вручную. Пользователи сталкиваются с проблемой: на странице категории товаров нельзя отфильтровать товары по нужному мета-полю, что снижает удобство выбора и конверсию.

Пошаговое решение: добавляем кастомный фильтр по мета-полю

1. Определяем мета-ключ и тип значения

Для начала убедитесь, что у товаров есть мета-поле, по которому нужно фильтровать, например, _custom_color с возможными значениями «red», «blue», «green».

2. Регистрируем кастомный виджет фильтра

Добавим кастомный виджет, который будет выводить чекбоксы для значений мета-поля. В файл functions.php дочерней темы GeneratePress или в плагин добавьте следующий код:

class WP_Custom_Meta_Filter_Widget extends WP_Widget {  
  public function __construct() {    
    parent::__construct(      'custom_meta_filter',      'Фильтр по цвету (мета-поле)',      array( 'description' => 'Фильтр товаров по мета-полю custom_color' )    );  
  }

  public function widget($args, $instance) {    
    echo $args['before_widget'];
    echo '<h3>Фильтр по цвету</h3>';

    $colors = array('red' => 'Красный', 'blue' => 'Синий', 'green' => 'Зеленый');
    $current = isset($_GET['filter_color']) ? explode(',', sanitize_text_field($_GET['filter_color'])) : array();

    echo '<form method="GET" id="meta-filter-form">';
    foreach ($colors as $key => $label) {
      $checked = in_array($key, $current) ? 'checked' : '';
      echo '<label><input type="checkbox" name="filter_color[]" value="'.esc_attr($key).'" '.$checked.'> '.$label.'</label><br>';
    }
    echo '<button type="submit">Применить</button>';
    echo '</form>';

    echo $args['after_widget'];
  }

  public function form($instance) { /* Можно добавить настройки виджета */ }
  public function update($new_instance, $old_instance) { return $new_instance; }
}
add_action('widgets_init', function(){ register_widget('WP_Custom_Meta_Filter_Widget'); });

3. Обрабатываем запрос и модифицируем WP_Query для фильтрации

Добавим фильтр, который изменит запрос WooCommerce на страницах архивов товаров, чтобы учитывать выбранные значения мета-поля:

add_action('pre_get_posts', function($query) {  
  if (is_admin() || !$query->is_main_query()) return;
  if (is_post_type_archive('product') || is_tax('product_cat') || is_tax('product_tag')) {
    if (isset($_GET['filter_color']) && is_array($_GET['filter_color'])) {
      $colors = array_map('sanitize_text_field', $_GET['filter_color']);
      $meta_query = array(
        array(
          'key' => '_custom_color',
          'value' => $colors,
          'compare' => 'IN'
        )
      );
      $query->set('meta_query', $meta_query);
    }
  }
});

Проверка результата после внедрения

  • Добавьте виджет «Фильтр по цвету (мета-поле)» в сайдбар на странице магазина.
  • На странице товаров отметьте один или несколько цветов и нажмите «Применить».
  • Убедитесь, что в списке товаров отображаются только те товары, у которых мета-поле _custom_color совпадает с выбранными значениями.
  • Проверьте URL - параметры должны выглядеть как ?filter_color[]=red&filter_color[]=blue.

Частые ошибки и как их исправить

  • Фильтр не работает или не меняет товары: Проверьте, что используете правильный мета-ключ, и что мета-данные действительно есть у товаров. Используйте var_dump(get_post_meta($product_id, '_custom_color', true)); для проверки.
  • Фильтр не сбрасывается или параметры не передаются: Убедитесь, что форма отправляет данные методом GET и что чекбоксы имеют имя с [] для массива.
  • Конфликт с другими плагинами фильтрации: Отключите другие фильтры и проверьте работу, чтобы избежать наложения запросов.

Практические советы по безопасности и производительности

  • Всегда используйте sanitize_text_field для очистки пользовательских данных из $_GET.
  • Для улучшения производительности избегайте тяжелых meta_query с большим количеством условий — по возможности индексируйте мета-поля в базе данных.
  • Кешируйте результаты запроса фильтра, если ожидается большой трафик.
  • Добавьте индикатор загрузки или AJAX-подгрузку для фильтра, чтобы не перезагружать всю страницу (можно сделать в будущем).

Сравнение вариантов реализации фильтрации

Вариант Преимущества Недостатки
Плагин фильтрации (например, WOOF или FacetWP) Готовое решение, много функций, настройка без кода Платные версии, могут замедлять сайт, конфликт с темами
Кастомный виджет + pre_get_posts (как в статье) Полный контроль, без лишних плагинов, легковесно Требует разработки, ограниченный UI без AJAX
Использование WP_Query с AJAX и REST API Лучший UX, обновление без перезагрузки Сложнее в реализации, требует JS и поддержки API
Как добавить поддержку WebP в GeneratePress и оптимизировать загрузку изображений
18.02.2026
Как добавить динамические атрибуты в GeneratePress для успешного SEO
24.02.2026
Как создать динамические отзывы с подгрузкой в GeneratePress
06.01.2026
Как автоматизировать создание резервных копий в GeneratePress на WordPress
27.03.2026
Оптимизация кода GeneratePress для ускорения сайта на WordPress
11.11.2025