web-dev-qa-db-fra.com

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

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 veux accéder à nouveau à la boucle de publication $, mais les données sont toujours les données de publication $.

wp_reset_query() va revenir directement à 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 second "Titre de la publication" renvoie la publication et non le numéro de publication?

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;
}
20
kdev

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.

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;
}
20
kdev

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();
5
David