การรีเซ็ตข้อมูลโพสต์เป็นลูปก่อนหน้าในลูปซ้อนกัน


21

ฉันพยายามใช้ลูปซ้อนกับโพสต์ไปยังปลั๊กอินโพสต์ ลูปทั้งสองทำงาน แต่ปัญหาเกิดขึ้นหลังจากวนซ้ำที่สอง ($ issue) ฉันต้องการเข้าถึงลูปการประกาศ $ อีกครั้ง แต่ข้อมูลยังคงเป็นข้อมูล $ Issue

wp_reset_query() จะรีเซ็ตกลับไปที่ลูปหลักใน single.php ซึ่งฉันไม่ต้องการ

ฉันสามารถใช้get_posts()แทน WP_Query ใหม่ get_template_part()แต่ฉันต้องการที่จะสามารถที่จะใช้

ฉันจะรีเซ็ตข้อมูลของฉันกลับไปที่ลูปสิ่งพิมพ์เพื่อให้ 'ชื่อสิ่งพิมพ์' ที่สองส่งคืนสิ่งพิมพ์ไม่ใช่ปัญหาชื่อได้อย่างไร

นี่คือรหัสของฉันภายใน 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

ฉันจะตอบคำถามนี้ด้วยตัวเอง แต่มันเป็น @simonwheatley ที่ฉลาดมากของ Code for the People ที่แก้ปัญหานี้ให้ฉัน

แทนที่จะใช้wp_reset_postdata()หรือwp_reset_query()คุณสามารถใช้สิ่งต่อไปนี้:

$publication->reset_postdata();

ที่ $ สิ่งพิมพ์เป็นวัตถุแบบสอบถามของคุณ

รหัสทำงานตอนนี้ดูเหมือนว่า:

$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
แน่นอนว่านี่เป็นวิธีที่ชาญฉลาดกว่ามากในการทำสิ่งนี้
David

มันใช้งานได้จริงสำหรับคุณ?
GDY

5

แรกของทั้งหมดที่ผมคิดว่ามันเป็นไปได้ที่จะใช้ร่วมกับget_posts() setup_postdata()ด้วยสิ่งเหล่านี้คุณสามารถใช้เทมเพลตแท็กเหมือนในวง WordPress ปกติ

แต่คุณสามารถใช้ฟังก์ชั่นนี้ในลูปซ้อนได้เช่นกัน:

# 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();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.