Пагинация — важный элемент удобной навигации по спискам записей на сайте WordPress. Особенно актуально это для комплексных запросов, когда вы фильтруете записи по нескольким параметрам, например, таксономиям, метаданным или датам. В этой статье мы разберём, как правильно реализовать пагинацию для таких запросов с помощью класса WP_Query, чтобы обеспечить корректное отображение страниц и избежать типичных ошибок.
Что такое комплексные запросы в WordPress и зачем нужна пагинация
Комплексные запросы — это запросы к базе данных WordPress, которые используют несколько параметров для отбора записей. Например, одновременно фильтруют записи по категории, тегам и метаданным. Такие запросы часто нужны для создания кастомных архивов, каталогов или фильтров продуктов.
Пагинация при этом помогает разбить длинный список результатов на удобные страницы, улучшая юзабилити и снижая нагрузку на сервер.
Однако при сложных запросах пагинация часто ломается, если не учитывать особенности параметров и правильно не передавать номер текущей страницы.
Настройка WP_Query для пагинации: основные моменты
Для начала создадим базовый комплексный запрос с пагинацией. Главное — правильно получить номер текущей страницы и передать его в параметр paged:
function wppagenavi_get_complex_query() {
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = [
'post_type' => 'post',
'posts_per_page' => 5,
'paged' => $paged,
'tax_query' => [
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'news',
],
],
'meta_query' => [
[
'key' => 'featured',
'value' => '1',
'compare' => '=',
],
],
];
return new WP_Query($args);
}
Здесь мы фильтруем записи по категории «news» и мета-полю «featured» со значением «1», при этом показываем по 5 записей на страницу.
Вывод пагинации и навигация по страницам
Чтобы вывести ссылки пагинации, используйте функцию paginate_links(), которая гибко настраивается под любые параметры:
function wppagenavi_display_pagination($query) {
$big = 999999999; // уникальное число для замены
$pagination = 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,
'prev_text' => '« Назад',
'next_text' => 'Вперёд »',
'type' => 'list',
]);
if ($pagination) {
echo '<nav class="wppagenavi-pagination">' . $pagination . '</nav>';
}
}
Вызовите эту функцию после вывода постов, передавая в неё объект WP_Query.
Полный пример шаблона с комплексным запросом и пагинацией
Вот пример полного кода для использования в шаблоне страницы или кастомного шаблона:
<?php
$query = wppagenavi_get_complex_query();
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post(); ?>
<article id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="entry-content"><?php the_excerpt(); ?></div>
</article>
<?php endwhile;
wppagenavi_display_pagination($query);
wp_reset_postdata();
else :
echo '<p>Записей не найдено.</p>';
endif;
?>
Советы по оптимизации и устранению ошибок пагинации
1. Убедитесь, что параметр paged правильно получен из запроса. Иногда в зависимости от типа страницы нужно использовать get_query_var('page') вместо paged.
2. Не используйте одновременно paged и page без понимания контекста. Для кастомных страниц пагинация может конфликтовать.
3. Всегда вызывайте wp_reset_postdata() после цикла с вашим запросом. Это предотвратит сбои в глобальном объекте $post.
4. Для AJAX пагинации используйте nonce и корректно обновляйте параметр paged. Это поможет избежать кеширования и ошибок перехода.
5. При использовании сложных фильтров убедитесь, что параметры URL не конфликтуют с пагинацией. Для этого можно использовать функцию add_query_arg() для корректной генерации ссылок.
Дополнительные плагины для улучшения пагинации
Если хотите расширить функциональность пагинации в WordPress, обратите внимание на следующие плагины:
- WP-PageNavi — классический плагин для кастомной пагинации с множеством настроек.
- Clearfy Pro — плагин для оптимизации WordPress, включая улучшение пагинации и SEO.
Интеграция этих плагинов с вашим комплексным запросом позволит сделать пагинацию более удобной и функциональной.