WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Что такое Цикл WordPress — The Loop

Начну с того, что говорить «цикл loop» — это неправильно. Это тоже самое, что сказать, - «цикл цикл», т.е. loop = цикл = повторяющееся действие. Правильно говорить просто «Цикл WordPress». Далее в тексте «Цикл WordPress» — тоже самое, что «loop», «the loop» или «цикл the loop WordPress».

Цикл WordPress (The Loop) — это перебор записей (постов) и вывод какой-либо информации о каждом посте. Цикл получает массив записей (объектов), перебирает этот массив и во время перебора выводит информацию о каждом посте. При этом в цикле используются специально созданные для него функции (теги шаблона): the_title(), the_permalink(), the_date() и т.д.

Когда говорится «Функция используется внутри Цикла WordPress» — это значит, что функцию можно использовать внутри цикла, при этом нет необходимости передавать ей параметры (указывать ей с какой записью работать).

Например, the_title() вызывается без параметров, но при этом функция будет выводить заголовок ткущей записи в цикле. Такие функции (работающие с Циклом), работают с глобальной переменной $post. Из этой переменной они берут данные для вывода.

Цикл в WordPress выглядит так:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
	<!-- Цикл WordPress -->
	<p>Выводим данные записи. Здесь работают функции для цикла, например, the_title() </p>
	<h2><?php the_title() ?></h2> 
<?php endwhile; else : ?>
	<p>Записей нет.</p>
<?php endif; ?>

Или можно записать так:

<?php if ( have_posts() ) { while ( have_posts() ) { the_post(); ?>
	<!-- Цикл WordPress -->
	<!-- Вывод постов: the_title() и т.д. -->
<?php } } else { ?>
	<p>Записей нет.</p>
<?php } ?>

Еще можно записать так (часть «Записей нет» в этом случае можно удалить):

<?php while ( have_posts() ){ the_post(); ?>
	<!-- Цикл WordPress -->
	<!-- Вывод постов: the_title() и т.д. -->
<?php } ?>
<?php if ( ! have_posts() ){ ?>
	<p>Записей нет.</p>
<?php } ?>

Вся информация о записи (посте) хранится в глобальной переменной $post. Предположим, что цикл обрабатывает массив содержащий в себе данные 10 постов, тогда у цикла будет 10 повторений и переменная $post будет меняться 10 раз, и при каждом повторении с переменной $post будет считываться информация о посте и выводится на экран, через теги шаблона: the_title(), the_content()... Таким образом, любой PHP/HTML код помещенный в цикл WordPress будет повторятся пока работает цикл: 10 итераций цикла - 10 повторений.

Типичный пример Цикла — это вывод постов на странице категорий, меток, на главной странице WordPress.

Полный пример цикла

Приведу пример цикла WordPress, со встроенными в код комментариями (внутри <!-- -->)

<!-- Проверка наличия записей в цикле -->
<?php if ( have_posts() ) : ?>

	<!-- Начало цикла -->
	<?php while ( have_posts() ) : the_post(); ?>
		<!-- Цикл WordPress -->
		<!-- Здесь уже определилась переменная $post, -->
		<!-- на основе которой будет строится дальнейший код. -->
		<!-- $post будет меняться для каждого поста while( have_posts() ). -->
		<!-- $post нужна, чтобы работали теги шаблона: in_category('3'), the_permalink() и т.д. -->

		<!-- Проверка находится ли этот пост в категории 3. -->
		<!-- Если да, то задаем CSS класс div-у class="post-cat-three". -->
		<!-- Если нет, то класс будет post class="post". -->
		<?php if ( in_category('3') ) { ?>
				  <div class="post-cat-three">
		<?php } else { ?>
				  <div class="post">
		<?php } ?>

		<!-- Выводим заголовок поста, как ссылку на сам пост. -->
		<h2><a href="<?php the_permalink() ?>" title="Ссылка на: <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>

		<!-- Выводим дату поста и ссылку на другие записи автора. -->
		<small><?php the_time('F jS, Y') ?> Автор: <?php the_author_posts_link() ?></small>

		<!-- Выводим текст поста в теге div. -->
		<div class="entry">
		   <?php the_content(); ?>
		</div>

		<!-- Выводим категории поста, через запятую. -->
		<p class="postmetadata">Расположено в <?php the_category(', '); ?></p>
		</div> <!-- закрываем основной тег div -->

		<!-- Отсюда цикл начинает повторятся, если есть еще посты -->
		<!-- Останавливаем цикл (endwhile), -->
	<?php endwhile; ?> 
	<!-- Полное окончание цикла. -->

<!-- Если записей в цикле нет — цикл не сработал (else) -->
<?php else: ?>

	<p>Нет постов в цикле.</p>

<?php endif; ?>

Другие варианты цикла

Примеры цикла выше, где используется have_posts(), получают данные для перебора из глобальной переменной $wp_query в которую WP автоматически добавляет данные в соответствии с тем, на какой странице мы сейчас находимся, например, на главной странице или странице рубрик, данные будут разные.

Но, получить данные и затем их обработать в цикле мы можем самостоятельно.

Цикл с использованием get_posts():

<?php
global $post;

$myposts = get_posts( 'numberposts=5&offset=1&category=1' );

