Пагинация пользовательских типов записей не изменяет записи

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

У меня есть пользовательский тип записи, jobs, который отображается на внешней странице с помощью WP_Query() – сам запрос работает отлично.

Однако, когда я пытаюсь разбить результаты на страницы, ссылки “предыдущий/следующий” появляются, но когда я на них нажимаю, контент не изменяется – т.е. номер страницы в URL меняется и страница перезагружается, но записи не переключаются.

Я пробовал использовать стандартные функции WordPress next_posts_link и previous_posts_link, а также плагин wp_pagenavi. В коде ниже я использую wp_pagenavi.

Вот мой код:

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $params = 
        array(  'post_type'          => 'job', 
            'post_status'        => 'publish',
            'posts_per_page'     => 3,
             'paged'=>$paged
        );

        $temp = $wp_query;
        $wp_query= null;
        $wp_query = new WP_Query();

        $wp_query->query($params); ?>

  <?php if (function_exists('wp_pagenavi')){ wp_pagenavi(); } ?>

  <?php if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>

// делаем что-то с записью

 <?php endwhile; endif ?>
 <?php $wp_query = null; $wp_query = $temp; wp_reset_query() ?>

Любая помощь будет очень полезна – это сводит меня с ума! ^_^

Проблема может быть в том, как вы используете глобальную переменную. Ваш код манипулирует глобальной переменной $wp_query, что может вызвать непредвиденное поведение. Вместо того, чтобы перезаписывать $wp_query, рассмотрите возможность использования пользовательской переменной запроса.
-ИЛИ-
Реализуйте пользовательский запрос для постраничной навигации:

<?php 
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$params = array(
    'post_type' => 'job', 
    'post_status' => 'publish',
    'posts_per_page' => 3,
    'paged' => $paged
);

$job_query = new WP_Query($params);

if ($job_query->have_posts()) : 
    while ($job_query->have_posts()) : $job_query->the_post();
        // Отобразите ваши записи здесь
    endwhile;

    // Постраничная навигация
    if (function_exists('wp_pagenavi')) {
        wp_pagenavi(array('query' => $job_query));
    }

    wp_reset_postdata(); // Сброс данных записи после пользовательского запроса
else : 
    echo 'Работа не найдена';
endif;
?>

Проблема с пользовательским запросом заключается в том, что количество записей на странице сбрасывается перед загрузкой страницы. Если у вас 10 записей, то у вас только одна страница, потому что значение по умолчанию для posts_per_page – 10. Если у вас 11 записей, то вы увидите вторую страницу, но не больше.

Решение этой проблемы – изменить настройки posts_per_page в админке: Настройки > Чтение > Страницы блога показывать не более > 3. Но это изменит настройки всех архивных страниц. Быстрым решением этой проблемы является добавление

<?php global $query_string; query_posts($query_string . '&posts_per_page=10'); ?>

в верхней части ваших архивных шаблонов, где вы хотите, чтобы количество записей на странице было по умолчанию.

Попробуйте использовать <?php wp_pagenavi(); ?> вместо <?php if (function_exists('wp_pagenavi')){ wp_pagenavi(); } ?> и если это не сработает, попробуйте добавить этот фрагмент кода

/**
 * Пользовательская постраничная навигация
 */
function custom_pagination($numpages="", $pagerange="", $paged='') {

    if (empty($pagerange)) {
        $pagerange = 5;
    }

    /**
     * Эта первая часть нашей функции - это резервный вариант
     * для пользовательской постраничной навигации внутри обычного цикла, который
     * использует глобальные переменные $paged и $wp_query.
     *
     * Это хорошо, потому что теперь мы можем переопределить стандартную постраничную навигацию
     * в нашей теме и использовать эту функцию как в стандартных запросах,
     * так и в пользовательских запросах.
     */
    global $paged;
    if (empty($paged)) {
        $paged = 1;
    }
    if ($numpages == '') {
        global $wp_query;
        $numpages = $wp_query->max_num_pages;
        if(!$numpages) {
            $numpages = 1;
        }
    }

    global $wp_query;
    $big = 999999999; // нужно маловероятное целое число
    $pages = paginate_links( array(
        'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
        'format' => '?paged=%#%',
        'current' => max( 1, get_query_var('paged') ),
        'total' => $numpages,
        'prev_next' => false,
        'type'  => 'array',
        'prev_next'   => TRUE,
        'prev_text'    => __('<i class="fa fa-long-arrow-left"></i>'),
        'next_text'    => __('<i class="fa fa-long-arrow-right"></i>'),
    ) );
    if( is_array( $pages ) ) {
        $paged = ( get_query_var('paged') == 0 ) ? 1 : get_query_var('paged');
        echo '<ul>';
        foreach ( $pages as $page ) {
            echo "<li>$page</li>";
        }
        echo '</ul>';
    }

}

