Пагинация списка кастомных постов

Предположим, в файле index.php Вы хотите вывести не все посты, а только посты, принадлежащие определенной категории. Если для этой цели использовать get_posts(), то посты Вы выведите, но пагинация будет работать некорректно: общее число страниц будет рассчитано, исходя из полного количества постов, а не количества постов выбранной категории. Соответственно, в списке страниц появится лишние страницы - если перейти на них, материалов там не будет.

Чтобы пагинация работала, кастомные посты надо выводить с помощью query_posts, а не get_posts, т.е. модифицировать основной запрос.

query_posts( array(
	'category__not_in' => array(3,4,5,6,7,12,13),
	'post_type'       => 'post',
	'post_status'     => 'publish',
	'orderby'         => 'date',
	'order'           => 'DESC',
	'posts_per_page'  => 10,
	'offset'          => 0
) ); 

Но после этого пагинация всё равно работает некорректно - текущая страница в списке страниц пагинации после такого запроса получается всегда первая, независимо от того, на какой странице мы находимся. Чтобы это поправить, надо:

а) в the_posts_pagination добавить параметр 'current':

the_posts_pagination( array(
	'prev_text' => '« Назад',
	'next_text' => 'Вперед »',
	'screen_reader_text' => 'Страницы: ',
	'current'      => $current_page
	) );

Использование 'current' => get_query_var('paged') даст неверный результат - после while-цикла get_query_var('paged') принимет значение 1 (аргумент paged в query_posts по умолчанию). Поэтому надо

б) либо сохранить номер текущей страницы в переменной $current_page ДО цикла while. И затем использовать переменную $current_page в the_posts_pagination, либо добавить аргумент 'paged' в query_posts (значение аргумента нужно будет вычислять в зависимости от того, на какой странице мы находимся $page = (get_query_var('paged')) ? get_query_var('paged') : 1; 'paged' => $page).

Кроме того, для каждой страницы посты нужно выводить с offset, т.е. для каждой страницы запрос разный. Сколько постов нужно отступить от начала вычисляется как произведение количества пролистанных страниц ($page-1) на число постов на каждой странице $offset = ($page-1)*$per_page;.

$page = (get_query_var('paged')) ? get_query_var('paged') : 1;
$per_page = 10;
$offset = ($page-1)*$per_page;
query_posts( array(
	'category__not_in' => array(3,4,5,6,7,12,13),
	'post_type'       => 'post',
	'post_status'     => 'publish',
	'orderby'         => 'date',
	'order'           => 'DESC',
	'posts_per_page'  => $per_page,
	'offset'          => $offset
) ); 
$current_page = $page;

Далее. Параметр posts_per_page желательно задавать в админке. Как получить то, что задано в админке? Используем глобальную переменную $wp_query. Массив $wp_query->query_vars содержит параметры запроса. Массив можно распечатать и посмотреть, что в нем задано: print_r($wp_query->query_vars).

global $wp_query;
$q = $wp_query->query_vars;
$per_page = $q['posts_per_page'];

Всё вместе

<?php 
global $wp_query;
$q = $wp_query->query_vars;
$per_page = $q['posts_per_page'];
$page = (get_query_var('paged')) ? get_query_var('paged') : 1;
$offset = ($page-1)*$per_page;
query_posts( array(
	'category__not_in' => array(3,4,5,6,7,12,13),
	'post_type'       => 'post',
	'post_status'     => 'publish',
	'orderby'         => 'date',
	'order'           => 'DESC',
	'posts_per_page'  => $per_page,
	'offset'          => $offset
) ); 
$current_page = $page; ?>

<?php while ( have_posts() ) : the_post(); ?>
...
<?php endwhile; ?>

<?php the_posts_pagination( array(
	'prev_text' => '« Назад',
	'next_text' => 'Вперед »',
	'screen_reader_text' => 'Страницы: ',
	'current'      => $current_page
) );
wp_reset_query(); ?>

Оставить комментарий

Ваш e-mail не будет опубликован