Resetowanie danych post do poprzedniej pętli w zagnieżdżonych pętlach


21

Próbuję użyć zagnieżdżonych pętli z wtyczką posty do postów. Obie pętle działają, ale problem pojawia się po drugiej zagnieżdżonej pętli (problem $). Chcę ponownie uzyskać dostęp do pętli publikacyjnej $, ale dane wciąż są danymi problemu $.

wp_reset_query() zresetuje się z powrotem do głównej pętli w single.php, czego nie chcę.

Mógłbym użyć get_posts()zamiast nowego WP_Query, ale chcę mieć możliwość korzystania get_template_part().

Jak mogę zresetować moje dane z powrotem do pętli publikacji, aby drugi „Tytuł publikacji” zwrócił publikację, a nie problem, tytuł?

Oto mój kod w 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;
}

Odpowiedzi:


20

Sam odpowiem na to pytanie, ale to bardzo sprytna @simonwheatley z Code for the People rozwiązała ten dla mnie.

Zamiast używać wp_reset_postdata()lub wp_reset_query()możesz użyć następujących opcji:

$publication->reset_postdata();

Gdzie $ publikacja jest twoim obiektem zapytania.

Działający kod wygląda teraz tak:

$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;
}

1
Rzeczywiście jest to o wiele mądrzejszy sposób na zrobienie tego.
David

Czy to naprawdę dla ciebie działa?
GDY

5

Przede wszystkim myślę, że można go używać get_posts()w połączeniu z setup_postdata(). Dzięki nim możesz używać znaczników szablonów jak w normalnej pętli WordPress.

Ale możesz użyć tej funkcji również w zagnieżdżonych pętlach:

# 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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.