В повседневной работе с WordPress часто возникает задача организовать удобный и функциональный фильтр по пользовательским полям (custom fields) для улучшения поиска и навигации по записям. Особенно это актуально для сайтов с большим количеством контента, таких как каталоги, блоги с обзорами, портфолио и интернет-магазины. В этой статье мы подробно разберём, как самостоятельно создать такой фильтр с примерами кода и полезными плагинами.
Почему стандартного поиска WordPress недостаточно для фильтрации по пользовательским полям
Стандартный поиск WordPress ищет по заголовкам, контенту и некоторым таксономиям, но не умеет эффективно фильтровать данные по мета-полям. Если у вас есть записи с уникальными атрибутами, например, у товаров — цвет, размер, бренд, или у обзоров — рейтинг, автор и т.д., то базовых возможностей WordPress будет мало.
Чтобы сделать поиск по таким полям, нужно использовать WP_Query с параметром meta_query или подключать плагины, которые расширяют функционал фильтрации.
Это особенно важно для сайтов на WordPress с большим количеством записей, где пользователь хочет быстро найти нужный вариант без лишних кликов.
Использование WP_Query для создания фильтра по пользовательским полям
Для примера создадим фильтр записей, где будем искать по одному или нескольким мета-полям. Предположим, у нас есть записи с мета-полями color и size.
Пример запроса с meta_query
$args = [
'post_type' => 'post',
'meta_query' => [
'relation' => 'AND',
[
'key' => 'color',
'value' => 'red',
'compare' => '='
],
[
'key' => 'size',
'value' => 'large',
'compare' => '='
]
]
];
$query = new WP_Query($args);
Это вернёт все публикации, у которых мета-поле color равно red и size равно large.
Динамический фильтр на основе GET-параметров
Чтобы фильтр работал через URL, нужно получить параметры из запроса и формировать meta_query динамически.
function wponline_get_filtered_posts() {
$meta_query = ['relation' => 'AND'];
if (!empty($_GET['color'])) {
$meta_query[] = [
'key' => 'color',
'value' => sanitize_text_field($_GET['color']),
'compare' => '='
];
}
if (!empty($_GET['size'])) {
$meta_query[] = [
'key' => 'size',
'value' => sanitize_text_field($_GET['size']),
'compare' => '='
];
}
$args = [
'post_type' => 'post',
'meta_query' => $meta_query
];
return new WP_Query($args);
}
Далее вы можете вывести результаты в шаблоне, например, на странице с фильтром.
Создание формы фильтра для пользователей
Чтобы пользователи могли выбрать параметры фильтрации, создадим простую HTML-форму с селекторами.
<form method="get" action="">
<label for="color">Цвет:</label>
<select name="color" id="color">
<option value="">Любой</option>
<option value="red">Красный</option>
<option value="blue">Синий</option>
<option value="green">Зелёный</option>
</select>
<label for="size">Размер:</label>
<select name="size" id="size">
<option value="">Любой</option>
<option value="small">Маленький</option>
<option value="medium">Средний</option>
<option value="large">Большой</option>
</select>
<button type="submit">Применить фильтр</button>
</form>
Для удобства можно использовать AJAX-запросы, чтобы не перезагружать страницу при изменении фильтра.
Плагины для расширенной фильтрации по мета-полям
Если хочется готовое решение с удобным интерфейсом, рассмотрите следующие плагины:
- FacetWP — мощный плагин с поддержкой фильтрации по любым полям, таксономиям и даже кастомным запросам. Отлично подходит для каталогов и магазинов.
- Search & Filter — бесплатный плагин с возможностью создавать фильтры по пользовательским полям, категориям, тегам и другим параметрам.
- WPShop — фильтры продуктов
Эти плагины позволяют строить сложные фильтры без глубоких знаний программирования и имеют удобные визуальные конструкторы.
Пример расширенного фильтра с AJAX и WP_Query
Для повышения удобства пользователей полезно сделать фильтр с подгрузкой результатов без перезагрузки страницы. Вот упрощённый пример:
add_action('wp_ajax_wponline_filter_posts', 'wponline_ajax_filter_posts');
add_action('wp_ajax_nopriv_wponline_filter_posts', 'wponline_ajax_filter_posts');
function wponline_ajax_filter_posts() {
$color = sanitize_text_field($_POST['color'] ?? '');
$size = sanitize_text_field($_POST['size'] ?? '');
$meta_query = ['relation' => 'AND'];
if ($color) {
$meta_query[] = ['key' => 'color', 'value' => $color, 'compare' => '='];
}
if ($size) {
$meta_query[] = ['key' => 'size', 'value' => $size, 'compare' => '='];
}
$args = ['post_type' => 'post', 'meta_query' => $meta_query];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
echo '<p>' . get_the_excerpt() . '</p>';
}
} else {
echo '<p>Ничего не найдено</p>';
}
wp_die();
}
В JavaScript отправляйте AJAX-запрос при изменении фильтра и обновляйте результаты без перезагрузки.
Советы по оптимизации фильтрации по мета-полям
Фильтрация по пользовательским полям может нагрузить базу данных, особенно при большом количестве записей. Чтобы минимизировать проблемы с производительностью, придерживайтесь следующих рекомендаций:
- Используйте индексы в базе данных на колонках meta_key и meta_value, особенно если фильтруете по часто используемым полям.
- Минимизируйте количество условий в meta_query, объединяйте их логически.
- Используйте transient API для кэширования результатов фильтра, если данные не обновляются часто.
- Рассмотрите специализированные поисковые движки, например ElasticSearch, если у сайта очень большой объем данных.
Заключение по созданию собственного фильтра по пользовательским полям в WordPress
Создание собственного фильтра по мета-полям — задача, которая требует понимания WP_Query и правильной организации данных. В статье мы рассмотрели, как сформировать запросы с meta_query, как построить простую форму фильтра и примеры с AJAX для динамической подгрузки. Использование плагинов может сильно упростить задачу, но самостоятельная реализация даёт полный контроль и гибкость.
Для удобства интеграции с WooCommerce и другими плагинами рассмотрите решения от WPSHOP, которые отлично подходят для расширенной фильтрации и кастомизации.