Архивы в WordPress — это мощный инструмент для организации контента, но стандартные страницы архивов далеко не всегда удовлетворяют специфическим требованиям. Сегодня мы разберём, как создать уникальный тематический архив в вашей теме WordPress, добавив продвинутую фильтрацию, сортировку и кастомную пагинацию. Такой подход позволит пользователям легче находить нужный контент и значительно улучшит UX вашего сайта.
Почему стоит создавать кастомный архив в теме WordPress
Стандартные архивы WordPress выводят записи по дате, таксономии или автору, но зачастую этого недостаточно. Например, если вы ведёте блог о шаблонах и хотите дать возможность пользователям фильтровать темы по категориям, тегам, рейтингу или другим метаданным, то стандартного функционала не хватит.
Создание кастомного архивного шаблона позволит:
- Добавить удобную фильтрацию по произвольным полям и таксономиям.
- Реализовать сортировку по популярности, дате или рейтингу.
- Использовать кастомную пагинацию для лучшего отображения большого объёма материалов.
Это положительно скажется на вовлечённости пользователей и улучшит SEO страницы архива.
Создание кастомного шаблона архива в теме
Для начала нужно создать файл шаблона архивов в папке темы, например archive-theme.php. В этом файле мы будем выводить наши записи с нужной фильтрацией и пагинацией.
В начале файла подключаем стандартный header:
<?php get_header(); ?>
Далее формируем новый WP_Query с нужными параметрами. Допустим, у нас есть кастомный тип записей wp_theme, который хранит темы WordPress, а также кастомная таксономия theme_category для категорий тем.
Пример: базовый WP_Query с фильтрацией по таксономии и пагинацией
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = [
'post_type' => 'wp_theme',
'posts_per_page' => 10,
'paged' => $paged,
];
// Если передана категория через GET-параметр
if (!empty($_GET['category'])) {
$args['tax_query'] = [
[
'taxonomy' => 'theme_category',
'field' => 'slug',
'terms' => sanitize_text_field($_GET['category']),
],
];
}
$wp_theme_query = new WP_Query($args);
Далее выводим записи в цикле:
if ($wp_theme_query->have_posts()) :
while ($wp_theme_query->have_posts()) : $wp_theme_query->the_post();
?>
<article id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="excerpt"><?php the_excerpt(); ?></div>
</article>
<?php
endwhile;
// Кастомная пагинация
echo wp_themes_custom_pagination($wp_theme_query);
wp_reset_postdata();
else :
echo '<p>Темы не найдены.</p>';
endif;
Реализация кастомной пагинации для архива
Стандартная пагинация WordPress иногда не подходит по дизайну или функционалу. Сделаем простую и понятную пагинацию с номерами страниц и ссылками "Следующая" и "Предыдущая".
function wp_themes_custom_pagination($query) {
$big = 999999999; // уникальное число для замены
$pages = paginate_links([
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '?paged=%#%',
'current' => max(1, get_query_var('paged')),
'total' => $query->max_num_pages,
'type' => 'array',
'prev_text' => '← Предыдущая',
'next_text' => 'Следующая →',
]);
if (is_array($pages)) {
$pagination = '<nav class="wp-themes-pagination"><ul>';
foreach ($pages as $page) {
$pagination .= "<li>$page</li>";
}
$pagination .= '</ul></nav>';
return $pagination;
}
return '';
}
Добавление фильтров по нескольким параметрам
Чтобы расширить возможности архива, добавим фильтрацию не только по категориям, но и по метаданным, например, по рейтингу темы (метаполе theme_rating).
Для этого расширим запрос следующим образом:
$meta_query = [];
if (!empty($_GET['min_rating'])) {
$min_rating = floatval($_GET['min_rating']);
$meta_query[] = [
'key' => 'theme_rating',
'value' => $min_rating,
'compare' => '>=',
'type' => 'NUMERIC',
];
}
if (!empty($meta_query)) {
$args['meta_query'] = $meta_query;
}
В итоге пользователь может задать в URL параметры, например, ?category=portfolio&min_rating=4.5, и получить отфильтрованный список.
Пример формы фильтрации для архива
Чтобы фильтрацию можно было использовать удобно, добавим форму в шаблон:
<form method="GET" action="<?php echo esc_url(get_post_type_archive_link('wp_theme')); ?>" class="wp-themes-filter-form">
<label>Категория:</label>
<select name="category">
<option value="">Все</option>
<?php
$categories = get_terms(['taxonomy' => 'theme_category', 'hide_empty' => true]);
foreach ($categories as $cat) {
$selected = (isset($_GET['category']) && $_GET['category'] == $cat->slug) ? 'selected' : '';
echo "<option value=\"{$cat->slug}\" $selected>{$cat->name}</option>";
}
?>
</select>
<label>Минимальный рейтинг:</label>
<input type="number" step="0.1" min="0" max="5" name="min_rating" value="<?php echo isset($_GET['min_rating']) ? esc_attr($_GET['min_rating']) : ''; ?>" />
<button type="submit">Фильтровать</button>
</form>
Поддержка сортировки записей
Ещё одна полезная функция — возможность сортировать вывод по дате, рейтингу или алфавиту. Добавим параметр orderby в форму и в запрос.
// Добавляем параметр сортировки
if (!empty($_GET['orderby'])) {
switch ($_GET['orderby']) {
case 'rating':
$args['meta_key'] = 'theme_rating';
$args['orderby'] = 'meta_value_num';
$args['order'] = 'DESC';
break;
case 'title':
$args['orderby'] = 'title';
$args['order'] = 'ASC';
break;
default:
$args['orderby'] = 'date';
$args['order'] = 'DESC';
}
} else {
$args['orderby'] = 'date';
$args['order'] = 'DESC';
}
И добавим в форму селектор сортировки:
<label>Сортировать по:</label>
<select name="orderby">
<option value="date" <?php selected($_GET['orderby'] ?? '', 'date'); ?>>Дате</option>
<option value="rating" <?php selected($_GET['orderby'] ?? '', 'rating'); ?>>Рейтингу</option>
<option value="title" <?php selected($_GET['orderby'] ?? '', 'title'); ?>>Алфавиту</option>
</select>
Оптимизация и кеширование запроса
Если у вас большой сайт с множеством записей, стоит подумать о кешировании результатов. Можно использовать Transients API для кеширования WP_Query результатов на 10-15 минут.
$cache_key = 'wp_themes_archive_' . md5(serialize($args));
$wp_theme_query = get_transient($cache_key);
if (!$wp_theme_query) {
$wp_theme_query = new WP_Query($args);
set_transient($cache_key, $wp_theme_query, 15 * MINUTE_IN_SECONDS);
}
Советы по использованию и расширению
- Добавляйте больше фильтров по пользовательским полям, например, по совместимости с версиями WordPress.
- Используйте AJAX для обновления списка записей без перезагрузки страницы.
- Подключайте популярные плагины кеширования и оптимизации, например, Clearfy Pro, чтобы ускорить загрузку страниц.
- Если используете темы из WPSHOP, убедитесь, что их шаблоны не конфликтуют с вашим кастомным архивом.
Создание уникального тематического архива — отличный способ улучшить взаимодействие с пользователями и выделиться среди конкурентов. Используйте приведённые примеры и адаптируйте их под свои задачи.