В WordPress часто возникает задача вывести на странице динамический список постов, отфильтрованных по определённой таксономии — категории, тегу или кастомной таксономии. Такой список полезен для создания гибких страниц архивов, фильтров, или кастомных лэндингов. В этой статье мы разберём, как реализовать такой динамический вывод с нуля, рассмотрим примеры кода и советы по оптимизации.
Что такое таксономии в WordPress и зачем фильтровать по ним
Таксономии — это способ группировки записей по определённым признакам. По умолчанию в WordPress есть категории и теги, но можно создавать собственные (кастомные) таксономии. Фильтрация по ним позволяет показать только релевантные записи на странице, например, все посты из категории "Новости" или все товары с тегом "скидка".
Создание динамического списка позволяет не только показать записи таксономии, но и гибко управлять выводом — сортировкой, пагинацией, дополнительными параметрами.
Использование WP_Query для выборки постов по таксономии
Основной инструмент для выборки постов в WordPress — класс WP_Query. С помощью параметра tax_query можно задать фильтр по таксономиям.
Рассмотрим пример функции wpskills_get_posts_by_taxonomy(), которая возвращает список постов по заданной таксономии и термину:
function wpskills_get_posts_by_taxonomy($taxonomy, $term_slug, $post_type = 'post', $posts_per_page = 10, $paged = 1) {
$args = [
'post_type' => $post_type,
'posts_per_page' => $posts_per_page,
'paged' => $paged,
'tax_query' => [
[
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $term_slug,
],
],
];
$query = new WP_Query($args);
return $query;
}Здесь мы задаём тип поста, количество выводимых записей, страницу пагинации и фильтр по таксономии. Вызывать функцию можно так:
$query = wpskills_get_posts_by_taxonomy('category', 'novosti');
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
the_excerpt();
}
wp_reset_postdata();
} else {
echo '<p>Записи не найдены.</p>';
}Добавление пагинации для длинных списков постов
Если записей много, важно добавить пагинацию. Для этого используйте параметры paged в WP_Query и функции WordPress для вывода постраничной навигации.
Пример реализации пагинации:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = wpskills_get_posts_by_taxonomy('product_cat', 'sale', 'product', 12, $paged);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// вывод шаблона поста
}
echo '<div class="wpskills-pagination">';
echo paginate_links([
'total' => $query->max_num_pages,
'current' => $paged,
'format' => '?paged=%#%',
]);
echo '</div>';
wp_reset_postdata();
} else {
echo '<p>Нет записей для отображения.</p>';
}Примеры полезных плагинов для работы с таксономиями и фильтрами
Для расширения функционала можно использовать плагины из каталога WordPress. Например:
- FacetWP — мощный плагин для создания фильтров по таксономиям, метаданным и другим параметрам. Подходит для магазинов и каталогов.
- WPGridBuilder — удобный инструмент для визуального создания фильтров и сеток постов с поддержкой кастомных таксономий.
- Search & Filter Pro — расширенный поиск и фильтрация по категориям, тегам, кастомным полям.
Если нужен более лёгкий вариант, можно использовать плагин Clearfy Pro, который содержит различные оптимизации и инструменты для работы с таксономиями и SEO.
Оптимизация запросов и кеширование для динамических списков
При работе с динамическими списками важно следить за производительностью. Запросы с WP_Query могут быть ресурсоёмкими, особенно если на сайте много записей и сложные фильтры.
Рекомендации по оптимизации:
- Используйте параметры
fieldsдля выборки только нужных данных, если не нужен весь объект поста. - Добавляйте кеширование результатов запроса через Transients API или внешние кеш-системы (Redis, Memcached).
- Минимизируйте количество запросов на страницу, объединяйте логику.
Пример кеширования результата функции wpskills_get_posts_by_taxonomy() с Transients:
function wpskills_get_posts_by_taxonomy_cached($taxonomy, $term_slug, $post_type = 'post', $posts_per_page = 10, $paged = 1) {
$transient_key = 'wpskills_posts_' . md5($taxonomy . $term_slug . $post_type . $posts_per_page . $paged);
$cached = get_transient($transient_key);
if ($cached !== false) {
return $cached;
}
$query = wpskills_get_posts_by_taxonomy($taxonomy, $term_slug, $post_type, $posts_per_page, $paged);
set_transient($transient_key, $query, HOUR_IN_SECONDS);
return $query;
}Создание шорткода для вставки динамического списка в контент
Часто нужно вставить такой список в пост или страницу. Для этого удобно создать шорткод:
function wpskills_shortcode_posts_by_taxonomy($atts) {
$atts = shortcode_atts([
'taxonomy' => 'category',
'term' => '',
'post_type' => 'post',
'posts_per_page' => 5,
], $atts, 'wpskills_posts');
if (empty($atts['term'])) {
return '<p>Не указан термин таксономии.</p>';
}
$query = wpskills_get_posts_by_taxonomy($atts['taxonomy'], $atts['term'], $atts['post_type'], $atts['posts_per_page']);
ob_start();
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Записей не найдено.</p>';
}
return ob_get_clean();
}
add_shortcode('wpskills_posts', 'wpskills_shortcode_posts_by_taxonomy');Теперь можно использовать шорткод [wpskills_posts taxonomy="category" term="novosti" posts_per_page="5"] в любом месте контента.
Итоги и рекомендации
Динамический список постов по таксономии — универсальный инструмент для кастомизации WordPress. Используйте WP_Query с tax_query для гибкого фильтра, добавляйте пагинацию и кеширование для удобства и производительности.
Для расширенного функционала рассмотрите плагины фильтрации, например, FacetWP или Search & Filter Pro.
Экспериментируйте с кодом, адаптируя под задачи сайта, и вы получите мощный инструмент для вывода контента по нужным категориям и тегам.