В WordPress часто возникает задача выборки записей не только по стандартным параметрам, но и по дополнительным мета данным, которые хранятся в таблице wp_postmeta. Это особенно полезно, если вы добавляете к записям кастомные поля и хотите гибко фильтровать контент на сайте.
В этой статье подробно рассмотрим, как создавать сложные запросы с помощью класса WP_Query и параметра meta_query. Расскажем о нюансах работы с разными типами данных, оптимизации запросов и приведем примеры кода, которые можно сразу использовать в своих проектах.
Что такое meta_query и зачем он нужен
Параметр meta_query позволяет фильтровать записи по значениям мета полей. Это массив условий, каждое из которых описывает ключ, значение, сравнение и другие параметры фильтрации. Благодаря этому можно строить запросы с несколькими условиями, объединёнными через AND или OR.
Например, если у вас есть кастомное поле price для товаров, можно вывести только те записи, где цена больше 1000 рублей.
Структура meta_query
Простейший пример meta_query выглядят так:
$args = [
'post_type' => 'product',
'meta_query' => [
[
'key' => 'price',
'value' => 1000,
'compare' => '>',
'type' => 'NUMERIC'
]
]
];
$query = new WP_Query($args);Здесь мы фильтруем товары с ценой больше 1000. Важно указывать параметр type, чтобы сравнение происходило корректно. По умолчанию все значения воспринимаются как строки.
Создание сложных запросов с несколькими условиями
Если нужно применить сразу несколько фильтров, например, цена больше 1000 и цвет равен "синий", то meta_query поддерживает массив условий с вложенными логическими операциями.
$args = [
'post_type' => 'product',
'meta_query' => [
'relation' => 'AND',
[
'key' => 'price',
'value' => 1000,
'compare' => '>',
'type' => 'NUMERIC'
],
[
'key' => 'color',
'value' => 'синий',
'compare' => '='
]
]
];
$query = new WP_Query($args);Такой запрос вернёт записи, которые удовлетворяют обоим условиям.
Использование relation: AND и OR
В параметре relation можно указать, как объединять условия: AND — все условия должны быть верны; OR — достаточно одного. Это добавляет гибкости при построении выборок.
Например, чтобы выбрать записи с ценой больше 1000 или цветом «синий»:
$args['meta_query']['relation'] = 'OR';Примеры практических задач и решений
Выборка записей с датой больше сегодняшней
Если у вас есть мета поле event_date в формате ГГГГ-ММ-ДД, можно вывести только будущие события:
$args = [
'post_type' => 'event',
'meta_key' => 'event_date',
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_query' => [
[
'key' => 'event_date',
'value' => date('Y-m-d'),
'compare' => '>=',
'type' => 'DATE'
]
]
];
$query = new WP_Query($args);Фильтрация по нескольким значениям одного ключа
Если для одного мета ключа нужно выбрать записи с разными значениями, используйте IN:
$args = [
'post_type' => 'product',
'meta_query' => [
[
'key' => 'color',
'value' => ['синий', 'красный'],
'compare' => 'IN'
]
]
];
$query = new WP_Query($args);Оптимизация запросов с meta_query
Запросы с фильтрацией по мета полям могут сильно нагружать базу, особенно если таблица wp_postmeta содержит много записей. Вот несколько рекомендаций для оптимизации:
- Используйте индексы в базе на поле
meta_key. Обычно они уже есть по умолчанию. - Старайтесь указывать параметр
typeдля правильной сортировки и сравнения. - Избегайте использования слишком сложных и вложенных
meta_query, если можно решить задачу другими способами. - Если фильтрация по мета данным встречается часто, рассмотрите возможность кеширования результатов или создания дополнительной таблицы с агрегированными данными.
Полезные плагины для работы с мета данными и запросами
Для удобства работы с мета полями и их созданием хорошо подходят плагины:
- Advanced Custom Fields (ACF) — позволяет создавать и управлять кастомными полями через удобный интерфейс.
- Meta Box — мощный фреймворк для кастомизации мета полей и создания сложных форм.
- Clearfy Pro — оптимизирует работу сайта и помогает управлять запросами для повышения производительности.
Пример функции-обёртки для WP_Query с meta_query (wptricks_prefix_wp_query_meta)
Для удобства можно сделать универсальную функцию, которая принимает параметры фильтрации и возвращает объекты записей:
function wptricks_prefix_wp_query_meta(array $meta_conditions, string $post_type = 'post', string $relation = 'AND') {
$args = [
'post_type' => $post_type,
'meta_query' => [
'relation' => $relation
]
];
foreach ($meta_conditions as $condition) {
$args['meta_query'][] = $condition;
}
$query = new WP_Query($args);
return $query->posts;
}
// Использование
$conditions = [
[
'key' => 'price',
'value' => 500,
'compare' => '>',
'type' => 'NUMERIC'
],
[
'key' => 'color',
'value' => 'красный',
'compare' => '='
]
];
$results = wptricks_prefix_wp_query_meta($conditions, 'product');
foreach ($results as $post) {
echo $post->post_title . '<br>';
}Такой подход упрощает повторное использование и уменьшает дублирование кода.
Частые ошибки при работе с meta_query и как их избежать
Некоторые распространённые ошибки, которые часто приводят к неправильным результатам или снижению производительности:
- Не указывать параметр
typeпри числовых или датированных данных — приводит к неверным сравнениям. - Использовать
meta_keyиmeta_queryодновременно в некорректном виде — это может вызвать конфликт. - Забывать про параметр
relationпри нескольких условиях, что меняет логику выборки. - Делать запросы в цикле без кеширования — замедляет сайт.
Вывод
Работа с meta_query — мощный инструмент для гибкой фильтрации записей WordPress. Правильно составленные запросы позволяют создавать сложные выборки, необходимые для кастомных сайтов и магазинов. Используйте приведённые в статье рекомендации и примеры, чтобы создавать эффективные и оптимизированные запросы по мета данным.