ネストされたループ内の前のループへの投稿データのリセット


21

投稿から投稿へのプラグインでネストされたループを使用しようとしています。ループは両方とも機能しますが、2番目のネストされたループ($ issue)の後に問題が発生します。$ publicationループに再度アクセスしたいのですが、データは依然として$ issueデータです。

wp_reset_query() single.phpのメインループに戻りますが、これは望ましくありません。

私は使用することができget_posts()、新たなWP_Queryのではなく、私は使用することができるようにしたいですget_template_part()

2番目の「出版物のタイトル」が号ではなく出版物を返すように、データを出版物のルー​​プにリセットするにはどうすればよいですか?

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
確かに、これはこれを行うためのはるかに賢い方法です。
デビッド

これは本当にあなたに効果がありますか?
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.