Сброс данных поста к предыдущему циклу во вложенных циклах

21

Я пытаюсь использовать вложенные циклы с плагином постов к постам. Оба цикла работают, но проблема возникает после второго вложенного цикла ($ 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;
}
kdev
источник

Ответы:

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;
}
kdev
источник
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();
Дэвид
источник