Как создать уникальный тематический архив в WordPress с фильтрацией и пагинацией

Архивы в 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, убедитесь, что их шаблоны не конфликтуют с вашим кастомным архивом.

Создание уникального тематического архива — отличный способ улучшить взаимодействие с пользователями и выделиться среди конкурентов. Используйте приведённые примеры и адаптируйте их под свои задачи.

Как добавить динамические стили в тему WordPress
22.12.2025
Как сделать динамический подвал в теме WordPress с примерами кода
13.12.2025
Как настроить отображение разных типов записей в теме WordPress
05.01.2026
Как создать динамические скрипты в теме WordPress
09.01.2026
Как создать уникальный тематический архив в WordPress с фильтрацией и пагинацией
01.01.2026