Часто на сайтах 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 нужно:
- Создать новый фейсет (фильтр) в админке FacetWP, указав тип фильтра (select, чекбокс и т.д.)
- Выбрать источник данных — мета-поле, например,
color - Вставить шорткод
[facetwp facet="color_filter"]в нужное место шаблона или страницы - Подключить вывод результатов — обычно это шорткод
[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, где есть готовые темы и плагины для удобной работы с мета-полями и каталогами.