Bucle WP_Query dentro de otro bucle WP_Query
Estoy tratando de usar un bucle WP_Query personalizado dentro de otro para mostrar datos del bucle interno independientemente del bucle principal. Encontré esta solución pero no entiendo realmente cómo usarla. Aquí está el código, funciona pero el bucle principal genera publicaciones duplicadas.
<?php
// definir la consulta principal
$main_args = array(
'post_type' => 'page',
'post_parent' => '10',
);
// ejecutar la consulta principal
$the_main_loop = new WP_Query($main_args);
// iniciar bucle principal
if($the_main_loop->have_posts()) : while($the_main_loop->have_posts()) : $the_main_loop->the_post();
?>
<p>Este es el contenido del bucle principal</p>
<?php
// definir la consulta interna
$inner_args = array(
'post_type' => 'page',
'post_parent' => '20',
);
// ejecutar la consulta interna
$the_inner_loop = new WP_Query($inner_args);
// iniciar bucle interno
if($the_inner_loop->have_posts()) : while($the_inner_loop->have_posts()) : $the_inner_loop->the_post();
?>
<p>Este es el contenido del bucle interno</p>
<?php
// finalizar el bucle interno, sin reinicio
endwhile; endif;
?>
<p>Este es otro contenido del bucle principal</p>
<?php
// finalizar el bucle principal
endwhile; endif; wp_reset_postdata();
?>
¡Gracias!
Todavía no está claro lo que realmente quieres hacer, pero según esto:
funciona pero el bucle principal genera posts duplicados
Puedo decirte que es el resultado esperado.
Tu bucle "principal" consulta y muestra todas las páginas que tienen un ID de página padre igual a 10
. Digamos que hay 10 páginas que coinciden con tu consulta "principal", esto significa que tu bucle pasará por 10 ciclos si quieres llamarlo así. Piensa en el bucle como un bucle foreach
ya que esencialmente es eso (pero no exactamente lo mismo).
Ahora, dentro de cada ciclo, estás agregando otra consulta que busca páginas con un ID padre de 20
. Digamos que también hay 10. Entonces, cada ciclo del bucle "principal" mostrará 10 posts con padre 20
, 10 veces porque hay 10 páginas con padre 10
.
Muy básicamente, tienes:
// Primer ciclo
the_post(); // 1ra página con padre 10
// consulta personalizada que mostrará páginas con padre 20
// Fin del primer ciclo e inicio del segundo ciclo
the_post(); // 2da página con padre 10
// consulta personalizada que mostrará páginas con padre 20
// Fin del segundo ciclo e inicio del tercer ciclo
the_post(); // 3ra página con padre 10
// consulta personalizada que mostrará páginas con padre 20
etc etc
Deberías sacar tu segunda consulta fuera de la "principal" para separarlas
$main_args = [
'post_type' => 'page',
'post_parent' => '10',
];
// ejecutar la consulta principal
$the_main_loop = new WP_Query($main_args);
// iniciar consulta principal
if($the_main_loop->have_posts()) {
while($the_main_loop->have_posts()) {
$the_main_loop->the_post();
// Mostrar el contenido de tu bucle
} // endwhile
wp_reset_postdata(); // MUY MUY IMPORTANTE
}
// definir la consulta interna
$inner_args = [
'post_type' => 'page',
'post_parent' => '20',
];
// ejecutar la consulta interna
$the_inner_loop = new WP_Query($inner_args);
// iniciar consulta interna
if($the_inner_loop->have_posts()) {
while($the_inner_loop->have_posts()) {
$the_inner_loop->the_post();
// Mostrar el contenido de tu bucle
} // endwhile
wp_reset_postdata(); // MUY MUY IMPORTANTE
}

Gracias por tu explicación y por tu tiempo, me ayudó mucho a entender los ciclos de un bucle. Mi problema es más sobre cómo poner consultas de un bucle dentro de otro, pero me doy cuenta de que mi ejemplo y mi pregunta no son claros, lo siento mucho (de nuevo) por eso. Me aseguraré de hacerlo mejor la próxima vez en StackExchange.

Un placer. Deberías intentar obtener un caso de uso exacto para respuestas exactas. He hecho una publicación o dos sobre usar una consulta dentro de otra, algo como publicaciones relacionadas si mal no recuerdo, pero francamente, no sé cuándo y dónde. Siéntete libre de revisar mis respuestas ;-)
