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

13 дек. 2013 г., 11:33:10
Просмотры: 14.9K
Голосов: 25

Я пытаюсь использовать вложенные циклы с плагином posts to posts. Оба цикла работают, но проблема возникает после второго вложенного цикла ($issue). Я хочу снова получить доступ к циклу $publication, но данные все еще относятся к $issue.

wp_reset_query() сбросит все обратно к главному циклу в single.php, чего я не хочу.

Я мог бы использовать get_posts() вместо new WP_Query, но мне нужно использовать get_template_part().

Как я могу сбросить данные обратно к циклу публикации, чтобы второй 'Publication title' возвращал заголовок публикации, а не выпуска?

Вот мой код в 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>Название публикации = '.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();

            // здесь нужно иметь возможность использовать части шаблонов
            echo '<h2>Название выпуска = '.get_the_title().'</h2>';

        endwhile;
    }

    // Сейчас здесь возвращается название выпуска, а не публикации
    echo '<h2>Название публикации = '.get_the_title().'</h2>';

endwhile;
}
0
Все ответы на вопрос 2
2
23

Я отвечу на этот вопрос сам, но очень умный @simonwheatley из Code for the People помог мне решить эту проблему.

Вместо использования 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>Название публикации = '.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();

            // здесь нужно иметь возможность использовать части шаблонов
            echo '<h2>Название выпуска = '.get_the_title().'</h2>';

        endwhile; $publication->reset_postdata();
    }

    echo '<h2>Название публикации = '.get_the_title().'</h2>';

endwhile;
}
13 дек. 2013 г. 12:04:25
Комментарии

Действительно, это гораздо более разумный способ сделать это.

David David
13 дек. 2013 г. 12:16:53

Это действительно работает у вас?

GDY GDY
6 мар. 2018 г. 15:36:08
0

Прежде всего, я считаю, что можно использовать get_posts() в сочетании с setup_postdata(). С их помощью можно использовать шаблонные теги, как в обычном цикле WordPress.

Но эту функцию также можно использовать во вложенных циклах:

# убедитесь, что $post является глобальной переменной в вашей области видимости (что должно быть в single.php)
global $post;
if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
    echo '<h2>Название публикации = '.get_the_title().'</h2>';
    $pub_id = get_the_ID();

    # сохраняем текущую запись в основном цикле
    $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();

            // здесь нужно иметь возможность использовать части шаблонов
           echo '<h2>Название выпуска = '.get_the_title().'</h2>';

        endwhile;
    }

    # возвращаем глобальную переменную к записи из первого цикла
    $post = $preserve_post;
    setup_postdata( $post );
    // Сейчас возвращается название выпуска, а не публикации
    echo '<h2>Название публикации = '.get_the_title().'</h2>';

endwhile;
}
wp_reset_query();
13 дек. 2013 г. 12:10:43