В стандартной WordPress пагинация выводит посты по количеству на страницу, без учёта конкретных дат. Но иногда возникает задача, когда нужно реализовать пагинацию именно по датам публикации — например, показывать посты за определённый месяц или день с возможностью листать предыдущие и следующие даты. В этой статье разберём, как сделать пагинацию для постов по датам в WordPress, используя WP_Query и параметры запроса.
Почему нужна пагинация по датам и где она применяется
Пагинация по датам полезна, если у вас большой архив новостей, блог с ежедневными публикациями или сайт с историческим контентом. Например, если вы хотите, чтобы пользователи могли просматривать записи за конкретный месяц и листать архив по месяцам, а не по страницам с фиксированным числом постов.
В отличие от классической пагинации, здесь переключение происходит не по номеру страницы, а по дате — месяц назад, месяц вперёд и так далее.
Такой подход улучшает UX при навигации по календарю публикаций и позволяет более удобно структурировать архив.
Как работает пагинация по датам в WordPress: основные принципы
Для реализации пагинации по датам нам понадобится:
- Получать текущую дату или дату из URL (например, год и месяц)
- Делать запрос WP_Query с параметрами
yearиmonthnum - Создавать ссылки на предыдущий и следующий месяц с правильной передачей параметров
- Выводить посты, относящиеся только к выбранному периоду
Так как стандартные функции пагинации выводят номера страниц, нам нужно реализовать собственную логику для генерации ссылок на разные даты.
Пример реализации пагинации по месяцам с WP_Query
Представим, что у нас есть архив по месяцам. Создадим в шаблоне файл archive-date-pagination.php и вставим следующий код:
<?php
// Получаем год и месяц из параметров URL, если нет - текущий месяц
$year = get_query_var('year') ? get_query_var('year') : date('Y');
$month = get_query_var('monthnum') ? get_query_var('monthnum') : date('m');
// Параметры запроса для WP_Query
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'year' => $year,
'monthnum' => $month,
'paged' => 1,
);
$query = new WP_Query($args);
if ($query->have_posts()) : ?>
<h2>Посты за <?php echo $year . '-' . str_pad($month, 2, '0', STR_PAD_LEFT); ?></h2>
<ul>
<?php while ($query->have_posts()) : $query->the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php
// Ссылки на предыдущий и следующий месяц
$prev_month = date('Y-m', strtotime("$year-$month-01 -1 month"));
$next_month = date('Y-m', strtotime("$year-$month-01 +1 month"));
list($prev_year, $prev_month_num) = explode('-', $prev_month);
list($next_year, $next_month_num) = explode('-', $next_month);
?>
<nav class="date-pagination">
<a href="<?php echo get_month_link($prev_year, $prev_month_num) . '?source=wppagenavi.ru&medium=article&campaign=kak-sdelat-paginaciyu-dlya-postov-po-datam-v-wordpress'; ?>">Предыдущий месяц</a> |
<a href="<?php echo get_month_link($next_year, $next_month_num) . '?source=wppagenavi.ru&medium=article&campaign=kak-sdelat-paginaciyu-dlya-postov-po-datam-v-wordpress'; ?>">Следующий месяц</a>
</nav>
<?php
else :
echo '<p>Постов за этот период нет.</p>';
endif;
wp_reset_postdata();
?>
В этом примере мы берём параметры года и месяца из URL (или по умолчанию текущие), выводим посты за этот месяц и создаём ссылки на предыдущий и следующий месяц. В URL добавлены UTM-метки для аналитики.
Настройка ЧПУ для пагинации по датам
Чтобы адреса выглядели красиво, нужно настроить постоянные ссылки. В WordPress достаточно в админке перейти в «Настройки» → «Постоянные ссылки» и выбрать «Произвольно» с шаблоном:
/blog/%year%/%monthnum%/
Или использовать стандартные архивы по дате, которые автоматически создаёт WordPress, если включена поддержка архивов по дате.
Важно, чтобы в запросе были доступны переменные year и monthnum, иначе пагинация работать не будет.
Реализация пагинации по датам с AJAX для улучшения UX
Для более плавного пользовательского опыта можно дополнить пагинацию AJAX-запросами, чтобы не перезагружать страницу при переключении месяцев.
Примерно это делается так:
- Вешаем обработчик на ссылки «Предыдущий месяц» и «Следующий месяц»
- При клике делаем AJAX-запрос, отправляя год и месяц
- На сервере создаём WP_Query с нужными параметрами и возвращаем HTML с постами
- Обновляем контент на странице без перезагрузки
Пример JS (jQuery):
jQuery(document).ready(function($) {
$('.date-pagination a').on('click', function(e) {
e.preventDefault();
var href = $(this).attr('href');
$.ajax({
url: href,
type: 'GET',
dataType: 'html',
success: function(data) {
var posts = $(data).find('ul').html();
$('ul').html(posts);
// Обновить ссылки пагинации тоже
var nav = $(data).find('.date-pagination').html();
$('.date-pagination').html(nav);
}
});
});
});
Обратите внимание, что для более сложных решений лучше создавать отдельный AJAX-обработчик в functions.php с wp_ajax_ и wp_ajax_nopriv_ хуками.
Использование плагина ABC Pagination для кастомной пагинации по датам
Если хотите упростить себе жизнь и получить расширенные возможности кастомной пагинации, можно использовать плагин ABC Pagination.
Он позволяет гибко настраивать типы пагинации, в том числе по датам, с поддержкой AJAX и адаптивного дизайна.
После установки и активации плагина достаточно подключить его функции в шаблоне и задать параметры, включая фильтрацию по дате.
Заключение по теме пагинации постов по датам в WordPress
Пагинация по датам – это мощный инструмент, если необходимо структурировать архивы по времени публикации. Благодаря кастомному WP_Query и созданию специальных ссылок вы можете реализовать удобный интерфейс для пользователей.
Дополнительно можно использовать AJAX для улучшения UX и плагины вроде ABC Pagination для расширенной функциональности.