Пагинация — важный элемент навигации на сайте, особенно когда речь идет о больших объемах контента. В WordPress для выборки записей часто используется класс WP_Query, но многие сталкиваются с проблемами правильной реализации пагинации при кастомных запросах. В этой статье разберем, как грамотно использовать WP_Query с пагинацией, чтобы избежать типичных ошибок и улучшить пользовательский опыт.
Особенности работы WP_Query с пагинацией
При работе с WP_Query пагинация строится на параметрах paged и posts_per_page. Ключевой момент — корректное получение текущей страницы и передача ее в запрос. Если это не сделать, пагинация либо не будет работать, либо будет вести на повторяющиеся страницы.
Типичная ошибка — забыть установить параметр paged или использовать неправильное значение. Для страниц блога и архивов нужно правильно получать номер текущей страницы из глобального запроса WordPress.
Кроме того, важно не забывать учитывать пермалинки и структуру URL, чтобы ссылки пагинации были корректными и SEO-дружественными.
Получение номера текущей страницы
Для корректной работы пагинации в WP_Query нужно получить номер текущей страницы из глобальных переменных WordPress. Обычно это делается так:
function wpload_get_current_page() {
if (get_query_var('paged')) {
return get_query_var('paged');
} elseif (get_query_var('page')) {
return get_query_var('page');
} else {
return 1;
}
}
Здесь мы учитываем, что номер страницы может находиться в paged или page в зависимости от типа страницы и настроек.
Пример реализации WP_Query с пагинацией
Рассмотрим пример кода, который выводит список постов с пагинацией:
function wpload_custom_pagination_query() {
$paged = wpload_get_current_page();
$args = [
'post_type' => 'post',
'posts_per_page' => 5,
'paged' => $paged,
];
$custom_query = new WP_Query($args);
if ($custom_query->have_posts()) {
echo '<ul>';
while ($custom_query->have_posts()) {
$custom_query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
// Пагинация
$big = 999999999; // уникальное число
echo paginate_links([
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '?paged=%#%',
'current' => max(1, $paged),
'total' => $custom_query->max_num_pages,
'prev_text' => '« Назад',
'next_text' => 'Вперед »',
]);
}
wp_reset_postdata();
}
Здесь мы создаем кастомный запрос с параметром paged, выводим список записей, а затем показываем пагинацию с помощью функции paginate_links. Обратите внимание на использование get_pagenum_link() для генерации правильных URL.
Оптимизация пагинации и советы по улучшению
1. Кэширование запросов. Если на сайте высокая нагрузка, стоит использовать кэширование результатов WP_Query, например, через Transients API или плагины кеширования. Это уменьшит нагрузку на базу данных при частых обращениях к пагинированным спискам.
2. Избегайте использования offset с пагинацией. Параметр offset в WP_Query плохо совместим с пагинацией, так как сбивает подсчет страниц. Если нужно пропустить определенное количество записей — лучше комбинировать с paged и posts_per_page или использовать более сложные решения.
3. SEO и ЧПУ. Следите за тем, чтобы URL пагинации были человекочитаемыми и не создавали дублированный контент. Для этого используйте стандартную структуру ссылок WordPress и функцию paginate_links.
Пример расширения пагинации с ajax-загрузкой
Для улучшения UX можно реализовать подгрузку постов без перезагрузки страницы. Ниже пример упрощенного варианта ajax-загрузки с WP_Query:
// JS (jQuery)
jQuery(document).ready(function($) {
var page = 1;
$('#load-more').on('click', function() {
page++;
$.ajax({
url: wpload_ajax.url,
type: 'POST',
data: {
action: 'wpload_load_more',
paged: page
},
success: function(res) {
if(res) {
$('#posts-list').append(res);
} else {
$('#load-more').hide();
}
}
});
});
});
// PHP
add_action('wp_ajax_wpload_load_more', 'wpload_ajax_load_more_callback');
add_action('wp_ajax_nopriv_wpload_load_more', 'wpload_ajax_load_more_callback');
function wpload_ajax_load_more_callback() {
$paged = isset($_POST['paged']) ? intval($_POST['paged']) : 1;
$args = [
'post_type' => 'post',
'posts_per_page' => 5,
'paged' => $paged,
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
}
wp_reset_postdata();
wp_die();
}
Этот код позволяет подгружать новые записи по кнопке без перезагрузки страницы, улучшая удобство пользователя.
Рекомендации по плагинам для пагинации
Если не хочется писать пагинацию вручную, есть хорошие плагины, которые расширяют возможности:
- WP-PageNavi — классика для удобной и настраиваемой пагинации.
- Ajax Load More — для ajax-подгрузки контента с поддержкой кастомных запросов.
- ABC Pagination — плагин из WPShop с расширенными возможностями кастомизации пагинации и SEO-настройками.
Заключение по теме пагинации с WP_Query
Правильная реализация пагинации с WP_Query требует внимательного подхода к параметрам и понимания работы WordPress с запросами. Использование функции для получения текущей страницы, корректная генерация ссылок и учет SEO-аспектов — залог успеха. При необходимости можно дополнить функционал ajax-подгрузкой или воспользоваться готовыми плагинами, например, ABC Pagination.