it-swarm.com.de

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

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 möchte.

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

Wie kann ich meine Daten wieder 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;
}
20
kdev

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

Zunächst denke ich, dass es möglich ist, get_posts() in Kombination mit setup_postdata() zu verwenden. 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();
5
David