Đặt lại dữ liệu bài đăng vào vòng lặp trước trong các vòng lặp lồng nhau


21

Tôi đang cố gắng sử dụng các vòng lặp lồng nhau với các bài đăng để đăng bài. Các vòng lặp đều hoạt động, nhưng vấn đề phát sinh sau vòng lặp lồng thứ hai (vấn đề $). Tôi muốn truy cập lại vòng lặp xuất bản $, nhưng dữ liệu vẫn là dữ liệu vấn đề $.

wp_reset_query() sẽ đặt lại ngay vào vòng lặp chính trong single.php mà tôi không muốn.

Tôi có thể sử dụng get_posts()thay vì WP_Query mới, nhưng tôi muốn có thể sử dụng get_template_part().

Làm cách nào tôi có thể đặt lại dữ liệu của mình trở lại vòng lặp xuất bản để 'Tiêu đề xuất bản' thứ hai trả về ấn phẩm, không phải vấn đề, tiêu đề?

Đây là mã của tôi trong 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;
}

Câu trả lời:


20

Tôi sẽ tự trả lời câu hỏi này, nhưng chính @simonwheatley của Bộ luật dành cho những người đã giải quyết vấn đề này cho tôi.

Thay vì sử dụng wp_reset_postdata()hoặc wp_reset_query(), bạn có thể sử dụng như sau:

$publication->reset_postdata();

Trong đó $ xuất bản là đối tượng truy vấn của bạn.

Mã làm việc bây giờ trông như sau:

$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
Thật vậy, đây là cách thông minh hơn nhiều để làm điều này.
David

Điều này thực sự làm việc cho bạn?
GDY

5

Trước hết, tôi nghĩ rằng nó có thể được sử dụng get_posts()kết hợp với setup_postdata(). Với những điều này, bạn có thể sử dụng các thẻ mẫu như trong một vòng lặp WordPress bình thường.

Nhưng bạn cũng có thể sử dụng chức năng này trong các vòng lặp lồng nhau của mình:

# 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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.