william666
@william666

Как сбросить цикл с помощью wp_reset_postdata();?

использую кастомный цикл с выводом будущих записей, относитительно текущей даты:

<?php
$args  = array(
    'numberposts' => 3,
    'post_type' => 'post',
    'post_status' => 'publish, future',
);
$posts = get_posts($args);

//список записей
foreach ($posts as $post) {
    $md[$post->ID]['date']       = date("d.m.Y", strtotime($post->post_date));
    $md[$post->ID]['id']         = $post->ID;
    $md[$post->ID]['post_title'] = $post->post_title;
    $md[$post->ID]['post_excerpt'] = $post->post_excerpt;

}

//группировка по дате
$resultArray = array();
array_walk($md, function($item, $key) use (&$resultArray)
{
    $resultArray[$item['date']][] = $item;
});

//сортировка в порядке возрастания записей от текущей даты(на ближайшие 20 дней)
$new_posts = array();
for ($i = 0; $i < 20; $i++) {
    $nd = date('d.m.Y', strtotime(date('Y-m-d') . '+' . $i . 'day'));
    if (!empty($resultArray[$nd])) {
        $new_posts[$nd] = $resultArray[$nd];
    }
} ?>


<?php foreach($new_posts as $key=>$val) {
	        foreach($val as $nm) { ?>

<?php echo $nm['post_title']; ?>
<?php echo $nm['post_excerpt'];?>

 <?php  }
	    } ?>


следом идет стандартный цикл:
<?php 
			while ( have_posts() ) :
				the_post();
				the_title();
				the_content();
			endwhile; // End of the loop.
			?>


как именно нужно сбросить, чтобы из страндартного вывода текущей страницы показывался верный id (контент, заголовок), а не из первого кода..

вставлял в разные места wp_reset_postdata(); - не срабатывает.
работает, только если удалить $posts = get_posts($args);
  • Вопрос задан
  • 286 просмотров
Пригласить эксперта
Ответы на вопрос 2
deniscopro
@deniscopro Куратор тега WordPress
WordPress-разработчик, denisco.pro
Попробуйте вставить wp_reset_query между кастомным и стандартным циклами.
wp_reset_query();
Ответ написан
Комментировать
sergeiermilov
@sergeiermilov
Веб-дизайн, фронтенд и WordPress разработка
Если вы используете get_posts() вместо query_posts(), то wp_reset_postdata() можно использовать после foreach.

Это же (wp_reset_postdata()) работает в случае WP_Query вместо query_posts().

Если использовали query_posts(), то wp_reset_query() должна вызываться сразу после произвольного цикла и нужна, чтобы все условные теги работали правильно и глобальные переменные соответствовали текущей странице.

Пример использования get_posts() вместо query_posts():

$args = array( 'posts_per_page' => 3 );
$lastposts = get_posts( $args );
foreach( $lastposts as $post ){ setup_postdata($post);
	?>
	<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
	<?php 
	the_content(); 
}
wp_reset_postdata();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы