Почему на странице архива с пагинацией дублируются посты?

Ссылка скопирована
1 ответ

Сайт на wordpress

У меня есть страница архивная для произвольной типы записи (custom type post), на ней вывотся посты.
Если отключить пагинацию и вывести все посты, то все корректно без дублей.

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

Дублируется один и тот же пост (Тумилович Ольга)

Хотя шаблон вывода архива в полне себе обычный:

<div class="col-md-9 col-12  page__content">           <div class="row">         <?php if ( have_posts() ) : ?>             <?php       /* Start the Loop */       while ( have_posts() ) :       the_post(); ?>                  <div class="col-md-3 col-6 doctor-archive ">             <a href="<?php the_permalink(); ?>">                <?php if( has_post_thumbnail() ) {?>               <img src="<?php echo the_post_thumbnail_url(); ?>" />               <?php } else { ?>                <img alt="<?php the_title() ?>" src="/wp-content/uploads/2022/06/screenshot_1-3.jpg" />                <?php } ?>              </a>              <div style="line-height: 1.3em;                   min-height: 71px;"><strong><?php the_field('speczialnost_vracha') ?></strong></div>             <a href="<?php the_permalink(); ?>"><?php the_title() ?></a>            </div>                       <?php endwhile;       endif; ?>             </div>       <?php the_posts_pagination(); ?>             </div>

<div class="col-md-9 col-12 page__content"> <div class="row"> <?php if ( have_posts() ) : ?> <?php /* Start the Loop */ while ( have_posts() ) : the_post(); ?> <div class="col-md-3 col-6 doctor-archive "> <a href="<?php the_permalink(); ?>"> <?php if( has_post_thumbnail() ) {?> <img src="<?php echo the_post_thumbnail_url(); ?>" /> <?php } else { ?> <img alt="<?php the_title() ?>" src="/wp-content/uploads/2022/06/screenshot_1-3.jpg" /> <?php } ?> </a> <div style="line-height: 1.3em; min-height: 71px;"><strong><?php the_field('speczialnost_vracha') ?></strong></div> <a href="<?php the_permalink(); ?>"><?php the_title() ?></a> </div> <?php endwhile; endif; ?> </div> <?php the_posts_pagination(); ?> </div>

Дополнительно:

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь Волков Ответ

Сам шаблон цикла выглядит нормально. Дубли на страницах пагинации обычно появляются не из-за while ( have_posts() ), а из-за нестабильной сортировки или вмешательства в главный запрос: pre_get_posts, плагин сортировки, meta query, offset, одинаковые значения поля сортировки.

Частая причина: сортировка по meta value, где у нескольких записей одинаковое значение. MySQL не обязан держать стабильный порядок, поэтому одна запись может попасть на границу первой и второй страницы. Добавьте вторичную сортировку по ID или дате.

add_action('pre_get_posts', function ($query) {
    if (is_admin() || ! $query->is_main_query() || ! is_post_type_archive('doctor')) {
        return;
    }
 
    $query->set('posts_per_page', 12);
    $query->set('orderby', [
        'menu_order' => 'ASC',
        'ID'         => 'ASC',
    ]);
});

add_action('pre_get_posts', function ($query) { if (is_admin() || ! $query->is_main_query() || ! is_post_type_archive('doctor')) { return; } $query->set('posts_per_page', 12); $query->set('orderby', [ 'menu_order' => 'ASC', 'ID' => 'ASC', ]); });

Если где-то используется offset, уберите его: обычная пагинация WordPress с offset часто дает пропуски и дубли, если дополнительно не пересчитывать found_posts. Также проверьте, не выводится ли часть записей отдельным запросом перед основным циклом без post__not_in.

Для диагностики временно выведите ID в карточке. Если один и тот же ID появляется на разных страницах, смотрите параметры SQL-запроса и все хуки pre_get_posts по проекту.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно