В этой статье мы разберем, как создать автоматический раздел на сайте WordPress, который будет выводить посты по определенным условиям — например, по дате публикации и категории. Такая функциональность полезна для формирования архивов, тематических подборок и разделов блога без постоянного ручного обновления.
Почему автоматизация разделов постов важна для WordPress
Автоматические разделы позволяют:
- Экономить время на обновлении контента;
- Автоматически сортировать публикации по нужным критериям;
- Улучшить пользовательский опыт за счет актуального и релевантного контента;
- Создавать динамические страницы без плагинов.
Далее рассмотрим, как реализовать такой раздел с помощью кода, без дополнительных плагинов, что повысит скорость загрузки и гибкость.
Создание кастомного шаблона для раздела с постами по дате и категории
Самый удобный способ — создать кастомный шаблон страницы, который будет выводить посты динамически.
- В теме вашего сайта создайте файл
page-archive-by-date-category.php. - В начале файла добавьте шаблон страницы:
<?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 или аналогичные), чтобы снизить нагрузку.
- Тестируйте на мобильных устройствах, чтобы форма фильтрации и список постов корректно отображались.