Особенности циклов WordPress

Дата публикации:Август 9, 2010

Циклы (loops) являются сердцем WordPress — они содержатся в любом файле шаблона используемой темы. Без циклов тема потеряла бы большинство своих функциональных возможностей.

Некоторые теги шаблона работают только в пределах цикла, что вы увидите в дальнейшем, при разборе примеров.

Основной цикл (Loop) WordPress

Если вы желаете создавать качественные, многофункциональные сайты на основе WordPress, то просто обязаны понимать структуру и применение циклов. Остановимся на рассмотрении базового цикла, поскольку он представляется наиболее легким для понимания. Начинается он командой:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>  

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

<?php endwhile; else: ?>
    <p>Some error message or similar.</p>
<?php endif; ?>

Фактически, часть, отвечающая за вывод сообщения об ошибке, может быть опущена, поскольку обработка ошибочных результатов имеется практически во всех файлах шаблона.

В файле index.php большинства тем присутствует следующий цикл (или похожий на него), отвечающий за вывод содержимого записи:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <h2><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); 
?></a></h2>
        <?php the_content(); ?>
        <?php get_comments(); ?>
     </div>
<?php endwhile; else: ?>
     <div class="post">
        <h2>Error!</h2>
        <p>Something went wrong! Please try again.</p>
     </div>
<?php endif; ?>

Основной цикл проверяет, существуют ли записи для отображения на экране; если таковые существуют, он выводит их на экран в соответствии с некоторыми основными настройками блога (количество записей для вывода и т.д.). Также в цикле ведется проверка, на какой из страниц пользователь в данный момент находится. Если пользователь выбрал отдельную запись, то она будет представлена в соответствии со всеми имеющимися настройками и стилевым оформлением. То же самое относится и к списку рубрик, и к любым другим имеющимся элементам блога.

Цикл while будет работать до тех пор, пока не выведет все отвечающие поставленным требованиям записи. Если таковых записей не осталось, цикл заканчивается конструкцией endwhile. Базовый цикл заканчивается конструкцией endif.

Если записей, подходящих под критерии, не существует, цикл переходит на ветвь else, в которой обычно выводится сообщение об ошибке. После вывода сообщения цикл заканчивает свою работу.

Таким образом, циклы берут информацию из базы данных WordPress, опираясь на имеющиеся настройки блога и определенные критерии, и влияют на отображение страницы.

Несколько слов о WP_Query

WP_Query является основой всех существующих в WordPress циклов. Этот класс, подчас незримый для обычного пользователя, участвует в обработке любого цикла. Отыскать его можно в файле wp-includes/query.php. Подробное объяснение всех методов и свойств WP_Query можно получить на странице кодекса: codex.wordpress.org/Function_Reference/WP_Query, здесь же мы кратко попробуем остановиться на его основных особенностях.

Основной цикл WordPress базируется на WP_Query, или, если быть более точным, он использует заданный по умолчанию объект $wp_query. Если в файле темы встречаются, к примеру, теги have_posts () и the_post (), то на самом деле они опираются на $wp_query -> have_posts() и $wp_query -> the_post() соответственно. В случае создания своих собственных запросов, не имеющих стандартных аналогов в WP_Query, вам придется создать отдельный объект. Пример:

<?php $brand_new_query = new WP_Query(); ?>

Вместо стандартного $wp_query мы загружаем новый объект $brand_new_query, позволяющий нам проводить необходимые действия за пределами основного цикла.

Шаблоны и условные теги, а также большинство других элементов WordPress в своей работе используют класс WP_Query. Этот класс, естественно, можно редактировать и подстраивать под себя, добиваясь какого-либо необычного результата взаимодействия, однако данной возможностью пользуются лишь профессионалы.

Поделиться

5 комментариев

  1. andrew says:

    Опишите подробнее цикл while ( have_posts() ) : the_post();
    То, что have_post() проверяет наличие постов — понятно, но видимо the_post() эти посты как-то «прячет» от have_posts()? Ведь при каждой новой итерации количество постов должно уменьшаться на 1?

    Например так понятно:
    while i < 5 : c = a+b; i = i+1;

    • Дмитрий Алёшин says:

      «Пока имеются записи, получаем запись», если расшифровывать обычным языком. Have_posts() проверяет наличие записей — это условный тег. Если говорить простым языком на примерах, то происходит запрос к базе данных, откуда и приходит ответ в виде списка записей.

  2. andrew says:

    Цикл while в PHP выглядит так:
    <?php
    $x=0;
    while ($x

    Вопрос:
    have_posts() — это условие?
    the_post() и последую щий код — тело цикла?
    Зачем двоеточие перед the_post()?

  3. andrew says:

    Пример кода почему-то обрезался..

    while (логическое_выражение):
    инструкция;

    endwhile;

  4. andrew says:

    С двоеточием разобрался. Простите за тупые вопросы.

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

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

Предыдущая запись:

Следующая запись: