WordPress как на ладони
wordpress jino

have_posts() WP 1.5

Проверяет есть ли у текущего запроса WP результаты для вывода, т.е. есть ли в наличии посты, которые можно вывести для текущей страницы. Условный тег.

В конце Цикла WordPress, функция автоматически возвращает метку, что запрос снова полный и готов для вывода, т.е. автоматически использует функцию: rewind_posts().

Хуков нет.

Возвращает

falsе, если результатов для вывода нет и true, если есть что выводить.

Использование

<?php if( have_posts() ){ ... } ?>

Примеры

#1. Определим есть ли записи для вывода

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

<?php
if ( have_posts() ){
	while ( have_posts() ){ the_post();
		// код вывода
	}
} else {
	echo wpautop( 'Постов для вывода не найдено.' );
}
?>

#2. Вызов have_posts() внутри Цикла WordPress

Вызов have_posts() внутри Цикла WordPress, означает бесконечный цикл. Смотрите пример:

while ( have_posts() ){ the_post();
		// Вывод поста
		if ( have_posts() ){ // Если это последний пост, цикл начнется заново
				// Делаем что-нибудь, если это не не последний пост
		}
}

2.1. Если нужно проверить есть ли еще посты в текущем цикле, можно использовать такую функцию:

function more_posts() {
  global $wp_query;
  return $wp_query->current_post + 1 < $wp_query->post_count;
}

Эта функция будет возвращать true, если посты еще есть в запросе и false, если был выведен последний пост. Использовать функцию more_posts() нужно будет вместо have_posts() из примера 2.

Код have posts: wp-includes/query.php VER 4.9.1

<?php
function have_posts() {
	global $wp_query;
	return $wp_query->have_posts();
}

Cвязанные функции

Из метки: query (запрос)

Еще из метки: Условные теги (все)

Еще из раздела: Запросы

have_posts 15 комментариев
Полезные 1 Вопросы 1 Все
  • Dayks

    Здравствуйте!
    Есть сайт на WordPress (на локале). В открытом посте для перехода на публикацию вперед/назад используются соответственно функции

    <div class="next"><?php next_post_link('%link', ''); ?></div>
    <div class="previous"><?php previous_post_link('%link', ''); ?></div>

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

    , то есть либо

    <div class="next"></div>

    если пост второй или более старый, либо какой-то

    <div class="empty"></div>

    если это самый новый пост.

    Ответить4.8 года назад #
    • Kama4697
      add_filter('previous_post_link', 'my_function');
      add_filter('next_post_link', 'my_function');
      function my_function($output){
      	if(empty($output))
      		 return '<div class="empty"></div>';
      	return $output;
      }

      П.С. И почему коммент к посту have_posts?

      Ответить4.8 года назад #
      • Dayks

        Спасибо! Я просто гуглил и надыбал ваш пост . smile

        Ответить4.8 года назад #
  • Alex @

    Тимур, подскажи пожалуйста, есть код, который выводит заголовки последний постов

    <ul>
    	<?php
    	query_posts('showposts=5&order=DESC&orderby=date');
    	if (have_posts()) : while (have_posts()) : the_post();
    	?>
    	<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    	<?php endwhile; endif; ?>
    </ul>

    Т.к. блог уже оброс записями, не вижу смысла проверять, если ли содержимое для вывода. Как можно избавиться от этой проверки и задать по умолчанию true ?

    Спасибо.

    Ответить3.3 года назад #
    • Kama4697

      Не понятно почему вас смущает проверка? Она ресурсы не кушает вообще почти.

      query_posts использовать для вывода заголовков в блоке - это неправильно!

      Можно так:

      <?php
      $last_posts = get_posts('showposts=5&order=DESC&orderby=date');
      foreach( $last_posts as $pst ){
      	?>
      	<li><a href="<?php echo get_permalink( $pst->ID ); ?>"><?php echo $pst->post_title ?></a></li>
      	<?php
      }
      ?>
      Ответить3.3 года назад #
      • Alex @

        Спасибо большое. Заменил код, минус 2 запроса к БД good Единственное, не выводит прикрепленный пост на главной, но я решил эту проблему просто вставкой статической ссылки cool

        Ответить3.3 года назад #
      • Alex @

        Потерстировал код, заметил, что по каком-то причинам, названия постов выводятся верно, а вот урлы автоматически подставляются того поста, в котором находишься в данный момент. В чем может быть причина ?

        Ответить3.3 года назад #
        • Kama4697

          А, ой, "запятая не в том месте оказалась" smile Замените the_permalink( $pst->ID ); на echo get_permalink( $pst->ID );.

          Ответить3.3 года назад #
          • Alex @

            Спасибо большое. Теперь все работает как надо good

            Ответить3.3 года назад #
  • Юрий

    <?php if (have_posts()) : ?>
    Что есть двоеточие в этом куске? Что вообще делает этот кусок кода?

    Ответить1.9 года назад #
    • artikus73 cайт: wpruse.ru

      Проверяет на наличие постов, если есть посты то срабатывает цикл. А дветочие это такая форма записи условий

      Ответить1.9 года назад #
  • Макс

    Подскажите пожалуйста, а как этот блок с вордпресса можно вывести на МодХ ? Устал постоянно руками подбивать новые посты. Спасибо.

    P.S. МодХ лежит в папке и выполняет свои функции на сайте.

    Ответить1.3 года назад #
    • Егор

      Попробуй вывести этот блок на какой-нибудь странице на сайте, а в modx выведи уже через iframe

      Ответить1.3 года назад #
  • Наталья

    здравствуйте. Подскажите, пожалуйста, по какой причине have_posts() может "перестать видеть" посты автора на архивной странице сайта при условии, что: а) ранее они отлично отображались; б) изменения в код шаблона темы не вносились; в) на других страницах, к примеру, в админ-панели, посты авторов без проблем отображаются (хотя там они не по имени, а по id автора ищутся). Интересует именно возможная причина (проблема).

    Ответитьгод назад #
    • Наталья

      Источник проблемы нашла - новая версия плагина Gmedia Gallery вносила изменения в архивные страницы авторов, заменяя вывод постов автора выводом галерей данного автора. Подход, конечно, некорректный и отменяется снятием галки в предустановленных настройках. Осталось разобраться, как этот оболтус данный финт обеспечивал. Как можно целенаправленно сделать подобную замену, какой функцией?

      Ответитьгод назад #

Здравствуйте, !

Ваш комментарий