Menyetel ulang data pos ke loop sebelumnya di loop bersarang

21

Saya mencoba menggunakan loop bersarang dengan plugin posting ke posting. Loop keduanya berfungsi, tetapi masalah muncul setelah loop bersarang kedua ($ issue). Saya ingin mengakses loop $ publikasi lagi, tetapi data tersebut masih $ data.

wp_reset_query() akan mengatur ulang segera ke loop utama di single.php yang tidak saya inginkan.

Saya bisa menggunakan get_posts()daripada WP_Query baru, tapi saya ingin dapat menggunakannya get_template_part().

Bagaimana saya bisa mengatur ulang data saya kembali ke loop publikasi, sehingga 'Judul Publikasi' kedua mengembalikan publikasi, bukan masalah, judul?

Ini kode saya di dalam 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
sumber

Jawaban:

20

Saya akan menjawab ini sendiri, tetapi @simonwheatley dari Code for the People yang sangat pintar memecahkan masalah ini untuk saya.

Alih-alih menggunakan wp_reset_postdata()atau wp_reset_query(), Anda dapat menggunakan yang berikut:

$publication->reset_postdata();

Di mana $ publikasi adalah objek permintaan Anda.

Kode kerja sekarang terlihat seperti:

$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
sumber
1
Memang, ini adalah cara yang jauh lebih cerdas untuk melakukan ini.
David
Apakah ini benar-benar bekerja untuk Anda?
GDY
5

Pertama-tama, saya pikir itu mungkin untuk digunakan get_posts()bersama setup_postdata(). Dengan ini, Anda dapat menggunakan tag templat seperti pada loop WordPress normal.

Tetapi Anda dapat menggunakan fungsi ini juga di loop bersarang:

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