Вопрос или проблема
После того как я искал помощь и потерпел неудачу, мне удалось написать запрос для 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’. Данная проблема возникает, когда в вашем запросе не учтены правильные условия фильтрации и группировки данных.
Проблемы в первоначальном коде
Основные недостатки кода:
-
Использование переменной
$termID
как строки. В запросе передавалась переменная в виде строки'$termID'
, что нежелательно. Это приводит к тому, что запрос не находит значения для фильтрации. -
Неоптимальная структура запросов. Частый вызов
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();
}
?>
Объяснение изменений
-
Снижение лишних вызовов: Теперь запрос на получение ‘supplier’ выполняется один раз после извлечения уникальных идентификаторов терминов.
-
Корректная передача переменной: Использование переменной
$termID
как массива сделало корректную передачу терминов в запрос. -
Безопасность и проверка ошибок: Добавлена проверка на наличие ошибок при получении терминов, что помогает избежать неочевидных проблем в работе.
Заключение
Оптимизация и исправление кода не только решает проблему дублирования, но и улучшает производительность приложения. Рассматривая подобные проблемы, важно анализировать каждый элемент запроса, следовать правилам оптимизации и производить тестирование. Так вы создадите качественный и эффективный код.
Это решение непосредственно относится к разработке на WordPress и может быть полезно как новичкам, так и опытным разработчикам, стремящимся улучшить свои навыки работы с данной платформой.