Restablecer datos de publicación al bucle anterior en bucles anidados
Estoy intentando usar bucles anidados con el plugin posts to posts. Ambos bucles funcionan, pero el problema surge después del segundo bucle anidado ($issue). Quiero acceder nuevamente al bucle $publication, pero los datos siguen siendo los del bucle $issue.
wp_reset_query()
restablecerá completamente hasta el bucle principal en single.php, lo cual no quiero.
Podría usar get_posts()
en lugar de new WP_Query, pero necesito poder usar get_template_part()
.
¿Cómo puedo restablecer mis datos al bucle de publicación, para que el segundo 'Título de publicación' muestre el de la publicación y no el de la edición?
Aquí está mi código dentro de single.php:
$publication = new WP_Query( array(
'connected_type' => 'publication_to_post',
'connected_items' => $post->ID,
'fields' => 'ids',
'posts_per_page' => 1,
) );
if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
echo '<h2>Título de publicación = '.get_the_title().'</h2>';
$pub_id = get_the_ID();
$issue = new WP_Query( array(
'connected_type' => 'publication_to_issue',
'connected_items' => $pub_id,
'fields' => 'ids',
'posts_per_page' => 1,
) );
if ( $issue->have_posts() ) {
while ( $issue->have_posts() ) : $issue->the_post();
// Necesito poder usar partes de plantilla aquí
echo '<h2>Título de edición = '.get_the_title().'</h2>';
endwhile;
}
// Actualmente esto devuelve el título de la edición, no de la publicación
echo '<h2>Título de publicación = '.get_the_title().'</h2>';
endwhile;
}

Voy a responder esto yo mismo, pero fue el muy inteligente @simonwheatley de Code for the People quien resolvió esto por mí.
En lugar de usar wp_reset_postdata()
o wp_reset_query()
, puedes usar lo siguiente:
$publication->reset_postdata();
Donde $publication es tu objeto de consulta.
El código funcional ahora luce así:
$publication = new WP_Query( array(
'connected_type' => 'publication_to_post',
'connected_items' => $post->ID,
'fields' => 'ids',
'posts_per_page' => 1,
) );
if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
echo '<h2>Título de la publicación = '.get_the_title().'</h2>';
$pub_id = get_the_ID();
$issue = new WP_Query( array(
'connected_type' => 'publication_to_issue',
'connected_items' => $pub_id,
'fields' => 'ids',
'posts_per_page' => 1,
) );
if ( $issue->have_posts() ) {
while ( $issue->have_posts() ) : $issue->the_post();
// necesito poder usar partes de plantilla aquí
echo '<h2>Título del número = '.get_the_title().'</h2>';
endwhile; $publication->reset_postdata();
}
echo '<h2>Título de la publicación = '.get_the_title().'</h2>';
endwhile;
}

En primer lugar, creo que es posible usar get_posts()
en combinación con setup_postdata()
. Con estos, puedes usar las etiquetas de plantilla como en un bucle normal de WordPress.
Pero también puedes usar esta función en tus bucles anidados:
# asegúrate que $post es global en tu ámbito (lo cual debería ser el caso en single.php)
global $post;
if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
echo '<h2>Título de la publicación = '.get_the_title().'</h2>';
$pub_id = get_the_ID();
# preservar el post actual en el bucle superior
$preserve_post = get_post();
$issue = new WP_Query( array(
'connected_type' => 'publication_to_issue',
'connected_items' => $pub_id,
'fields' => 'ids',
'posts_per_page' => 1,
) );
if ( $issue->have_posts() ) {
while ( $issue->have_posts() ) : $issue->the_post();
// necesito poder usar partes de plantilla aquí
echo '<h2>Título del número = '.get_the_title().'</h2>';
endwhile;
}
# restablece el global a tu primer post del bucle
$post = $preserve_post;
setup_postdata( $post );
// Actualmente esto devuelve el título del número, no el de la publicación
echo '<h2>Título de la publicación = '.get_the_title().'</h2>';
endwhile;
}
wp_reset_query();
