Restablecer datos de publicación al bucle anterior en bucles anidados

13 dic 2013, 11:33:10
Vistas: 14.9K
Votos: 25

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;
}
0
Todas las respuestas a la pregunta 2
2
23

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;
}
13 dic 2013 12:04:25
Comentarios

De hecho, esta es la forma mucho más inteligente de hacerlo.

David David
13 dic 2013 12:16:53

¿Realmente esto funciona para ti?

GDY GDY
6 mar 2018 15:36:08
0

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();
13 dic 2013 12:10:43