Réinitialisation des données de publication sur la boucle précédente dans des boucles imbriquées

19

J'essaie d'utiliser des boucles imbriquées avec le plugin posts to posts. Les boucles fonctionnent toutes les deux, mais le problème se pose après la deuxième boucle imbriquée ($ issue). Je souhaite accéder à nouveau à la boucle de publication $, mais les données restent les données de publication $.

wp_reset_query() reviendra à la boucle principale dans single.php, ce que je ne veux pas.

Je pourrais utiliser get_posts() au lieu du nouveau WP_Query, mais je veux pouvoir utiliser get_template_part() .

Comment puis-je réinitialiser mes données dans la boucle de publication, de sorte que le deuxième "Titre de la publication" renvoie la publication et non le numéro ou le titre?

Voici mon code dans 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>Publication title = '.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();

            // need to be able to use template parts in here
            echo '<h2>Issue title = '.get_the_title().'</h2>';

        endwhile;
    }

    // This currently returns the issue title, not the publication title
    echo '<h2>Publication title = '.get_the_title().'</h2>';

endwhile;
}
    
posée kdev 13.12.2013 - 10:33

2 réponses

20

Je vais y répondre moi-même, mais c'est le très intelligent @simonwheatley de Code for the People qui a résolu celui-ci pour moi.

Au lieu d'utiliser wp_reset_postdata() ou wp_reset_query() , vous pouvez utiliser les éléments suivants:

$publication->reset_postdata();

Où $ publication est votre objet de requête.

Le code de travail ressemble maintenant à:

$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>Publication title = '.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();

            // need to be able to use template parts in here
            echo '<h2>Issue title = '.get_the_title().'</h2>';

        endwhile; $publication->reset_postdata();
    }

    echo '<h2>Publication title = '.get_the_title().'</h2>';

endwhile;
}
    
réponse donnée kdev 13.12.2013 - 11:04
5

Tout d'abord, je pense qu'il est possible d'utiliser get_posts() en combinaison avec setup_postdata() . Avec ceux-ci, vous pouvez utiliser les balises de modèle comme dans une boucle WordPress normale.

Mais vous pouvez également utiliser cette fonction dans vos boucles imbriquées:

# make sure $post is the global in your scope (which should be the case in single.php)
global $post;
if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
    echo '<h2>Publication title = '.get_the_title().'</h2>';
    $pub_id = get_the_ID();

    # preserve the current post in the higher loop
    $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();

            // need to be able to use template parts in here
           echo '<h2>Issue title = '.get_the_title().'</h2>';

        endwhile;
    }

    # set the global back to your first loop post
    $post = $preserve_post;
    setup_postdata( $post );
    // This currently returns the issue title, not the publication title
    echo '<h2>Publication title = '.get_the_title().'</h2>';

endwhile;
}
wp_reset_query();
    
réponse donnée David 13.12.2013 - 11:10

Lire d'autres questions sur les étiquettes