В некоторых проектах на 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.