В WordPress часто возникает задача вывести записи (посты) не просто по категориям, а с более тонкой фильтрацией по таксономиям и их терминам. Особенно это актуально для кастомных типов записей и пользовательских таксономий. В этой статье разберём, как правильно использовать класс WP_Query для выборочного отображения постов по таксономиям, чтобы можно было гибко контролировать вывод на любом участке сайта.
Что такое таксономии и зачем фильтровать записи по ним
Таксономии в WordPress – это системы классификации записей. Стандартные таксономии — это категории и метки. Но также можно создавать свои таксономии (регистрировать кастомные) для более точной группировки контента.
Например, если у вас сайт с рецептами, можно создать таксономию кухня (итальянская, японская), а также таксономию время приготовления (быстрые, медленные). Тогда выборка рецептов по таким критериям позволит посетителям быстро находить нужные блюда.
Правильное использование таксономий и запросов по ним существенно улучшает удобство сайта и помогает сделать его контент более релевантным.
Использование WP_Query для выборки записей по таксономиям
Основной способ выборки постов по таксономиям – использовать параметры tax_query в классе WP_Query. Этот параметр позволяет создавать сложные условия фильтрации по одной или нескольким таксономиям.
Пример простого запроса, который выбирает записи из таксономии category с термином novosti:
$args = [
'post_type' => 'post',
'tax_query' => [
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'novosti',
],
],
];
$query = new WP_Query($args);Здесь ключевой момент – элемент массива tax_query с параметрами:
taxonomy— имя таксономии;field— по какому полю искать термин (slug, id, name);terms— конкретное значение или массив значений терминов.
Сложные запросы с несколькими таксономиями
Можно фильтровать по нескольким таксономиям одновременно с помощью логики AND или OR. Например, вывести записи из категории «novosti» И с меткой «aktsiya»:
$args = [
'post_type' => 'post',
'tax_query' => [
'relation' => 'AND',
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'novosti',
],
[
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => 'aktsiya',
],
],
];
$query = new WP_Query($args);Это позволяет очень гибко формировать выборки и отображать нужный контент.
Пример функции yelly_get_filtered_posts для выборочного вывода
Чтобы упростить повторное использование, создадим функцию yelly_get_filtered_posts, которая принимает массив параметров и возвращает HTML с постами:
function yelly_get_filtered_posts($taxonomy_filters = [], $post_type = 'post', $posts_per_page = 5) {
$tax_query = [];
foreach ($taxonomy_filters as $taxonomy => $terms) {
if (!empty($terms)) {
$tax_query[] = [
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => (array)$terms,
];
}
}
$args = [
'post_type' => $post_type,
'posts_per_page' => $posts_per_page,
];
if (!empty($tax_query)) {
if (count($tax_query) > 1) {
$args['tax_query'] = array_merge(['relation' => 'AND'], $tax_query);
} else {
$args['tax_query'] = $tax_query;
}
}
$query = new WP_Query($args);
if (!$query->have_posts()) {
return '<p>Записей не найдено.</p>';
}
$output = '<ul class="yelly-post-list">';
while ($query->have_posts()) {
$query->the_post();
$output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
$output .= '</ul>';
wp_reset_postdata();
return $output;
}Эту функцию можно вызвать, например, так:
echo yelly_get_filtered_posts([
'category' => 'novosti',
'post_tag' => ['aktsiya', 'skidki']
], 'post', 10);Она выведет список из 10 записей, которые одновременно принадлежат категории novosti и имеют одну из меток aktsiya или skidki.
Использование плагина Clearfy Pro для оптимизации запросов и таксономий
Если вы хотите дополнительно оптимизировать работу с таксономиями и очистить базу данных от ненужных терминов, можно использовать плагин Clearfy Pro. Он позволяет быстро управлять таксономиями, отключать неиспользуемые и ускорять запросы.
Например, Clearfy Pro умеет удалять спам-термины и оптимизировать запросы к базе данных, что особенно полезно на больших сайтах с сотнями тысяч записей и терминов.
Это помогает избежать тормозов при сложных фильтрациях и уменьшает нагрузку на сервер.
Советы по производительности при работе с таксономиями в WordPress
При частом использовании сложных запросов с tax_query важно учитывать производительность:
- Используйте кэширование результатов запросов (например, с помощью Transients API или внешнего кэширования);
- Ограничивайте количество одновременно фильтруемых таксономий и терминов;
- Оптимизируйте структуру таксономий: избегайте избыточных и редко используемых;
- Проверяйте индексы таблиц базы данных, чтобы запросы выполнялись быстрее;
- Используйте специализированные плагины для оптимизации, например, Clearfy Pro.
Как кэшировать выборку с tax_query
Пример простого кэширования с Transients API:
function yelly_get_cached_filtered_posts($taxonomy_filters, $post_type = 'post', $posts_per_page = 5) {
$cache_key = 'yelly_posts_' . md5(serialize([$taxonomy_filters, $post_type, $posts_per_page]));
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
$result = yelly_get_filtered_posts($taxonomy_filters, $post_type, $posts_per_page);
set_transient($cache_key, $result, 12 * HOUR_IN_SECONDS);
return $result;
}Такой подход снижает нагрузку на базу данных при повторных обращениях.
Выводы и рекомендации
Выборочное отображение постов по таксономиям — мощный инструмент для создания удобных и гибких сайтов на WordPress. Используя WP_Query с параметром tax_query, вы можете легко строить сложные фильтры и отображать именно тот контент, который нужен пользователям.
Для упрощения работы рекомендуем использовать функцию yelly_get_filtered_posts, а для повышения производительности — кэширование и плагины оптимизации, такие как Clearfy Pro.
Соблюдая простые правила фильтрации и оптимизации, вы сможете создавать быстрые и удобные сайты с продвинутыми возможностями по выбору и отображению контента.