Вложенный цикл WP_Query внутри WP_Query
Я пытаюсь использовать пользовательский цикл WP_Query внутри другого цикла для отображения данных из внутреннего цикла независимо от основного цикла. Я нашел это решение, но не совсем понимаю, как его использовать. Вот код, он работает, но основной цикл генерирует дублирующиеся записи.
<?php
// определяем основной запрос
$main_args = array(
'post_type' => 'page',
'post_parent' => '10',
);
// выполняем основной запрос
$the_main_loop = new WP_Query($main_args);
// запускаем основной запрос
if($the_main_loop->have_posts()) : while($the_main_loop->have_posts()) : $the_main_loop->the_post();
?>
<p>Это контент из основного цикла</p>
<?php
// определяем внутренний запрос
$inner_args = array(
'post_type' => 'page',
'post_parent' => '20',
);
// выполняем внутренний запрос
$the_inner_loop = new WP_Query($inner_args);
// запускаем внутренний запрос
if($the_inner_loop->have_posts()) : while($the_inner_loop->have_posts()) : $the_inner_loop->the_post();
?>
<p>Это контент из внутреннего цикла</p>
<?php
// завершаем внутренний цикл, без сброса
endwhile; endif;
?>
<p>Это другой контент из основного цикла</p>
<?php
// завершаем основной цикл
endwhile; endif; wp_reset_postdata();
?>
Спасибо!
До сих пор совершенно непонятно, что именно вы хотите сделать, но судя по этому:
это работает, но основной цикл создает дублирующиеся записи
Могу сказать, что это ожидаемый результат.
Ваш "основной" цикл запрашивает и отображает все страницы, у которых родительская страница имеет ID 10
. Допустим, есть 10 страниц, соответствующих вашему "основному" запросу, это означает, что ваш цикл пройдет 10 итераций, если можно так выразиться. Думайте о цикле как о foreach
, потому что он, по сути, является именно этим (но не совсем точно таким же).
Теперь, в каждой итерации вы добавляете еще один запрос, который запрашивает страницы с родительским ID 20
. Допустим, их тоже 10. Таким образом, каждая итерация "основного" цикла будет выводить 10 записей с родительской записью 20
, 10 раз, потому что есть 10 страниц с родителем 10
.
Очень упрощенно у вас получается:
// Первая итерация
the_post(); // 1-я страница с родителем 10
// пользовательский запрос, который будет отображать страницы с родителем 20
// Конец первой итерации и начало второй
the_post(); // 2-я страница с родителем 10
// пользовательский запрос, который будет отображать страницы с родителем 20
// Конец второй итерации и начало третьей
the_post(); // 3-я страница с родителем 10
// пользовательский запрос, который будет отображать страницы с родителем 20
и так далее
Вам следует вынести второй запрос за пределы "основного", чтобы разделить их:
$main_args = [
'post_type' => 'page',
'post_parent' => '10',
];
// выполняем основной запрос
$the_main_loop = new WP_Query($main_args);
// запускаем основной запрос
if($the_main_loop->have_posts()) {
while($the_main_loop->have_posts()) {
$the_main_loop->the_post();
// Отображаем содержимое вашего цикла
} // endwhile
wp_reset_postdata(); // ОЧЕНЬ ОЧЕНЬ ВАЖНО
}
// определяем внутренний запрос
$inner_args = [
'post_type' => 'page',
'post_parent' => '20',
];
// выполняем внутренний запрос
$the_inner_loop = new WP_Query($inner_args);
// запускаем внутренний запрос
if($the_inner_loop->have_posts()) {
while($the_inner_loop->have_posts()) {
$the_inner_loop->the_post();
// Отображаем содержимое вашего цикла
} // endwhile
wp_reset_postdata(); // ОЧЕНЬ ОЧЕНЬ ВАЖНО
}

Спасибо за ваше объяснение и за уделенное время, это очень помогло мне понять циклы в петлях. Моя проблема больше связана с вложением запросов в петли друг в друга, но я осознаю, что мой пример и вопрос были неясными, за что мне очень жаль (снова). В следующий раз на StackExchange я постараюсь сделать это лучше.

Всегда пожалуйста. Вам стоит попробовать привести конкретный пример использования для точных ответов. Я делал пару постов о вложении запросов друг в друга, что-то вроде связанных записей, если я правильно помню, но честно говоря, не помню где и когда. Не стесняйтесь просмотреть мои ответы ;-)