foreach( $myposts as $post ){
	setup_postdata( $post );
	?>
	<!-- 
	здесь формирование вывода постов,
	где работают теги шаблона относящиеся к the loop, например, the_title()
	-->
	<?php 
}
wp_reset_postdata();
?>

Цикл с использованием wp_query():

// задаем нужные нам критерии выборки данных из БД
$query = new WP_Query( [
	'posts_per_page' => 5,
	'orderby'        => 'comment_count'
] );

// Цикл
global $post;

if ( $query->have_posts() ) {
	while ( $query->have_posts() ) {
		$query->the_post();
		<?php the_title() ?>
	}
} else {
	// Постов не найдено
}

wp_reset_postdata(); // Сбрасываем $post. Возвращаем оригинальные данные

Зачем нужно понимать внутри Цикла мы или нет?

Отличать где используется Цикл WordPress, а где код находится за пределами цикла нужно, потому что в WordPress есть определенные теги шаблона, которые не работают за пределами цикла, например: the_title(), the_content(), the_excerpt() и т.д. Для того, чтобы каждая такой тег шаблона сработал, должна быть определена переменная $post, которая за пределами цикла WordPress неизвестна (точнее не корректна, если цикл запускался, то $post известна — она содержит данные последнего, обработанного в цикле поста, но это уже другая тема).

37 комментов
Полезные 1 Вопросы 2 Все
  • Allpa allpa.ru

    Йомайо... о.О
    Наконец-то я начинаю хоть что-то понимать в том, как работают программные коды WordPress!
    Спасибо!
    Нет, о Вашем блоге должен узнать каждый блоговод, это однозначно smile
    Иду пиарить в Тви. Пока в Тви. У себя чуть позже.

    1
    Ответить20.Июл.2010 в 18:25 #
  • Александр-HIMиk www.alexzdesign.ru

    Отличный пост. К нему можно спокойно новичков отсылать.

    Ответить22.Июл.2010 в 10:31 #
    • Kama7644

      Спасибо!
      Для новичков и писал. Делился, так сказать, своими скромными знаниями smile

      1
      Ответить22.Июл.2010 в 10:59 #
      • AzzePis wordpress.co.ua

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

        Ответить23.Июл.2010 в 15:38 #
        • Kama7644

          кстати, а что за форма комментов используэться? может плагин какой-то?

          Нет, это не плагин smile В форме комментов используется jquery-comment-preview (плагин Dimox'a), правда я и его поковырял немного. А в остальном, плоды моих трудов smile

          1
          Ответить24.Июл.2010 в 03:09 #
  • AzzePis wordpress.co.ua

    Мне очень понравилось просто. Не хочешь оформить как плагин? я думаю, многие были бы блаодарны

    Ответить25.Июл.2010 в 12:00 #
    • Kama7644

      Не хочешь оформить как плагин?

      Думаю, нет. Не совсем представляю такую форму в виде плагина.

      1
      Ответить25.Июл.2010 в 12:12 #
  • Ksana prodengiblog.ru

    Kama, спасибо, отличная статья.
    Хоть я это уже и так понимала на уровне интуиции, но ты так хорошо объяснил, что теперь буду понимать осознанно.
    Кстати, не мог бы ты поделиться скриптом формы для комментариев - очень понравилась.

    Ответить03.Авг.2010 в 12:51 #
    • Kama7644

      Кстати, не мог бы ты поделиться скриптом формы для комментариев - очень понравилась.

      Форма комментирования - часть шаблона. Поделится не получится, потому что это не один, не два и даже не три файла.

      Ответить03.Авг.2010 в 15:53 #
  • Саша

    может быть мой вопрос не совсем в эту тему, но всё же: в

    sidebar.php

    я вызываю архив вот таким вот образом

    <?php wp_get_archives('type=monthly'); ?>

    а как мне вызвать категории и теги ?

    вот вроде нашёл у Вас

    <?php the_category(', '); ?></p>

    но пока только одна категория, а как все? А теги?

    Ответить14.Окт.2011 в 10:04 #
  • Саша

    ура! я нашёл

    <?php wp_list_categories( $args ); ?>

    грамотно всё у Вас разжёвано тут. Многое становиться понятно. Вот нашёл и для тегов необходимую строчку

    <?php wp_tag_cloud('smallest=15&largest=40&number=50&orderby=count'); ?>
    Ответить14.Окт.2011 в 11:04 #
  • Allpa allpa.ru

    Короче, так) Нашла я мануал на тему: как создать свой виджет так, чтобы в него можно было воткнуть ПХП-код (сцыль: cyber-promo.ru/archives/1849). Всё вроде бы просто и понятно, да только предлагаемый юзером код, будучи вставленным в function.php, приводит к падению админки.
    В том шаблоне, который я сейчас ковыряю, function.php начинается с

    <?php

    и заканчивается

    ?>

    это и есть цикл the loop, верно? Все твои функции вставляются между.
    А вот с той функцией что по ссылке я не справилась. Я было решила, что надо просто удалить входящие в неё

    <?php и ?>

    но блог всё равно падает.
    Тут какая-то хитрость, но я не понимаю.. э?.. dash3 (нужен смайлик, где юзер бьёт себя по лбу, изображая дурака, — это как раз про меня).

    -1
    Ответить04.Ноя.2011 в 21:43 #