नेस्टेड लूप में पिछले लूप में पोस्ट डेटा रीसेट करना


21

मैं पोस्ट प्लग इन के साथ नेस्टेड छोरों का उपयोग करने की कोशिश कर रहा हूं। लूप दोनों काम करते हैं, लेकिन समस्या दूसरे नेस्टेड लूप ($ मुद्दा) के बाद उत्पन्न होती है। मैं $ प्रकाशन लूप को फिर से एक्सेस करना चाहता हूं, लेकिन डेटा अभी भी $ मुद्दा डेटा है।

wp_reset_query() एकल में मुख्य पाश पर वापस रीसेट करेगा। एफपी जो मैं नहीं चाहता।

मैं 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 था जिसने मेरे लिए यह एक हल किया।

उपयोग करने के बजाय 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
वास्तव में, यह ऐसा करने का सबसे अधिक स्मार्ट तरीका है।
डेविड

क्या यह वास्तव में आपके लिए काम करता है?
GDY

5

सबसे पहले, मुझे लगता है कि इसके get_posts()साथ संयोजन में उपयोग करना संभव हैsetup_postdata() । इनके साथ, आप सामान्य वर्डप्रेस लूप की तरह टेम्प्लेट टैग का उपयोग कर सकते हैं।

लेकिन आप इस फ़ंक्शन का उपयोग अपने नेस्टेड छोरों में भी कर सकते हैं:

# 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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.