В WordPress часто возникает задача вывести список записей (постов), которые принадлежат определенной таксономии и при этом фильтровать или сортировать их по значению произвольных полей (мета полей). В этой статье мы подробно разберем, как реализовать такой запрос с помощью WP_Query, а также рассмотрим примеры кода и рекомендации по оптимизации.
Что такое таксономии и мета поля в WordPress
Таксономии — это способ группировки постов по категориям, меткам или кастомным классификациям. В стандартном WordPress есть категории и метки, но можно создавать свои таксономии для кастомных типов записей.
Мета поля — это дополнительные данные, которые можно добавить к посту, например, цена товара, дата события, рейтинг и т.п. Они хранятся в таблице wp_postmeta и могут использоваться для расширенного поиска и сортировки.
Для примера предположим, что у нас есть таксономия product_category и посты с мета полем price.
Как сформировать запрос WP_Query для вывода постов по таксономии
Для фильтрации по таксономии используется параметр tax_query.
$args = [
'post_type' => 'product',
'tax_query' => [
[
'taxonomy' => 'product_category',
'field' => 'slug',
'terms' => 'electronics',
],
],
];
$query = new WP_Query($args);Этот код выведет все посты типа product, которые принадлежат таксономии product_category с ярлыком (slug) electronics.
Добавление фильтрации по мета полям
Чтобы дополнительно отфильтровать посты по мета полю, например, вывести товары с ценой больше 10000, используем параметр meta_query:
$args = [
'post_type' => 'product',
'tax_query' => [
[
'taxonomy' => 'product_category',
'field' => 'slug',
'terms' => 'electronics',
],
],
'meta_query' => [
[
'key' => 'price',
'value' => 10000,
'compare' => '>',
'type' => 'NUMERIC',
],
],
];
$query = new WP_Query($args);Такой запрос выведет товары из категории "electronics" с ценой больше 10000.
Сортировка постов по мета полю
Часто нужно не только фильтровать, но и сортировать записи по мета значению. Например, отсортировать товары по возрастанию цены.
$args = [
'post_type' => 'product',
'tax_query' => [
[
'taxonomy' => 'product_category',
'field' => 'slug',
'terms' => 'electronics',
],
],
'meta_key' => 'price',
'orderby' => 'meta_value_num',
'order' => 'ASC',
];
$query = new WP_Query($args);Обратите внимание, что для числовой сортировки нужно использовать orderby => 'meta_value_num', а не просто meta_value.
Комбинированный запрос с фильтрацией и сортировкой
Можно совместить фильтрацию по таксономии и мета полю, а также сортировку. Например, вывести товары категории "electronics" с ценой больше 10000, отсортировав по цене:
$args = [
'post_type' => 'product',
'tax_query' => [
[
'taxonomy' => 'product_category',
'field' => 'slug',
'terms' => 'electronics',
],
],
'meta_query' => [
[
'key' => 'price',
'value' => 10000,
'compare' => '>',
'type' => 'NUMERIC',
],
],
'meta_key' => 'price',
'orderby' => 'meta_value_num',
'order' => 'ASC',
];
$query = new WP_Query($args);Вывод результатов запроса и шаблон цикла
После создания запроса выводим записи в цикле:
if ( $query->have_posts() ) {
echo '<ul>';
while ( $query->have_posts() ) {
$query->the_post();
$price = get_post_meta(get_the_ID(), 'price', true);
echo '<li>' . get_the_title() . ' — Цена: ' . esc_html($price) . '</li>';
}
echo '</ul>';
} else {
echo 'Товары не найдены';
}
wp_reset_postdata();Такой шаблон выведет список постов с их названием и ценой.
Оптимизация запросов по мета полям и таксономиям
Запросы с meta_query могут быть медленными на больших сайтах, так как таблица wp_postmeta не оптимизирована под сложные запросы. Рекомендуется:
- Использовать индексы на мета ключах и значениях (на уровне базы данных).
- Минимизировать количество
meta_queryиtax_queryв одном запросе. - Использовать кеширование результатов запросов (например, через Transients API или внешние кеши).
Для сложных фильтров и сортировок можно рассмотреть сторонние плагины, например, Clearfy Pro, который помогает улучшить производительность и оптимизировать запросы.
Практические советы и распространенные ошибки
Проверяйте типы данных в meta_query
Если сравниваете числовые значения, всегда указывайте 'type' => 'NUMERIC', иначе сортировка и сравнение будут работать некорректно.
Используйте правильный параметр field в tax_query
При указании таксономии можно фильтровать по ID, slug или name. Обычно slug удобнее, но важно, чтобы значение совпадало с реальным ярлыком термина.
Не забывайте сбрасывать postdata
После кастомных запросов вызывайте wp_reset_postdata(), чтобы избежать конфликтов с глобальным циклом WordPress.
Заключение
Вывод постов по таксономии с учетом мета полей — мощный инструмент для создания гибких и функциональных сайтов на WordPress. Используйте tax_query и meta_query в WP_Query, комбинируйте фильтры и сортировку, оптимизируйте запросы и кешируйте результаты для высокой производительности.
Если хотите расширить функционал, обратите внимание на плагины из WPShop, которые помогут упростить задачи с таксономиями и мета полями.