в вашем function.php
и этот код

<?php
  if (function_exists(custom_pagination)) {
    custom_pagination($the_query->max_num_pages,"",$paged);
  }
?>

в шаблонном файле, где вы хотите иметь постраничную навигацию.

Ответ или решение

Проблема с пагинацией пользовательских типов записей в WordPress

Когда вы работаете с пользовательскими типами записей в WordPress, такими как «jobs», и пытаетесь реализовать пагинацию, могут возникнуть проблемы, когда ссылки на старые/новые записи не работают должным образом. Ваша ситуация, когда URL меняется, но содержимое не обновляется, указывает на то, что ваш код может нуждаться в некоторой оптимизации.

1. Изменение глобальной переменной $wp_query

Исходный код, который вы предоставили, манипулирует глобальной переменной $wp_query, что может вызвать неожиданные результаты при пагинации. Вместо того чтобы переписывать $wp_query, лучше использовать отдельный экземпляр класса WP_Query. Это предотвратит конфликт с основной петлей WordPress и обеспечит корректное отображение постов.

Вот ваш модифицированный код:

<?php 
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$params = array(
    'post_type'      => 'job', 
    'post_status'    => 'publish',
    'posts_per_page' => 3,
    'paged'          => $paged
);

$job_query = new WP_Query($params);

if ($job_query->have_posts()) : 
    while ($job_query->have_posts()) : $job_query->the_post();
        // Отображение ваших постов
    endwhile;

    // Пагинация
    if (function_exists('wp_pagenavi')) {
        wp_pagenavi(array('query' => $job_query));
    }

    wp_reset_postdata(); // Сброс данных поста после пользовательского запроса
else : 
    echo 'Записи не найдены';
endif;
?>

2. Настройки по умолчанию для отображения постов

Проблема может быть связана и с тем, как настроены параметры отображения постов. WordPress по умолчанию использует параметры, заданные в админке. Если у вас, например, установлено отображение 10 постов на страницах, но в вашем коде вы указываете 3, конфликты могут приводить к неправильному отображению в пагинации.

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

<?php 
global $query_string; 
query_posts($query_string . '&posts_per_page=3'); 
?>

Однако этот подход не рекомендуется, поскольку он затрагивает глобальный запрос. Использование отдельных экземпляров WP_Query (как показано ранее) считается более безопасным и гибким.

3. Альтернативная функция пагинации

Вы также можете создать свою собственную функцию пагинации. Вот пример реализации:

function custom_pagination($numpages="", $pagerange="", $paged='') {
    if (empty($pagerange)) {
        $pagerange = 5;
    }

    global $paged;
    if (empty($paged)) {
        $paged = 1;
    }
    if ($numpages == '') {
        global $wp_query;
        $numpages = $wp_query->max_num_pages;
        if(!$numpages) {
            $numpages = 1;
        }
    }

    $big = 999999999; // need an unlikely integer
    $pages = paginate_links( array(
        'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
        'format' => '?paged=%#%',
        'current' => max( 1, get_query_var('paged') ),
        'total' => $numpages,
        'prev_next' => true,
        'prev_text' => __('&laquo;'),
        'next_text' => __('&raquo;'),
    ) );

    if (is_array($pages)) {
        echo '<ul class="custom-pagination">';
        foreach ($pages as $page) {
            echo "<li>$page</li>";
        }
        echo '</ul>';
    }
}

Вы можете добавить эту функцию в файл functions.php. Она позволит вам выводить пагинацию таким образом:

<?php
if (function_exists('custom_pagination')) {
    custom_pagination($job_query->max_num_pages, "", $paged);
}
?>

Заключение

При работе с пагинацией для пользовательских типов записей в WordPress важно правильно управлять объектами WP_Query и избегать манипуляций с глобальными переменными, чтобы избежать конфликтов и непредсказуемого поведения. Используя предложенные выше методы, вы сможете реализовать корректную пагинацию на вашем сайте. Убедитесь, что вы проверяете настройки отображения постов и исключения, чтобы избежать дальнейших проблем с пагинацией.

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

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