WP_Query — это мощный класс WordPress, который позволяет создавать кастомные запросы к базе данных для получения записей в соответствии с различными параметрами. Правильное использование WP_Query открывает большие возможности для разработки гибких и эффективных тем и плагинов. В этой статье подробно рассмотрим, как создавать сложные запросы с помощью WP_Query, разберем реальные примеры, включая фильтрацию по нескольким параметрам, сортировку, пагинацию и использование кастомных полей.
Основы WP_Query: ключевые параметры и их применение
Для начала напомню, что WP_Query используется для выборки записей из базы данных WordPress. Его можно использовать как в шаблонах тем, так и в плагинах. Основные параметры запроса – это post_type, posts_per_page, orderby, order, tax_query, meta_query и другие.
Пример простого запроса для вывода 5 последних записей типа «post»:
$wpbook_query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'DESC'
]);
Затем можно вывести записи в цикле:
if ($wpbook_query->have_posts()) {
while ($wpbook_query->have_posts()) {
$wpbook_query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
echo get_the_excerpt();
}
wp_reset_postdata();
}
Сложные запросы с фильтрацией по таксономиям (tax_query)
Одна из самых частых задач — фильтрация записей по категориям или другим таксономиям, например, по нескольким категориям или тегам одновременно. Для этого существует параметр tax_query, который принимает массив условий.
Пример: вывести записи, которые принадлежат либо категории «новости», либо тегу «акция»:
$wpbook_query = new WP_Query([
'post_type' => 'post',
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'novosti'
],
[
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => 'akciya'
]
]
]);
Параметр relation определяет логику объединения условий — AND или OR. Можно строить и более сложные вложенные запросы, комбинируя таксономии.
Фильтрация по метаданным (meta_query) с поддержкой разных операторов
Если вы используете кастомные поля (метаданные) для хранения дополнительной информации, WP_Query позволяет строить запросы с фильтрацией по ним через параметр meta_query. Это особенно полезно для интернет-магазинов, каталогов и других проектов.
Пример: вывести записи типа «product», у которых цена больше 1000 и меньше 5000:
$wpbook_query = new WP_Query([
'post_type' => 'product',
'meta_query' => [
'relation' => 'AND',
[
'key' => 'price',
'value' => 1000,
'compare' => '>',
'type' => 'NUMERIC'
],
[
'key' => 'price',
'value' => 5000,
'compare' => '<',
'type' => 'NUMERIC'
]
]
]);
Здесь важно указать type, чтобы сравнение происходило корректно для чисел.
Сортировка и пагинация с WP_Query
WP_Query позволяет гибко настраивать порядок вывода записей. Параметр orderby может принимать разные значения — дата, заголовок, значение метаполя и т.д.
Пример сортировки по цене в порядке возрастания:
$wpbook_query = new WP_Query([
'post_type' => 'product',
'meta_key' => 'price',
'orderby' => 'meta_value_num',
'order' => 'ASC'
]);
Для пагинации задайте paged и posts_per_page:
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$wpbook_query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged
]);
В шаблоне выведите навигацию через paginate_links() или другие функции.
Практический пример: создание кастомного запроса для вывода акций с кастомным полем и категорией
Допустим, нам нужно вывести записи типа «sale» из категории «special-offers», где дата окончания акции больше текущей даты. Для этого используем WP_Query с tax_query и meta_query:
function wpbook_get_active_sales() {
$today = date('Y-m-d');
$query = new WP_Query([
'post_type' => 'sale',
'tax_query' => [[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'special-offers'
]],
'meta_query' => [[
'key' => 'sale_end_date',
'value' => $today,
'compare' => '>=',
'type' => 'DATE'
]],
'orderby' => 'meta_value',
'meta_key' => 'sale_end_date',
'order' => 'ASC'
]);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a> — до ' . get_post_meta(get_the_ID(), 'sale_end_date', true) . '</li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Активных акций нет</p>';
}
}
Вызовите эту функцию в нужном шаблоне или через шорткод, чтобы вывести список актуальных акций.
Советы по оптимизации запросов WP_Query
Сложные запросы могут нагрузить базу данных, особенно если выборка идет по метаданным и таксономиям. Несколько рекомендаций для оптимизации:
- Избегайте избыточного использования
meta_query, особенно с операторамиLIKEи без указания типа. - Используйте кэширование результатов запросов с помощью Transients API или плагинов кеширования.
- По возможности индексируйте кастомные поля в базе данных.
- Если используете WP_Query на страницах с высокой посещаемостью, подумайте о создании собственных SQL-запросов с помощью $wpdb для максимальной производительности.
Заключение
WP_Query — это универсальный инструмент для выборки записей с любыми условиями. Знание тонкостей его параметров позволяет создавать удобные и быстрые интерфейсы для пользователей и администраторов сайта. В статье мы рассмотрели фильтрацию по таксономиям и метаполям, сортировку, пагинацию и оптимизацию. Используйте приведённые примеры и адаптируйте их под свои задачи.
Для расширения функционала и упрощения работы с WP_Query рекомендую обратить внимание на плагин Clearfy Pro, который содержит удобные инструменты для оптимизации и настройки WordPress.