Cum să resetezi datele postării la bucla anterioară în bucle imbricate

13 dec. 2013, 11:33:10
Vizualizări: 14.9K
Voturi: 25

Încerc să folosesc bucle imbricate cu plugin-ul posts to posts. Ambele bucle funcționează, dar problema apare după cea de-a doua buclă imbricată ($issue). Vreau să accesez din nou bucla $publication, dar datele sunt încă cele din bucla $issue.

wp_reset_query() va reseta înapoi la bucla principală din single.php, ceea ce nu doresc.

Aș putea folosi get_posts() în loc de new WP_Query, dar vreau să pot folosi get_template_part().

Cum pot reseta datele înapoi la bucla de publicație, astfel încât al doilea 'Titlu publicație' să returneze titlul publicației, nu al numărului?

Iată codul meu din 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>Titlu publicație = '.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();

            // trebuie să pot folosi părți de template aici
            echo '<h2>Titlu număr = '.get_the_title().'</h2>';

        endwhile;
    }

    // Acum returnează titlul numărului, nu al publicației
    echo '<h2>Titlu publicație = '.get_the_title().'</h2>';

endwhile;
}
0
Toate răspunsurile la întrebare 2
2
23

Voi răspunde singur la această întrebare, dar soluția mi-a fost oferită de foarte inteligentul @simonwheatley de la Code for the People.

În loc să folosiți wp_reset_postdata() sau wp_reset_query(), puteți utiliza următoarea sintaxă:

$publication->reset_postdata();

Unde $publication este obiectul vostru de interogare.

Codul funcțional arată acum astfel:

$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>Titlul publicației = '.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();

            // aici este nevoie să putem folosi părți de template
            echo '<h2>Titlul ediției = '.get_the_title().'</h2>';

        endwhile; $publication->reset_postdata();
    }

    echo '<h2>Titlul publicației = '.get_the_title().'</h2>';

endwhile;
}
13 dec. 2013 12:04:25
Comentarii

Într-adevăr, aceasta este o metodă mult mai inteligentă de a face acest lucru.

David David
13 dec. 2013 12:16:53

Funcționează într-adevăr pentru tine?

GDY GDY
6 mar. 2018 15:36:08
0

În primul rând, cred că este posibil să folosești get_posts() în combinație cu setup_postdata(). Cu acestea, poți folosi etichetele de șablon ca într-o buclă normală WordPress.

Dar poți folosi această funcție și în buclele tale imbricate:

# asigură-te că $post este global în domeniul tău (ceea ce ar trebui să fie cazul în single.php)
global $post;
if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
    echo '<h2>Titlul publicației = '.get_the_title().'</h2>';
    $pub_id = get_the_ID();

    # păstrează postul curent din bucla superioară
    $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();

            // trebuie să poți folosi părți de șablon aici
           echo '<h2>Titlul ediției = '.get_the_title().'</h2>';

        endwhile;
    }

    # setează globalul înapoi la postul din prima buclă
    $post = $preserve_post;
    setup_postdata( $post );
    // În prezent returnează titlul ediției, nu titlul publicației
    echo '<h2>Titlul publicației = '.get_the_title().'</h2>';

endwhile;
}
wp_reset_query();
13 dec. 2013 12:10:43