Предположим, в файле 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(); ?>
Оставить комментарий