Как создать динамический фильтр по мета-полям в WordPress с примером кода

Часто на сайтах WordPress возникает задача предоставить пользователям удобный способ фильтрации записей по дополнительным данным — мета-полям. Особенно это актуально для интернет-магазинов, каталогов, портфолио, где у каждой записи есть свои свойства: цвет, цена, дата, автор и т.д. В этой статье подробно разберём, как создать динамический фильтр по мета-полям без использования громоздких плагинов, а также рассмотрим варианты с популярными инструментами.

Что такое мета-поля и зачем нужен динамический фильтр

Мета-поля — это произвольные поля, в которых хранятся дополнительные данные о записи в WordPress. Например, для товара это может быть цена, бренд, наличие на складе, цвет и так далее. Фильтрация по мета-полям позволяет пользователю быстро найти нужные записи, не просматривая весь каталог.

Динамический фильтр — это такой фильтр, который автоматически подстраивается под доступные значения мета-полей на сайте. Например, если в базе есть товары только трёх цветов, выпадающий список цвета покажет именно эти три варианта, без лишних.

Такой подход повышает удобство поиска и снижает нагрузку на сервер, так как запросы становятся более точными.

Создание динамического фильтра вручную: подготовка и логика

Для создания фильтра нам понадобится:

  • Вывести форму с элементами управления (select, чекбоксы) для каждого мета-поля, по которому хотим фильтровать;
  • Собрать параметры фильтра из запроса пользователя;
  • Сформировать WP_Query с аргументом meta_query на основе выбранных фильтров;
  • Вывести результаты с пагинацией.

Особенность в том, что значения для формы нужно получать динамически, чтобы не показывать пустые варианты. Для этого выполняем запрос к базе, который возвращает уникальные значения мета-поля.

Пример получения уникальных значений мета-поля

$meta_key = 'color';
$values = $wpdb->get_col($wpdb->prepare(
    "SELECT DISTINCT meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s ORDER BY meta_value",
    $meta_key
));

Этот код возвращает все уникальные цвета, которые есть в базе для мета-поля color. Аналогично можно сделать для других полей.

Пример реализации динамического фильтра по мета-полям

Ниже пример простого фильтра по двум мета-полям: color и price_range. Для простоты считаем, что price_range — это строка с диапазонами, например, 0-1000, 1000-5000.

function wpsystem_get_unique_meta_values($meta_key) {
    global $wpdb;
    return $wpdb->get_col($wpdb->prepare(
        "SELECT DISTINCT meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s ORDER BY meta_value",
        $meta_key
    ));
}

// Получаем значения для формы
$colors = wpsystem_get_unique_meta_values('color');
$price_ranges = ['0-1000', '1000-5000', '5000-10000'];

// Вывод формы
?>
<form method="GET" action="">
    <label>Цвет:</label>
    <select name="color">
        <option value="">Все</option>
        <?php foreach($colors as $color): ?>
            <option value="<?php echo esc_attr($color); ?>" <?php selected($_GET['color'] ?? '', $color); ?>><?php echo esc_html($color); ?></option>
        <?php endforeach; ?>
    </select>

    <label>Цена:</label>
    <select name="price_range">
        <option value="">Все</option>
        <?php foreach($price_ranges as $range): ?>
            <option value="<?php echo esc_attr($range); ?>" <?php selected($_GET['price_range'] ?? '', $range); ?>><?php echo esc_html($range); ?></option>
        <?php endforeach; ?>
    </select>

    <button type="submit">Фильтровать</button>
</form>
<?php

// Обработка фильтра и запрос
$meta_query = [];

if(!empty($_GET['color'])) {
    $meta_query[] = [
        'key' => 'color',
        'value' => sanitize_text_field($_GET['color']),
        'compare' => '=',
    ];
}

if(!empty($_GET['price_range'])) {
    list($min, $max) = explode('-', sanitize_text_field($_GET['price_range']));
    $meta_query[] = [
        'key' => 'price',
        'value' => [(int)$min, (int)$max],
        'type' => 'NUMERIC',
        'compare' => 'BETWEEN',
    ];
}

$args = [
    'post_type' => 'product',
    'meta_query' => $meta_query,
];

$query = new WP_Query($args);

if($query->have_posts()) {
    echo '<ul>';
    while($query->have_posts()) {
        $query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';
} else {
    echo '<p>Товары не найдены</p>';
}
wp_reset_postdata();

Использование плагинов для создания фильтров по мета-полям

Если хочется быстро и без кода сделать фильтрацию, стоит обратить внимание на проверенные плагины:

  • FacetWP — мощный и гибкий плагин для фильтрации по любым полям, поддерживает AJAX и кэширование;
  • Filter Everything — бесплатное решение с базовыми возможностями фильтрации;
  • WPSmart Filters — хорошо интегрируется с популярными конструкторами и WooCommerce.

Для примера, если вы используете тему Reboot или Root с магазина WPSHOP.RU?utm_source=wpsystem.ru&utm_medium=article&utm_campaign=kak-sozdat-dinamicheskij-filtr-po-meta-poljam-v-wordpress, рекомендую попробовать FacetWP — он отлично работает с кастомными типами записей и мета-полями.

Интеграция FacetWP с кастомными мета-полями

После установки и активации FacetWP нужно:

  1. Создать новый фейсет (фильтр) в админке FacetWP, указав тип фильтра (select, чекбокс и т.д.)
  2. Выбрать источник данных — мета-поле, например, color
  3. Вставить шорткод [facetwp facet="color_filter"] в нужное место шаблона или страницы
  4. Подключить вывод результатов — обычно это шорткод [facetwp template="products"] или добавить в WP_Query параметр 'facetwp' => true

FacetWP автоматически обновит доступные варианты фильтра в зависимости от текущих результатов, что делает фильтрацию очень удобной.

Советы по оптимизации фильтров по мета-полям

Фильтрация по мета-полям может сильно нагрузить базу, особенно при большом количестве записей. Чтобы этого избежать, используйте следующие рекомендации:

  • Добавьте индекс по столбцу meta_key и meta_value в таблице wp_postmeta (при больших объёмах);
  • Используйте типы данных NUMERIC в meta_query для числовых фильтров, чтобы запросы были эффективнее;
  • Кэшируйте результаты запросов с помощью Transients API или внешних решений;
  • По возможности создавайте отдельные таблицы для часто используемых мета-данных, чтобы ускорить выборки;
  • Используйте AJAX для подгрузки результатов без перезагрузки страницы, чтобы улучшить UX.

Итог

Динамические фильтры по мета-полям — мощный инструмент для улучшения поиска и навигации на сайте WordPress. Реализовать их можно как вручную с помощью WP_Query и кастомного кода, так и с помощью специализированных плагинов, например, FacetWP.

Если нужна дополнительная автоматизация и интеграция с вашим сайтом, советую посмотреть решения из магазина WPSHOP.RU?utm_source=wpsystem.ru&utm_medium=article&utm_campaign=kak-sozdat-dinamicheskij-filtr-po-meta-poljam-v-wordpress, где есть готовые темы и плагины для удобной работы с мета-полями и каталогами.

Как создать автоматический импорт продуктов в WooCommerce
16.02.2026
Как создать динамический выбор сообщений в админке WordPress
31.01.2026
Как использовать фильтры WooCommerce для изменения цены товара
08.03.2026
Как создать динамические страницы в WordPress без плагинов
04.01.2026
Как создать автоматическое удаление старого контента в WordPress
21.01.2026