Отсутствуют навигационные ссылки в пагинации WP_query
У меня возникла проблема с добавлением пагинации на страницу. Я использую WP_query
и хочу отображать по 4 записи на странице. Базовый запрос работает нормально, но похоже, я что-то упускаю в настройке пагинации.
// Запрос для 4 записей
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$query = new WP_Query();
$query->query('showposts=4'.'&paged='.$paged);
if ( $query->have_posts() ) :
while ( $query->have_posts() ) : $query->the_post(); ?>
<div class="post">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<p class="author">автор: <?php the_author(); ?></p>
</div>
<?php endwhile; ?>
<!-- конец цикла -->
<nav>
<?php previous_posts_link('« Новые записи') ?>
<?php next_posts_link('Старые записи »') ?>
</nav>
<?php wp_reset_postdata();
// Если результатов нет
else : ?>
<p><?php _e( 'Извините, записей не найдено.' ); ?></p>
<?php endif; ?>
Я установил переменную для пагинации в начале следующим образом:
$query->query('showposts=4'.'&paged='.$paged);
И включил навигацию пагинации так:
<nav>
<?php previous_posts_link('« Новые записи') ?>
<?php next_posts_link('Старые записи »') ?>
</nav>
Но я получаю только пустой HTML <nav></nav>
- без ошибок, и я не могу понять, что я упускаю.
Редактирование: Согласно предложению, я обновил код следующим образом:
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
'posts_per_page' => 4,
'paged' => $paged,
);
$query = new WP_Query( $args );
и обновил ссылку кнопки на:
<?php next_posts_link( 'Старые записи »', $query->max_num_pages ); ?>
Я все еще не вижу ссылок пагинации.
Пожалуйста, не используйте showposts
, так как он был заменен на posts_per_page
уже давно.
Лично я бы добавил аргументы в WP_Query
, как показано ниже, дополнительно пагинация должна работать следующим образом:
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array(
'posts_per_page' => 4,
'paged' => $paged,
);
$the_query = new WP_Query( $args );
global $wp_query;
// Сохраняем стандартный объект запроса во временную переменную
$tmp_query = $wp_query;
// Теперь полностью очищаем его
$wp_query = null;
// Заполняем глобальную переменную нашим пользовательским запросом
$wp_query = $the_query;
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
// код цикла
endwhile;
previous_posts_link( '« Новые записи' );
next_posts_link( 'Старые записи »', $the_query->max_num_pages );
wp_reset_postdata();
else :
// код, если записи не найдены
endif;
// Восстанавливаем оригинальный объект запроса
$wp_query = null;
$wp_query = $tmp_query;
Это то же самое, что и в вопросе Как исправить пагинацию для пользовательских циклов?, на который я вам ссылался, от @ChipBennett.
Еще одно замечание: если это шаблон страницы, работающий как статическая главная страница, необходимо использовать переменную запроса page
вместо paged
:
$paged = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1;

Привет. Это обычная страница, а не статическая главная. К сожалению, предоставленный вами код не работает :(

@Francesca Вы прочитали вопрос, на который я ссылался в своем комментарии? Особенно часть, связанную с »Взломом основного объекта запроса«.

Спасибо, это действительно работает. Извините, я не заметил ваше исправление.

Не за что. Ничего страшного, кроме того, сначала я не добавил »main query hack«, поэтому сейчас оно и работает. @Francesca

Хорошей практикой является получение значения posts_per_page из WordPress. Это значение можно изменить в админ-панели WordPress.
$page = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
if(!$page)
$page = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1;
$posts_per_page = get_option( 'posts_per_page' );
$query = new WP_Query( array(
'posts_per_page' => $posts_per_page, // Количество записей на странице
'paged' => $page, // Номер текущей страницы
'post_status' => 'publish', // Только опубликованные записи
'orderby' => 'title', // Сортировка по заголовку
'order' => 'ASC', // По возрастанию
) );
while ( $query->have_posts() ) {
$query->the_post();
// Код для вывода записей
}
