Вордпресс устроен таким образом, что для любого запроса постов из базы с помощью WP_Query()
вы можете сделать пагинацию, поскольку для этого в запросе уже есть необходимые аргументы 'paged'
и 'posts_per_page'
.
Под пагинацией мы понимаем страничную навигацию. Например, если мы указываем вывод 10 постов на странице, а в ответе WP_Query()
нам возвращается информация о 32 записях, то пагинация покажет нам ссылки на 2, 3 и 4 страницу.
И последнее — если вы находитесь в любом архивном шаблоне, например, archive.php
, category.php
, index.php
и др., то там уже существует основной цикл и делать повторно запрос не нужно, в этой же статье мы разбираем пагинацию для произвольного запроса на примере страниц типа page.
Разберем код на примере:
// получаем номер страницы пагинации
$current = absint( max( 1, get_query_var( 'paged' ) ? get_query_var( 'paged' ) : get_query_var( 'page' ) ) );
// собираем запрос
$args = array(
'post_type' => 'page',
'posts_per_page' => 10,
'paged' => $current,
);
$my_query = new WP_Query( $args );
if ( $my_query->have_posts() ) {
echo '<ul class="posts-list">';
// основной цикл
while ( $my_query->have_posts() ) {
$my_query->the_post();
echo '<li class="posts-list__item">';
echo '<a href="' . esc_url(get_the_permalink()) . '">' . get_the_title() . '</a>';
echo '</li>';
}
echo '</ul>';
wp_reset_postdata(); // возвращаем глобальный цикл
// выводим пагинацию
echo wp_kses_post(
paginate_links(
[
'total' => $my_query->max_num_pages, // количество берем из дефолтной опции запроса
'current' => $current, // текущая страница
]
)
);
} else {
// выводим шаблон "нет контента", если в запросе нет постов
get_template_part( 'templates/content', 'none' );
}
Сначала собираем переменные для запроса. Здесь у нас два обязательных аргумента: 'posts_per_page'
(кол-во постов на странице) и 'paged'
(страница пагинации Х), остальные указываются в зависимости от запроса.
Далее мы делаем запрос WP_Query()
, собираем полученные данные в переменную и выводим, делаем резет кастомного цикла и выводим пагинацию.
В случае, когда данных нет выводим шаблон templates/content-none.php
.
Чтобы узнать, какие данные вам пришли в переменную $my_query
важно уметь печатать переменные.
Проблема с редиректом в пагинации
Если пагинация выводится верно, но при клике на ссылку в пагинации вы получаете редирект на первую страницу нужно отключить перенаправление в записях.
В WordPress редирект всегда включен по умолчанию, но в случае с кастомной пагинацией его нужно отключить.
// отключаем редирект для страниц, потому что при /page/2 редиректит на /
add_filter('redirect_canonical', 'disable_page_redirect');
function disable_page_redirect( $redirect_url ) {
if( is_page() ) {
$redirect_url = false;
return $redirect_url;
}
}
Проблема с 404 в пагинации
Если все выводится правильно, но вы ловите 404 ошибку при клике на пост, вам нужно сбросить кеш ссылок. Зайдите в раздел Настройки -> Постоянные ссылки и нажмите «Сохранить»