При работе с большим количеством записей в WordPress часто возникает необходимость создать сложный фильтр для вывода постов по разным параметрам, включая мета-поля (custom fields). В этой статье рассмотрим, как создать такой комплексный фильтр, используя WP_Query с параметрами meta_query, а также приведём примеры плагинов и полезные советы для оптимизации.
Что такое meta_query и зачем он нужен для фильтрации постов
Meta_query — это специальный параметр класса WP_Query, который позволяет фильтровать записи по значениям произвольных полей (custom fields или мета-записей). Он поддерживает работу с несколькими условиями, логическими операторами AND и OR, а также сравнением по разным типам данных.
Использование meta_query особенно актуально, если вы храните в мета-полях дополнительные данные, например, рейтинг, дату события, цену товара и т.д. Это позволяет создавать гибкие фильтры без необходимости создавать дополнительные таблицы или сложные запросы к базе.
Пример простого meta_query:
$args = [
'post_type' => 'post',
'meta_query' => [
[
'key' => 'price',
'value' => 1000,
'compare' => '>=',
'type' => 'NUMERIC'
]
]
];
$query = new WP_Query($args);Создание комплексного фильтра с несколькими условиями meta_query
Для создания сложного фильтра можно использовать вложенные условия с ключом relation, который задаёт логику между условиями — AND или OR. Например, отфильтровать посты, где цена больше 1000 и рейтинг больше 4:
$args = [
'post_type' => 'product',
'meta_query' => [
'relation' => 'AND',
[
'key' => 'price',
'value' => 1000,
'compare' => '>',
'type' => 'NUMERIC'
],
[
'key' => 'rating',
'value' => 4,
'compare' => '>=',
'type' => 'NUMERIC'
]
]
];
$query = new WP_Query($args);Такой запрос выбирает товары с ценой выше 1000 и рейтингом не ниже 4.
Важно учитывать, что для сложных запросов с множеством условий и большим количеством записей стоит оптимизировать базу, например, добавлять индексы к мета-полям или использовать специализированные плагины кэширования.
Пример функции для вывода фильтра и обработки запросов на сайте wplink.ru
Давайте создадим простую функцию для вывода формы фильтра и получения результатов с использованием meta_query. Код можно добавить в functions.php вашей темы или в отдельный плагин.
function wplink_render_post_filter() {
// Проверяем, был ли отправлен фильтр
$price_min = isset($_GET['price_min']) ? intval($_GET['price_min']) : 0;
$price_max = isset($_GET['price_max']) ? intval($_GET['price_max']) : 0;
$rating_min = isset($_GET['rating_min']) ? intval($_GET['rating_min']) : 0;
$meta_query = ['relation' => 'AND'];
if ($price_min) {
$meta_query[] = [
'key' => 'price',
'value' => $price_min,
'compare' => '>=',
'type' => 'NUMERIC'
];
}
if ($price_max) {
$meta_query[] = [
'key' => 'price',
'value' => $price_max,
'compare' => '<=',
'type' => 'NUMERIC'
];
}
if ($rating_min) {
$meta_query[] = [
'key' => 'rating',
'value' => $rating_min,
'compare' => '>=',
'type' => 'NUMERIC'
];
}
$args = [
'post_type' => 'product',
'meta_query' => $meta_query
];
$query = new WP_Query($args);
// Вывод формы фильтра
echo '<form method="GET">';
echo '<label>Цена от: <input type="number" name="price_min" value="' . esc_attr($price_min) . '" /></label>';
echo '<label>Цена до: <input type="number" name="price_max" value="' . esc_attr($price_max) . '" /></label>';
echo '<label>Минимальный рейтинг: <input type="number" name="rating_min" value="' . esc_attr($rating_min) . '" min="0" max="5" /></label>';
echo '<input type="submit" value="Фильтровать" />';
echo '</form>';
// Вывод результатов
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
$price = get_post_meta(get_the_ID(), 'price', true);
$rating = get_post_meta(get_the_ID(), 'rating', true);
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a> — Цена: ' . esc_html($price) . ', Рейтинг: ' . esc_html($rating) . '</li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Товары не найдены.</p>';
}
}Для вывода фильтра вызовите функцию wplink_render_post_filter() в нужном шаблоне, например, в странице с товарами.
Лучшие плагины для создания фильтров с мета-записями в WordPress
Если хочется использовать готовые решения с интерфейсом настройки, можно рассмотреть следующие плагины, которые хорошо работают с meta_query и позволяют создавать сложные фильтры без кода:
- FacetWP — мощный плагин с поддержкой фильтрации по мета-полям, таксономиям, поиску и AJAX-подгрузке.
- Filter Everything — бесплатный и платный вариант, поддерживает фильтрацию любых типов данных, прост в настройке.
- WPGPT Filter Pro — плагин из набора WPShop, который облегчает создание динамических фильтров с мета-записями и интеграцию с контентом.
Использование таких плагинов экономит время и позволяет быстро внедрить фильтрацию на сайте, особенно для интернет-магазинов или каталогов.
Оптимизация запросов с meta_query для больших сайтов
При работе с большим количеством записей и мета-полей стоит учитывать, что запросы с meta_query могут быть ресурсоёмкими и замедлять сайт. Вот несколько рекомендаций для повышения производительности:
- Используйте индексы в базе данных для ключей meta_key, если возможно. Для этого можно обратиться к хостеру или использовать плагины оптимизации базы.
- Кэшируйте результаты запросов с помощью Transients API или сторонних плагинов кэширования.
- Минимизируйте количество условий meta_query, особенно с операторами OR, так как они могут создавать сложные SQL-запросы.
- Рассмотрите возможность использования пользовательских таблиц или внешних сервисов для фильтрации, если стандартные возможности WordPress не справляются.
Пример кэширования результата запроса с meta_query
function wplink_get_filtered_products_with_cache($args) {
$cache_key = 'wplink_filtered_products_' . md5(serialize($args));
$products = get_transient($cache_key);
if ($products === false) {
$query = new WP_Query($args);
$products = $query->posts;
set_transient($cache_key, $products, HOUR_IN_SECONDS);
}
return $products;
}Это позволит снизить нагрузку на базу при повторных запросах с одинаковыми параметрами.
Выводы и рекомендации по созданию фильтров с meta_query в WordPress
Фильтрация постов по мета-записям — мощный инструмент для создания удобных и гибких каталогов, интернет-магазинов и информационных сайтов. Важно грамотно строить запросы, использовать relation, правильно выбирать типы сравнения и оптимизировать базу данных.
Для новичков рекомендуется начать с простых фильтров и постепенно добавлять новые условия. Для больших проектов стоит рассмотреть готовые плагины из набора WPShop с UTM-метками для поддержки и обновлений, например, WPGPT или Clearfy Pro, которые помогают оптимизировать работу сайта и расширить функциональность.