Как создать динамический список постов по таксономии в WordPress

В 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.

Экспериментируйте с кодом, адаптируя под задачи сайта, и вы получите мощный инструмент для вывода контента по нужным категориям и тегам.

Оптимизация производительности WP_Query с meta_query в WordPress
18.03.2026
Как добавить собственные типы записей (Custom Post Types) в WordPress: практическое руководство
20.02.2026
Как отключить автоматическое сохранение черновиков в WordPress
25.03.2026
Как отключить комментарии на отдельных страницах WordPress
31.03.2026
Как настроить отслеживание событий в WordPress без плагинов
13.01.2026