Сброс данных поста к предыдущему циклу во вложенных циклах
Я пытаюсь использовать вложенные циклы с плагином 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;
}
Я отвечу на этот вопрос сам, но очень умный @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;
}

Прежде всего, я считаю, что можно использовать 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();
