Cum să resetezi datele postării la bucla anterioară în bucle imbricate
Î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;
}
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;
}

Î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();
