Запрос получения одного и того же поста дважды

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

После того как я искал помощь и потерпел неудачу, мне удалось написать запрос для WordPress, который делает именно то, что должен, однако он вытаскивает пост, который должен быть, дважды. Я долго рассматривал разметку и не вижу, почему это происходит. Вот запрос:

<?php 
$the_query = new WP_Query( array(
    'post_type' => 'product',
    'tax_query' => array(
        'taxonomy' => 'supplier-tax',
    ),
) );

while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

<?php 
    $terms = get_the_terms( $post->ID, 'supplier-tax');
    foreach ( $terms as $term ) {
        $termID[] = $term->term_id;
    } 

    $my_query = new WP_Query( array(
        'post_type' => 'supplier',
        'tax_query' => array(
            'field' => 'slug',
            'terms' => '$termID',
        ),
    ) ); ?>

    <?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
        <p class="supplier">Поставлено <strong><?php the_title(); ?></strong></p>
        <img src="https://wordpress.stackexchange.com/questions/196832/<?php the_field("logo'); ?>">
    <?php endwhile; ?>
    <?php wp_reset_query(); ?>

<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

Если кто-то может помочь или указать, где я ошибаюсь, чтобы я мог научиться на этом, я буду очень признателен.

Мне сказали, что это происходит, потому что цикл выполняется дважды, но я не уверен, как это исправить.

Я решил это:

На случай, если кто-то когда-либо столкнется с проблемой запроса поста с тем же term другого Taxonomy в другом Post Type. Я опубликую свой ответ ниже, потому что наконец-то решил это сам.

<?php 

$terms = get_the_terms( $post->ID, 'supplier-tax');
foreach ( $terms as $term ) {
    $termID[] = $term->term_id;
}

$the_query = new WP_Query( array(
 'post_type' => 'supplier',
 'tax_query' => array(
     array(        
        'taxonomy' => 'supplier-tax',
        'terms' => $termID,
      )
    ),
) );

while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

   <p class="supplier">Поставлено <strong><?php the_title(); ?></strong></p>
   <img src="https://wordpress.stackexchange.com/questions/196832/<?php the_field("logo'); ?>">

<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

Надеюсь, это поможет кому-то, потому что было сложно найти решение.

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

Решение проблемы с дублированием постов в WordPress

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

Подробный анализ

В первоначальном коде запрос выполнялся дважды, что приводило к дублированию результата. При первом выполнении запроса WP_Query был сформирован запрос для типа поста ‘product’, но в процессе дублировался результат из-за некорректного применения второго запроса для типа поста ‘supplier’. Данная проблема возникает, когда в вашем запросе не учтены правильные условия фильтрации и группировки данных.

Проблемы в первоначальном коде

Основные недостатки кода:

  1. Использование переменной $termID как строки. В запросе передавалась переменная в виде строки '$termID', что нежелательно. Это приводит к тому, что запрос не находит значения для фильтрации.

  2. Неоптимальная структура запросов. Частый вызов new WP_Query внутри цикла может замедлить выполнение кода и привести к избыточной нагрузке на базу данных.

Решение проблемы

Пользователь исправил код, оптимизировав запрос. Ниже представлено правильное решение:

<?php 
// Получаем термины для текущего поста
$terms = get_the_terms( $post->ID, 'supplier-tax' );

// Проверяем существование терминов
if ( $terms && ! is_wp_error( $terms ) ) {
    foreach ( $terms as $term ) {
        $termID[] = $term->term_id;
    }

    // Основной запрос для получения поставщиков
    $the_query = new WP_Query( array(
        'post_type' => 'supplier',
        'tax_query' => array(
            array(        
                'taxonomy' => 'supplier-tax',
                'terms' => $termID,
            )
        ),
    ) );

    // Проверка наличия постов и вывод данных
    while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <p class="supplier">Supplied by <strong><?php the_title(); ?></strong></p>
        <img src="<?php the_field("logo"); ?>" alt="<?php the_title(); ?>">
    <?php endwhile; 

    // Сброс данных запроса
    wp_reset_postdata();
}
?>

Объяснение изменений

  1. Снижение лишних вызовов: Теперь запрос на получение ‘supplier’ выполняется один раз после извлечения уникальных идентификаторов терминов.

  2. Корректная передача переменной: Использование переменной $termID как массива сделало корректную передачу терминов в запрос.

  3. Безопасность и проверка ошибок: Добавлена проверка на наличие ошибок при получении терминов, что помогает избежать неочевидных проблем в работе.

Заключение

Оптимизация и исправление кода не только решает проблему дублирования, но и улучшает производительность приложения. Рассматривая подобные проблемы, важно анализировать каждый элемент запроса, следовать правилам оптимизации и производить тестирование. Так вы создадите качественный и эффективный код.

Это решение непосредственно относится к разработке на WordPress и может быть полезно как новичкам, так и опытным разработчикам, стремящимся улучшить свои навыки работы с данной платформой.

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

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