eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

Пагинация для произвольного запроса WP_Query

В примере ниже будем выводить продукты WooCommerce (post_type=product) на отдельной странице записи (post_type=post). Т.е. будем использовать произвольный запрос и сделаем для него пагинацию.

$page = max( 1, get_query_var('page') );

$query = new WP_Query( [
	'post_type'      => 'product',
	'posts_per_page' => 5,
	'paged'          => $page,
] );

if ( $query->have_posts() ) {
	while ( $query->have_posts() ) {
		$query->the_post();

		// тут ваш код
		the_title();
	}

	wp_reset_postdata();

	// Выводим пагинацию, если продуктов больше запрошенного количество
	echo paginate_links( [
		'base'    => user_trailingslashit( wp_normalize_path( get_permalink() .'/%#%/' ) ),
		'current' => $page,
		'total'   => $query->max_num_pages,
	] );
}

Мы указали выводить по 5 товаров, если их, к примеру 22, то будет выведено 5 элементов пагинации, из которых 4 будут ссылками следующего вида:

Текущая страница, ссылка не выводится (5 продуктов)
http://example.com/название-записи/2/ (5 продуктов)
http://example.com/название-записи/3/ (5 продуктов)
http://example.com/название-записи/4/ (5 продуктов)
http://example.com/название-записи/5/ (2 продукта)

Обратите внимание:

  • В параметре base где формируется вид ссылки пагинации не используются такие слова как page или paged. Потому что c page будет перенаправление со страницы пагинации на саму запись, а с paged будет 404 ошибка на странице пагинации.

  • Для получения номера страницы пагинации вместо привычного get_query_var( 'paged' ) используем get_query_var( 'page' ).

  • Этот код не будет работать на страницах у которых контент делиться на несколько страниц тегом <!--nextpage-->, подробнее см. здесь.

Заметка встроена в: paginate_links()
3 комментария