Вопрос или проблема
У меня примерно 12 записей, и это означает, что у меня должно быть 4 страницы. Моя лучшая попытка заставить пагинацию работать – это, и я был бы очень признателен, если бы кто-то сказал мне, где именно я ошибаюсь?
<div id="main-content">
<div class="container">
<?php
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'job',
'posts_per_page' => 3,
'paged' => $paged
);
$query = new WP_Query( $args );
while ( $query->have_posts()): $query->the_post();
<h1> <?php the_title(); ?> </h1>
<p> <?php the_excerpt(); ?> </p>
<?php
endwhile; ?>
</div> <!-- .container -->
</div> <!-- #main-content -->
<!-- Начало навигации -->
<?php
global $wp_query;
$total_pages = $wp_query->max_num_pages;
if ($total_pages > 1) {
$current_page = max( 1, get_query_var('paged'));
echo '<div class="page_nav">';
echo paginate_links(array(
'base' => get_pagenum_link(1) . '%_%',
'format' => '/page/%#%',
'current' => $current_page,
'total' => $total_pages,
'prev_text' => 'Пред',
'next_text' => 'След'
));
echo '</div>';
}
?>
<?php wp_reset_postdata(); ?>
ОБНОВЛЕННЫЙ КОД:
Хорошо, это намного упрощено, но это продолжает показывать 5 страниц независимо от того, сколько я устанавливаю счётчик ‘posts_per_page’. С общим количеством 24 записей, я ожидаю только 2 страницы (максимум_num_pages), но я продолжаю получать ‘5’. Вот мой упрощённый, последний код:
//Сгенерируйте цикл здесь
//Подготовьте аргументы для WP_QUERY
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
'posts_per_page' => 12,
'post_type' => 'job',
'paged' => $paged
);
$query = new WP_Query( $args );
if ($query->have_posts()) {
while ( $query->have_posts()) {
$query->the_post();
?> <li><?php the_title(); ?></li> <?php
}
} else {
echo "<h2>Работы не найдены</h2>";
}
// Пагинация начинается здесь
$paginateArgs = array(
'base' => '%_%',
'format' => '?paged=%#%',
'current' => $paged
);
echo paginate_links( $paginateArgs );
wp_reset_postdata();
?>
Возможно, для вашей пагинации вы используете глобальную переменную WP $wp_query
, а в posts_per_page
установлены глобальные настройки WP.
Я думаю, вам нужно использовать вашу переменную $query
для пагинации тоже.
Оказывается, добавление $big = 999999999 и затем изменение ‘base’ в $paginateArgs решило проблему. У меня всё ещё нет понятия, почему это работает; но это так. Я взял код прямо из CODEX.
<?php
//Сгенерируйте цикл здесь
//Подготовьте аргументы для WP_QUERY
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
'posts_per_page' => 10,
'post_type' => 'job',
'paged' => $paged
);
$query = new WP_Query( $args );
if ($query->have_posts()) {
while ( $query->have_posts()) {
$query->the_post();
?> <li><?php the_title(); ?></li> <?php
}
} else {
echo "<h2>Работы не найдены</h2>";
}
// Пагинация начинается здесь
$big = 999999999; // нужно маловероятное целое число
$paginateArgs = array(
'base' => str_replace( $big, '%#%', esc_url (get_pagenum_link( $big )) ),
'format' => '/page/%#%',
'current' => $paged,
'total' => $query->max_num_pages
);
echo paginate_links( $paginateArgs );
wp_reset_postdata();
?>
Ответ или решение
Проблема: Отсутствие последней страницы пагинации в WordPress
Когда вы столкнулись с проблемой отображения пагинации на вашем сайте WordPress, это может быть связано с несколькими нюансами работы с объектом WP_Query
. Давайте подробно рассмотрим решение вашей задачи.
Описание проблемы
Изначально у вас было 12 записей, и вы ожидали, что они будут разделены на 4 страницы, при условии что количество записей на странице составляет 3. Однако, в некоторых случаях, число страниц может не отображаться корректно, что приводит к отсутствию вывода последней страницы пагинации.
Шаг 1: Изменение логики расчетов
Вероятнее всего, основная причина вашей проблемы заключалась в использовании глобального объекта $wp_query
, который может не отражать фактические параметры вашего запроса. Вместо этого, вы должны использовать объект $query
, который вы создали, чтобы получить точные количество страниц на основе ваших параметров.
Пример исправленного кода
// Подготовка аргументов для WP_Query
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'job',
'posts_per_page' => 3,
'paged' => $paged
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
echo '<h1>' . get_the_title() . '</h1>';
echo '<p>' . get_the_excerpt() . '</p>';
}
} else {
echo "<h2>Записи не найдены</h2>";
}
Шаг 2: Пагинация
Теперь мы перейдем к правильному настроению пагинации. Важно указать на правильное количество страниц, так как именно оно будет влиять на отображение навигации.
Корректировка аргументов пагинации
$big = 999999999; // Уникальное число для замены
$paginateArgs = array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '/page/%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $query->max_num_pages,
);
echo paginate_links( $paginateArgs );
wp_reset_postdata();
Обратите внимание:
max( 1, get_query_var('paged') )
позволяет безопасно получать текущую страницу.str_replace
используется для подстановки нашего уникального числа в базовый URL пагинации, что позволяет динамически формировать ссылки для всех страниц.
Заключение
Теперь, когда вы правильно используете объект $query
и правильно настраиваете аргументы пагинации, ваш сайт должен корректно отображать все страницы. Если у вас есть 12 записей и вы устанавливаете posts_per_page
в 3, вы должны видеть 4 страницы, каждая из которых будет содержать по 3 записи.
Если у вас еще остались вопросы или вы столкнулись с другими проблемами, не стесняйтесь обращаться за дополнительной поддержкой.