중첩 루프에서 포스트 데이터를 이전 루프로 재설정


21

게시물 게시 플러그인으로 중첩 루프를 사용하려고합니다. 루프는 모두 작동하지만 문제는 두 번째 중첩 루프 ($ issue) 후에 발생합니다. $ publication 루프에 다시 액세스하고 싶지만 데이터는 여전히 $ 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였습니다.

대신에 사용하는 wp_reset_postdata()또는 wp_reset_query()다음을 사용할 수 있습니다 :

$publication->reset_postdata();

여기서 $ publication은 쿼리 개체입니다.

작업 코드는 이제 다음과 같습니다.

$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.