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

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

Почему автоматизация разделов постов важна для WordPress

Автоматические разделы позволяют:

  • Экономить время на обновлении контента;
  • Автоматически сортировать публикации по нужным критериям;
  • Улучшить пользовательский опыт за счет актуального и релевантного контента;
  • Создавать динамические страницы без плагинов.

Далее рассмотрим, как реализовать такой раздел с помощью кода, без дополнительных плагинов, что повысит скорость загрузки и гибкость.

Создание кастомного шаблона для раздела с постами по дате и категории

Самый удобный способ — создать кастомный шаблон страницы, который будет выводить посты динамически.

  1. В теме вашего сайта создайте файл page-archive-by-date-category.php.
  2. В начале файла добавьте шаблон страницы:
<?php
/*
Template Name: Archive by Date and Category
*/
?>

Это позволит выбрать этот шаблон при создании страницы в админке.

Код для выборки постов по дате и категории

Основной запрос будет использовать WP_Query с параметрами для фильтрации.

<?php
get_header();

// Получаем параметры из URL или задаем по умолчанию
$category_slug = isset($_GET['cat']) ? sanitize_text_field($_GET['cat']) : 'news';
$year = isset($_GET['year']) ? intval($_GET['year']) : date('Y');
$month = isset($_GET['month']) ? intval($_GET['month']) : date('m');

$args = [
    'post_type' => 'post',
    'category_name' => $category_slug,
    'year' => $year,
    'monthnum' => $month,
    'posts_per_page' => 10,
    'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
];

$query = new WP_Query($args);

if ($query->have_posts()) : ?>
    <h2>Посты категории <?php echo esc_html($category_slug); ?> за <?php echo esc_html($month) . '.' . esc_html($year); ?></h2>
    <ul>
    <?php while ($query->have_posts()) : $query->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> – <?php the_date(); ?></li>
    <?php endwhile; ?>
    </ul>

    <?php
    // Пагинация
    echo paginate_links([
        'total' => $query->max_num_pages
    ]);
    ?>
<?php else : ?>
    <p>Посты не найдены.</p>
<?php endif;
wp_reset_postdata();
get_footer();
?>

Этот код делает выборку постов из категории и за указанный месяц и год. Параметры можно передавать через URL, например: /archive-page?cat=news&year=2023&month=5.

Добавление фильтров для удобства пользователей

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

<form method="GET" action="">
    <label>Категория:</label>
    <select name="cat">
        <?php
        $categories = get_categories();
        foreach ($categories as $category) {
            $selected = ($category->slug === $category_slug) ? 'selected' : '';
            echo "<option value=\"{$category->slug}\" $selected>{$category->name}</option>";
        }
        ?>
    </select>

    <label>Год:</label>
    <input type="number" name="year" value="<?php echo esc_attr($year); ?>" min="2000" max="<?php echo date('Y'); ?>" />

    <label>Месяц:</label>
    <input type="number" name="month" value="<?php echo esc_attr($month); ?>" min="1" max="12" />

    <input type="submit" value="Фильтровать" />
</form>

Эта форма разместится над списком постов и позволит быстро менять параметры фильтра.

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

Если сайт большой, запросы к базе могут нагружать сервер. Чтобы оптимизировать:

  • Используйте Transients API для кеширования результатов запроса.
  • Добавьте индексы для полей в базе (обычно WordPress уже оптимизирован).
  • Используйте пагинацию, чтобы не выводить все записи сразу.

Пример кеширования:

$cache_key = 'wordpresses_archive_' . md5(serialize($args));
$posts_cache = get_transient($cache_key);
if (false === $posts_cache) {
    $query = new WP_Query($args);
    $posts_cache = $query->posts;
    set_transient($cache_key, $posts_cache, HOUR_IN_SECONDS);
} else {
    // Используем кешированные данные
    $query = new WP_Query();
    $query->posts = $posts_cache;
    $query->post_count = count($posts_cache);
}

Примеры плагинов для расширения функционала

Если хочется получить более удобный интерфейс и расширенные возможности, можно использовать плагины:

  • ABC Pagination — улучшенная пагинация для больших архивов.
  • Clearfy Pro — оптимизация и улучшение запросов WordPress.

Однако, если задача проста — типовой код из статьи будет работать отлично без лишних зависимостей.

Дополнительные советы и рекомендации

При создании автоматических разделов учитывайте:

  • Пользовательские роли и права: фильтруйте контент, если нужно скрыть часть постов.
  • SEO: используйте правильные заголовки и метатеги для страниц архивов.
  • Кэширование на уровне сервера (например, через плагин WP Super Cache или аналогичные), чтобы снизить нагрузку.
  • Тестируйте на мобильных устройствах, чтобы форма фильтрации и список постов корректно отображались.
Как создать динамические виджеты на PHP
18.11.2025
Как добавить автоматическое сохранение в визуальном редакторе Gutenberg WordPress
05.03.2026
Как установить ограничения на подробное отображение пользователей в WordPress
29.01.2026
Как удалить или изменить атрибуты img в WordPress без плагинов
20.02.2026
Как создать динамический список постов с фильтром по таксономии в WordPress
13.01.2026