Пагинация не работает при использовании свойства offset в WP_Query().

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

У меня есть страница архива, которая подтягивает посты с помощью WP_Query(). На главной странице сайта показываются 16 постов пользовательского типа, поэтому на странице архива я смещаю страницу архива на 16 постов.

Код для этого:

$newsArticles = new WP_Query(array(
    'posts_per_page' => 16,
    'offset' => 16,
    'post_type'=> 'news'
));

while(  $newsArticles->have_posts()){
        $newsArticles->the_post(); ?>

        // HTML

<?php } ?>

Однако на этой странице архива функция <?php echo paginate_links();?> для отображения номеров страниц не работает. Когда я нажимаю на номера страниц или использую стрелки “вперед” и “назад”, показываются одни и те же посты на каждой странице.

Код для пагинации, который я использую:

<p>
    <?php echo paginate_links(array(
        'prev_text' => 'NEWER',
        'next_text' => 'OLDER',
    ));?>
</p>

Кто-нибудь знает, как заставить пагинацию работать с параметром offset в WP_Query(), чтобы пагинация архива велась как обычная страница архива (с пагинацией)?

Документация WP_Query предупреждает о параметре offset: Установка параметра offset заменяет/игнорирует параметр paged и ломает пагинацию.

Попробуйте что-то вроде этого:

 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $newsArticles = new WP_Query(array(
        'posts_per_page' => 16,
        'post_type'=> 'news',
        'paged' => $paged,
    ));
while(  $newsArticles->have_posts()){
        $newsArticles->the_post(); ?>

        // HTML

<?php } ?>


$big = 999999999; // нужно невероятное целое число
echo paginate_links( array(
    'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format' => '?paged=%#%',
    'current' => max( 1, get_query_var('paged') ),
    'total' => $newsArticles->max_num_pages
) );

Смотрите больше примеров paginate_links здесь:

Я бы использовал что-то вроде этого:

$prev_link = get_previous_posts_link( '&#x000AB; ' . __( 'Previous Page' ) );
$next_link = get_next_posts_link( __( 'Next Page' ) . ' &#x000BB;' );

if ( $prev_link || $next_link ) {

$pagination  = $prev_link ? sprintf( '<div class="pagination-previous alignleft">%s</div>', $prev_link ) : '';
$pagination .= $next_link ? sprintf( '<div class="pagination-next alignright">%s</div>', $next_link ) : '';

echo $pagination:

}

Или

Можно использовать the_posts_pagination()

.

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

Когда вы сталкиваетесь с проблемой пагинации, не работающей с параметром offset в WP_Query(), важно понимать, что этот параметр может конфликтовать с параметром paged, создавая проблемы с отображением страниц. Документация WordPress предупреждает, что использование offset приводит к игнорированию параметра paged, что и является причиной неправильной работы пагинации в вашем случае. Однако есть альтернативные подходы, которые могут помочь обойти эту проблему.

Подробное руководство по решению проблемы с пагинацией

  1. Понимание параметров offset и paged:
    Параметр offset используется для пропуска определенного количества записей в выборке. Например, если вы хотите исключить первые 16 записей, вы добавляете 'offset' => 16 в свой массив аргументов запроса. Однако это вызывает проблемы с paged, который отвечает за определение страницы, на которой находится пользователь.

  2. Использование параметра paged:
    Вместо использования offset, лучше всего использовать параметр paged, который рассчитан специально для работы с пагинацией. Настоящий рабочий пример кода будет выглядеть следующим образом:

    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $offset = ($paged - 1) * 16 + 16;
    $newsArticles = new WP_Query(array(
        'posts_per_page' => 16,
        'post_type' => 'news',
        'offset' => $offset
    ));
    
    while($newsArticles->have_posts()) {
        $newsArticles->the_post(); 
        // Ваша HTML-разметка
    }
    
    echo paginate_links(array(
        'base' => str_replace(999999999, '%#%', esc_url(get_pagenum_link(999999999))),
        'format' => '?paged=%#%',
        'current' => max(1, get_query_var('paged')),
        'total' => $newsArticles->max_num_pages,
        'prev_text' => 'NEWER',
        'next_text' => 'OLDER',
    ));
  3. Как работает этот подход:

    • Мы используем get_query_var('paged') для определения текущей страницы.
    • Вычисляем offset на базе текущей страницы paged, добавляя 16, чтобы исключить первые посты.
    • Это позволяет вам управлять записью при каждой странице, корректируя визивом для отображения правильного набора постов.
  4. Оптимизация SEO и улучшение видимости:

    • Убедитесь, что каждая страница имеет уникальные мета-теги и описание для улучшения индексации в поисковых системах.
    • Добавьте семантические теги HTML5 и организуйте ссылки так, чтобы минимизировать внутренние циклы и повысить рейтинг страниц.

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

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

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