Пагинация: Последняя страница отсутствует

Вопрос или проблема

У меня примерно 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 записи.

Если у вас еще остались вопросы или вы столкнулись с другими проблемами, не стесняйтесь обращаться за дополнительной поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...