Вложенный цикл WP_Query внутри WP_Query

29 дек. 2015 г., 15:50:55
Просмотры: 20.9K
Голосов: 2

Я пытаюсь использовать пользовательский цикл 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();
?>

Спасибо!

5
Комментарии

Чтобы получить хороший ответ, вам нужно сначала задать вопрос. Что именно вы пытаетесь достичь, что требует вложенных запросов?

jdm2112 jdm2112
29 дек. 2015 г. 17:18:17

Что вы подразумеваете под "использовать"? Это код. Он записывается в файл. Но вы не объясняете, что именно хотите сделать.

s_ha_dum s_ha_dum
29 дек. 2015 г. 17:26:48

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

jjj jjj
29 дек. 2015 г. 17:27:59

Ваше редактирование по-прежнему ничего не говорит. Код не работает, у вас есть проблемы с кодом, вы получаете ошибки, какие именно ошибки?

Pieter Goosen Pieter Goosen
29 дек. 2015 г. 18:09:19

Вопрос только что отредактирован, извините за ощущение небрежности.

jjj jjj
29 дек. 2015 г. 19:01:30
Все ответы на вопрос 1
2

До сих пор совершенно непонятно, что именно вы хотите сделать, но судя по этому:

это работает, но основной цикл создает дублирующиеся записи

Могу сказать, что это ожидаемый результат.

Ваш "основной" цикл запрашивает и отображает все страницы, у которых родительская страница имеет 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(); // ОЧЕНЬ ОЧЕНЬ ВАЖНО
}
29 дек. 2015 г. 19:30:48
Комментарии

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

jjj jjj
29 дек. 2015 г. 19:44:37

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

Pieter Goosen Pieter Goosen
29 дек. 2015 г. 19:50:31