Как вывести список авторских постов в WordPress с фильтрацией по автору и категории

В некоторых проектах на WordPress возникает задача выводить список материалов, принадлежавших конкретному автору, с возможностью фильтрации по категориям и удобной навигацией. В этой статье мы подробно разберём, как реализовать такой функционал при помощи кастомных запросов, а также рассмотрим варианты с использованием плагинов для упрощения задачи.

Почему стандартного архива автора может быть недостаточно

По умолчанию WordPress автоматически создаёт архивы автора, доступные по URL вида https://example.com/author/username/. Однако такой архив имеет ряд ограничений:

  • Отсутствует удобная фильтрация по категориям или меткам.
  • Ограниченные возможности кастомизации дизайна и отображаемой информации.
  • Сложности с добавлением AJAX-пагинации или динамической подгрузки контента.

Для более гибкой реализации лучше создавать собственный шаблон или шорткод с кастомным WP_Query.

Создание кастомного списка постов автора с фильтрацией по категориям

Рассмотрим пример функции, которая выводит список постов конкретного автора с возможностью фильтрации по категориям, а также пагинацией. Для начала создадим шорткод, который можно вставлять на любую страницу.

function wpsolution_render_author_posts_list($atts) {
    $atts = shortcode_atts(array(
        'author_id' => 0,
        'posts_per_page' => 5,
        'category' => 0,
        'paged' => 1
    ), $atts, 'wpsolution_author_posts');

    $paged = max(1, get_query_var('paged'));
    if(isset($_GET['paged'])) {
        $paged = intval($_GET['paged']);
    }

    $args = array(
        'author' => intval($atts['author_id']),
        'posts_per_page' => intval($atts['posts_per_page']),
        'paged' => $paged,
    );

    if(!empty($atts['category'])) {
        $args['cat'] = intval($atts['category']);
    }

    $query = new WP_Query($args);

    $output = '';

    if($query->have_posts()) {
        $output .= '<ul class="wpsolution-author-posts-list">';
        while($query->have_posts()) {
            $query->the_post();
            $output .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
        }
        $output .= '</ul>';

        // Пагинация
        $big = 999999999;
        $pagination = paginate_links(array(
            'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
            'format' => '?paged=%#%',
            'current' => $paged,
            'total' => $query->max_num_pages,
            'prev_text' => '< Назад',
            'next_text' => 'Вперед >'
        ));

        if($pagination) {
            $output .= '<div class="wpsolution-pagination">'.$pagination.'</div>';
        }
    } else {
        $output .= '<p>Посты не найдены.</p>';
    }

    wp_reset_postdata();

    return $output;
}
add_shortcode('wpsolution_author_posts', 'wpsolution_render_author_posts_list');

Теперь на странице можно вставить шорткод, например:

[wpsolution_author_posts author_id="2" posts_per_page="10" category="5"]

Это выведет 10 постов автора с ID 2 из категории с ID 5. Пагинация будет работать автоматически.

Добавление фильтра по категориям через форму

Для удобства пользователей можно добавить выпадающий список категорий с AJAX-подгрузкой постов без перезагрузки.

Пример формы:

<form id="wpsolution-filter-form">
    <select name="cat" id="wpsolution-cat-select">
        <option value="0">Все категории</option>
        <?php
        $categories = get_categories();
        foreach($categories as $category) {
            echo '<option value="'.$category->term_id.'">'.$category->name.'</option>';
        }
        ?>
    </select>
    <input type="hidden" name="author_id" value="2" />
    <button type="submit">Показать</button>
</form>
<div id="wpsolution-posts-container"></div>

Для обработки AJAX-запросов нужно добавить PHP-обработчик и JavaScript, который будет отправлять запросы и обновлять список постов.

Использование плагинов для вывода авторских постов с фильтрацией

Если вы не хотите писать код, можно воспользоваться готовыми решениями. Некоторые плагины, которые помогут:

  • Content Views — мощный визуальный конструктор списков постов с фильтрацией по авторам, категориям, меткам и другим параметрам.
  • WPGridBuilder — плагин для построения сеток с фильтрами и AJAX-подгрузкой.
  • FacetWP — продвинутый плагин для фильтрации и поиска с поддержкой авторов и таксономий.

При использовании плагинов стоит обращать внимание на совместимость с вашей темой и требования к производительности.

Оптимизация запросов и кеширование

Запросы к базе данных могут замедлять сайт, особенно если много посетителей одновременно используют фильтры. Чтобы избежать проблем с нагрузкой, рекомендуем:

  • Использовать объектное кеширование (например, Redis или Memcached) для кеширования результатов WP_Query.
  • Применять transient API WordPress для хранения результатов запросов на определённое время.
  • Минимизировать количество данных, передаваемых через AJAX, возвращая только необходимые части HTML или JSON.

Пример кеширования результатов в нашем шорткоде:

function wpsolution_render_author_posts_list($atts) {
    $atts = shortcode_atts(array(
        'author_id' => 0,
        'posts_per_page' => 5,
        'category' => 0,
        'paged' => 1
    ), $atts, 'wpsolution_author_posts');

    $paged = max(1, get_query_var('paged'));

    $cache_key = 'wpsolution_author_posts_'.intval($atts['author_id']).'_cat_'.intval($atts['category']).'_page_'.$paged;
    $output = get_transient($cache_key);

    if(false === $output) {
        $args = array(
            'author' => intval($atts['author_id']),
            'posts_per_page' => intval($atts['posts_per_page']),
            'paged' => $paged,
        );

        if(!empty($atts['category'])) {
            $args['cat'] = intval($atts['category']);
        }

        $query = new WP_Query($args);

        ob_start();
        if($query->have_posts()) {
            echo '<ul class="wpsolution-author-posts-list">';
            while($query->have_posts()) {
                $query->the_post();
                echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
            }
            echo '</ul>';

            $big = 999999999;
            echo '<div class="wpsolution-pagination">';
            echo paginate_links(array(
                'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
                'format' => '?paged=%#%',
                'current' => $paged,
                'total' => $query->max_num_pages,
                'prev_text' => '< Назад',
                'next_text' => 'Вперед >'
            ));
            echo '</div>';
        } else {
            echo '<p>Посты не найдены.</p>';
        }
        wp_reset_postdata();

        $output = ob_get_clean();
        set_transient($cache_key, $output, HOUR_IN_SECONDS);
    }

    return $output;
}

Заключение

Вывод списка авторских постов с гибкой фильтрацией — частая задача в кастомных проектах на WordPress. Используя WP_Query и шорткоды, можно создать удобный интерфейс с пагинацией и фильтрами. Для упрощения и расширения функционала полезно подключать проверенные плагины, а также не забывать про кеширование для повышения производительности.

Для скачивания плагинов и дополнительных инструментов можно посетить wpshop.ru.

Как отключить XML-RPC в WordPress и защитить сайт от атак
27.01.2026
WooCommerce: как автоматически удалять товары после продажи
15.05.2026
Как сделать автоматическую сборку и оптимизацию CSS в WordPress
22.01.2026
WooCommerce: как автоматически удалять заказы после их архивирования
18.05.2026
Как использовать Metabox для создания дополнительных полей в WordPress
15.12.2025