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

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

Основы пагинации в WP_Query для сложных запросов

Пагинация в WordPress строится на параметре paged, который передается в WP_Query. При формировании запроса важно корректно учитывать текущую страницу, чтобы постраничный вывод работал без ошибок.

При работе с таксономиями фильтрация происходит через параметр tax_query, который позволяет строить вложенные условия для отбора записей по категориям, меткам и кастомным таксономиям.

Основная сложность — одновременно учитывать пагинацию и фильтрацию таксономий, не нарушая логику выборки и корректно отображая навигацию по страницам.

Пример базового WP_Query с пагинацией и таксономией

$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = [
    'post_type' => 'post',
    'posts_per_page' => 10,
    'paged' => $paged,
    'tax_query' => [
        [
            'taxonomy' => 'category',
            'field' => 'slug',
            'terms' => 'novosti',
        ],
    ],
];
$query = new WP_Query($args);

Такой запрос отобразит посты из категории "novosti" с пагинацией по 10 записей на страницу.

Как реализовать пагинацию с несколькими фильтрами таксономий

Если нужно фильтровать посты сразу по нескольким таксономиям (например, категория + тег или кастомные таксономии), то tax_query становится массивом с несколькими условиями и параметром relation ('AND' или 'OR').

Для правильной работы пагинации важно передавать текущие параметры фильтров в URL, чтобы при переходе между страницами выбранные фильтры сохранялись.

Пример построения сложного запроса с фильтрами и пагинацией

$paged = max(1, get_query_var('paged'));
$category = isset($_GET['category']) ? sanitize_text_field($_GET['category']) : '';
$tag = isset($_GET['tag']) ? sanitize_text_field($_GET['tag']) : '';

$tax_query = ['relation' => 'AND'];
if ($category) {
    $tax_query[] = [
        'taxonomy' => 'category',
        'field' => 'slug',
        'terms' => $category,
    ];
}
if ($tag) {
    $tax_query[] = [
        'taxonomy' => 'post_tag',
        'field' => 'slug',
        'terms' => $tag,
    ];
}

$args = [
    'post_type' => 'post',
    'posts_per_page' => 5,
    'paged' => $paged,
    'tax_query' => $tax_query,
];

$query = new WP_Query($args);

Важно: если фильтры не заданы, то tax_query будет состоять только из relation, что может привести к ошибкам — нужно проверять и исключать пустые условия.

Вывод пагинации с сохранением фильтров в URL

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

Пример использования paginate_links с фильтрами

$base = get_pagenum_link(1) . '%_%';
$format = 'page/%#%/';

// Сохраняем фильтры в параметрах
$query_args = [];
if ($category) $query_args['category'] = $category;
if ($tag) $query_args['tag'] = $tag;

$pagination = paginate_links([
    'base' => add_query_arg($query_args, $base),
    'format' => $format,
    'current' => $paged,
    'total' => $query->max_num_pages,
    'type' => 'list',
]);

echo $pagination;

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

Оптимизация и кеширование комплексных запросов с пагинацией

Сложные WP_Query с несколькими таксономиями могут сильно нагружать базу данных, особенно на больших сайтах. Для улучшения производительности рекомендуем использовать кэширование результатов.

Для кеширования можно применить Transients API или плагин Clearfy Pro, который оптимизирует запросы и кеширует данные.

Пример кеширования WP_Query с Transients API

$cache_key = 'wppagenavi_paged_' . $paged . '_' . md5(serialize($tax_query));
$query = get_transient($cache_key);
if (false === $query) {
    $query = new WP_Query($args);
    set_transient($cache_key, $query, HOUR_IN_SECONDS);
}

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

Использование плагина WP-PageNavi для кастомной пагинации с фильтрами

Плагин WP-PageNavi позволяет создавать удобную и стильную пагинацию. Он хорошо интегрируется с WP_Query и поддерживает кастомные параметры.

Для сохранения фильтров при навигации с WP-PageNavi нужно вручную добавлять параметры в ссылки, используя фильтр wp_pagenavi_extra_query_args.

Пример добавления фильтров в WP-PageNavi

add_filter('wp_pagenavi_extra_query_args', 'wppagenavi_add_filter_params');
function wppagenavi_add_filter_params() {
    $args = [];
    if (!empty($_GET['category'])) {
        $args['category'] = sanitize_text_field($_GET['category']);
    }
    if (!empty($_GET['tag'])) {
        $args['tag'] = sanitize_text_field($_GET['tag']);
    }
    return $args;
}

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

Выводы и рекомендации по реализации пагинации для комплексных запросов с таксономиями

  • Всегда учитывайте параметр paged при формировании WP_Query.
  • Правильно строите массив tax_query с учетом всех фильтров.
  • Передавайте параметры фильтров в URL и ссылки пагинации, чтобы они сохранялись при переходах между страницами.
  • Используйте кеширование сложных запросов для оптимизации производительности.
  • Для удобного вывода пагинации можно использовать WP-PageNavi с добавлением параметров через фильтр.

Эти рекомендации помогут избежать типичных ошибок с пагинацией и фильтрами, а также улучшат пользовательский опыт и SEO вашего сайта.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как сделать пагинацию для комплексных запросов с несколькими таксономиями в WordPress
03.04.2026
Как использовать пагинацию для отображения большого количества комментариев в WordPress
09.05.2026
Как добавить пагинацию в WordPress для комплексных запросов с таксономиями и meta-данными
11.04.2026
Пагинация WooCommerce не работает: причины и решение
02.05.2026
Как исправить неработающую пагинацию в WooCommerce при кастомных WP_Query
31.05.2026
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