Zurücksetzen von Post-Daten auf die vorherige Schleife in verschachtelten Schleifen

21

Ich versuche, geschachtelte Schleifen mit den Beiträgen zu Beiträgen Plugin zu verwenden. Die Schleifen funktionieren beide, aber das Problem tritt nach der zweiten verschachtelten Schleife ($ issue) auf. Ich möchte erneut auf die $ publication-Schleife zugreifen, aber die Daten sind immer noch die $ issue-Daten.

wp_reset_query() wird gleich wieder auf die Hauptschleife in single.php zurückgesetzt, die ich nicht will.

Ich könnte get_posts()anstelle von neuem WP_Query verwenden, aber ich möchte verwenden können get_template_part().

Wie kann ich meine Daten in die Publikationsschleife zurücksetzen, sodass der zweite "Publikationstitel" die Publikation und nicht den Titel der Ausgabe zurückgibt?

Hier ist mein Code in 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
quelle

Antworten:

20

Ich werde das selbst beantworten, aber es war das sehr clevere @simonwheatley von Code for the People, das dieses Problem für mich gelöst hat.

Anstelle von wp_reset_postdata()oder wp_reset_query()können Sie Folgendes verwenden:

$publication->reset_postdata();

Wobei $ publication Ihr Abfrageobjekt ist.

Der Arbeitscode sieht jetzt so aus:

$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
quelle
1
Dies ist in der Tat der viel intelligentere Weg, dies zu tun.
David
Funktioniert das wirklich für Sie?
GDY
5

Zunächst denke ich, dass es möglich ist, get_posts()in Kombination mit zu verwenden setup_postdata(). Mit diesen können Sie die Template-Tags wie in einer normalen WordPress-Schleife verwenden.

Sie können diese Funktion aber auch in Ihren verschachtelten Schleifen verwenden:

# 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
quelle