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

21

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

wp_reset_query() va réinitialiser la boucle principale dans single.php dont je ne veux pas.

Je pourrais utiliser get_posts()au lieu de 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 publication» renvoie la publication, pas le numéro, 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;
}
kdev
la source

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;
}
kdev
la source
1
En effet, c'est la façon la plus intelligente de procéder.
David
Est-ce que cela fonctionne vraiment pour vous?
GDY
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();
David
la source