Вордпресс устроен таким образом, что для любого запроса постов из базы с помощью 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' => $posts_per_page,
	'paged'          => $current,
);		

$my_query = new WP_Query( $args );

if ( $my_query->have_posts() ) {

	$html = '<ul class="posts-list">'; // собираем переменную с контентом
	
	while ( $my_query->have_posts() ) {
		$my_query->the_post();

		$html .= '<li class="posts-list__item">';
			$html .= '<a href="' . esc_url(get_the_permalink()) . '">' . get_the_title() . '</a>';
		$html .= '</li>';
	}

	$html .= '</ul>';

	echo $html; // выводим

	wp_reset_postdata(); // возвращаем глобальный цикл
 
 	// выводим пагинацию
	echo wp_kses_post(
		paginate_links(
			[
				'total'   => $my_query->max_num_pages,
				'current' => $current,
			]
		)
	);
} else {
	// выводим 404, если в запросе нет постов
	global $wp_query;
	$wp_query->set_404();
	status_header( 404 );
	nocache_headers();
	require get_404_template();
}

Сначала собираем переменные для запроса. Здесь у нас два обязательных аргумента: 'posts_per_page' (кол-во постов на странице) и 'paged' (страница пагинации Х), остальные указываются в зависимости от запроса.

Далее мы делаем запрос WP_Query(), собираем полученные данные в переменную и выводим, делаем резет кастомного цикла и выводим пагинацию.

В случае, когда данных нет выводим 404. nocache_headers — сбрасывает кеш для заголовков ответа во всех браузерах. Шаблон 404 подключаем с помощью require get_404_template().

Чтобы узнать, какие данные вам пришли в переменную $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 ошибку при клике на пост, вам нужно сбросить кеш ссылок. Зайдите в раздел Настройки -> Постоянные ссылки и нажмите «Сохранить»

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 5 / 5. Количество оценок: 1

Оценок пока нет. Поставьте оценку первым.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *