WP_Query — это мощный класс WordPress, который позволяет создавать кастомные запросы к базе данных для получения постов по самым разным параметрам. Грамотное использование WP_Query позволяет создавать сложные фильтры, комбинировать условия, получать записи из разных таксономий и метаполей. В этой статье мы детально разберём, как настроить сложные запросы с помощью WP_Query, рассмотрим примеры и полезные советы по оптимизации.
Основы работы с классом WP_Query
WP_Query используется для получения записей постов с определёнными параметрами. Основная идея — передать массив аргументов в конструктор класса, который затем выполнит SQL-запрос к базе данных. Результатом будет объект с набором постов, соответствующих условиям.
Пример базового запроса для получения 5 последних записей типа post:
$args = [
'post_type' => 'post',
'posts_per_page' => 5
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo get_the_title() . '<br>';
}
wp_reset_postdata();
}Этот код выведет заголовки 5 последних стандартных записей.
Создание сложных запросов с несколькими условиями
Для более сложных условий используется параметр meta_query и tax_query. Они позволяют фильтровать записи по мета-полям и таксономиям соответственно. Можно комбинировать несколько условий с помощью логических операторов AND и OR.
Использование meta_query для фильтрации по пользовательским полям
Допустим, у вас есть кастомное поле price и нужно получить записи с ценой от 1000 до 5000.
$args = [
'post_type' => 'product',
'meta_query' => [
[
'key' => 'price',
'value' => [1000, 5000],
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
]
]
];
$query = new WP_Query($args);Этот код выберет товары, у которых в мета-поле price значение между 1000 и 5000.
Фильтрация по таксономиям с tax_query
Если нужно выбрать записи, принадлежащие нескольким категориям или меткам, используется tax_query. Например, получить посты, относящиеся к категории «Новости» или метке «Событие».
$args = [
'post_type' => 'post',
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => ['novosti']
],
[
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => ['sobytie']
]
]
];
$query = new WP_Query($args);Здесь relation определяет логику между условиями — в данном случае OR.
Объединение meta_query и tax_query в одном запросе
Очень часто требуется объединить фильтрацию по метаполям и таксономиям. В этом случае оба параметра добавляются в массив аргументов WP_Query одновременно.
$args = [
'post_type' => 'product',
'meta_query' => [
[
'key' => 'price',
'value' => 2000,
'type' => 'NUMERIC',
'compare' => '>='
]
],
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => ['gadgets']
]
]
];
$query = new WP_Query($args);Этот запрос выберет товары из категории «gadgets» с ценой от 2000 и выше.
Использование пользовательской функции wpload_wp_query для упрощения запросов
Для удобства можно создать функцию-обёртку, которая будет упрощать создание сложных запросов с WP_Query и добавлять стандартные параметры. Например:
function wpload_wp_query($args) {
$default_args = [
'posts_per_page' => 10,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC'
];
$args = array_merge($default_args, $args);
return new WP_Query($args);
}Теперь можно вызывать эту функцию для любых запросов, передавая только нужные параметры.
Оптимизация и кеширование сложных WP_Query
Сложные запросы могут сильно нагрузить базу данных, особенно при большом объёме данных. Чтобы этого избежать, применяйте следующие рекомендации:
- Кеширование результатов. Используйте Transients API или объектный кеш для хранения результатов сложных запросов и уменьшения количества обращений к базе.
- Пагинация. Ограничивайте количество выводимых записей с помощью параметра
posts_per_pageи реализуйте пагинацию. - Выбор полей. Если нужны только ID постов, используйте параметр
fields => 'ids'— это ускорит запрос. - Индексация. При необходимости создавайте индексы в базе для часто используемых мета-полей.
Практический пример: фильтр товаров с несколькими условиями и пагинацией
Рассмотрим пример полного кода для фильтрации товаров по ценам, категориям и пагинации:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = [
'post_type' => 'product',
'posts_per_page' => 12,
'paged' => $paged,
'meta_query' => [
[
'key' => 'price',
'value' => [1000, 5000],
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
]
],
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => ['electronics', 'gadgets'],
'operator' => 'IN'
]
]
];
$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_post_meta(get_the_ID(), 'price', true) . '</p>';
}
// Пагинация
echo paginate_links([
'total' => $query->max_num_pages
]);
wp_reset_postdata();
} else {
echo '<p>Товары не найдены.</p>';
}Полезные плагины для работы с WP_Query и кастомными запросами
Для упрощения работы с WP_Query и создания сложных фильтров можно использовать плагины:
- Search & Filter — удобный визуальный фильтр, который позволяет создавать сложные запросы без кода.
- Clearfy Pro — оптимизация и настройка WordPress, включая улучшение запросов и кеширования.
- WPRemark — плагин для комментариев с расширенными возможностями, может влиять на запросы комментариев.
Заключение по сложным запросам WP_Query
WP_Query — универсальный инструмент для гибкого получения постов в WordPress. Освоив параметры meta_query, tax_query, а также комбинируя их, можно создавать практически любые фильтры. Важно помнить про оптимизацию, кеширование и пагинацию, чтобы сделать сайт быстрым и отзывчивым.
Используйте приведённые примеры и создавайте свои сложные запросы, адаптированные под задачи вашего сайта.