В WordPress для выборки записей из базы данных разработчики чаще всего используют класс WP_Query. Это мощный инструмент, который позволяет гибко формировать запросы к базе, фильтровать записи по таксономиям, метаданным, дате и многим другим параметрам.
Особенности работы с WP_Query: фильтрация по метаданным и таксономиям
Одна из самых востребованных задач — создавать запросы с несколькими условиями, которые сложно выполнить с помощью стандартных параметров. Например, вывести все записи с определённым значением пользовательского поля (метаданных) и одновременно относящиеся к определённой категории или тегу.
Для этого в WP_Query используется параметр meta_query для метаданных и tax_query для таксономий. Они поддерживают вложенные массивы и логические операторы AND и OR.
Рассмотрим пример запроса, который выведет записи с метаполем color равным red и относящиеся к категории с ID 10:
$args = [
'post_type' => 'post',
'meta_query' => [
[
'key' => 'color',
'value' => 'red',
'compare' => '='
]
],
'tax_query' => [
[
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => 10
]
]
];
$query = new WP_Query($args);Далее можно вывести записи из $query->posts и обработать их.
Сложные фильтры с логикой AND/OR и вложенными условиями
Иногда нужно строить более сложные запросы, например, получить записи, у которых метаполе price больше 1000 или метаполе stock больше 10, и при этом категория — не определённая.
Для этого meta_query и tax_query поддерживают параметр relation, который может быть AND или OR. Можно вкладывать массивы в массивы для группировки условий.
Пример для метаданных с условием price > 1000 OR stock > 10:
$args = [
'post_type' => 'product',
'meta_query' => [
'relation' => 'OR',
[
'key' => 'price',
'value' => 1000,
'compare' => '>',
'type' => 'NUMERIC'
],
[
'key' => 'stock',
'value' => 10,
'compare' => '>',
'type' => 'NUMERIC'
]
],
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => ['excluded-category'],
'operator' => 'NOT IN'
]
]
];
$query = new WP_Query($args);Этот пример выведет товары с ценой больше 1000 или количеством на складе более 10, но исключит товары из категории excluded-category.
Пример создания собственного плагина с функцией для сложного фильтра
Для удобства можно оформить часто используемые запросы в функцию с префиксом wpbook_. Например, функция для получения постов с фильтрацией по метаданным и таксономиям:
function wpbook_get_filtered_posts($meta_filters = [], $tax_filters = [], $relation = 'AND') {
$args = [
'post_type' => 'post',
'meta_query' => [],
'tax_query' => [],
'meta_query' => [
'relation' => $relation
],
'tax_query' => [
'relation' => $relation
]
];
if (!empty($meta_filters)) {
$args['meta_query'] = array_merge(['relation' => $relation], $meta_filters);
}
if (!empty($tax_filters)) {
$args['tax_query'] = array_merge(['relation' => $relation], $tax_filters);
}
$query = new WP_Query($args);
return $query->posts;
}Использование функции:
$meta_filters = [
[
'key' => 'color',
'value' => 'blue',
'compare' => '='
]
];
$tax_filters = [
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => ['news', 'updates'],
'operator' => 'IN'
]
];
$posts = wpbook_get_filtered_posts($meta_filters, $tax_filters, 'AND');Вы получите все посты с метаполем color равным blue, относящиеся к категориям news или updates.
Советы по оптимизации сложных запросов WP_Query
Сложные запросы с множеством условий могут замедлить сайт. Чтобы этого избежать:
- Используйте правильные индексы в базе данных (WordPress уже индексирует мета и таксономии).
- Кэшируйте результаты запросов с помощью Transients API или внешних систем кеширования.
- Минимизируйте количество условий и избегайте тяжелых сравнений в
meta_query(например, LIKE вместо =). - Используйте пагинацию, чтобы не загружать слишком много записей сразу.
Для кэширования можно использовать плагин Clearfy Pro, который поможет оптимизировать базу и кеш запросов.
Заключение: гибкость и мощь WP_Query для решения нестандартных задач
WP_Query — отличный инструмент для построения фильтрованных запросов в WordPress. При правильном применении и понимании структуры параметров meta_query и tax_query можно создавать уникальные выборки под любые задачи.
Используйте примеры из статьи, экспериментируйте с логическими операторами и типами сравнений. А для оптимизации не забывайте про кэширование и проверку нагрузки на сервер.