Тема для WordPress – цикл

Цикл в WordPress

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

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

Вот, как выглядит типичный цикл:

<?php if (have_posts()) : ?>//Если соответствующие записи найдены:
<?php while (have_posts()) : the_post(); ?>//для каждой записи
<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>//отобразить заголовок,
<?php the_content(); ?>//отобразить содержимое
<?php endwhile; ?>//и остановиться, когда записи закончатся.
<?php else : ?>//в противном случае…
<?php endif; ?>//Цикл завершен.

Дополнительные параметры записи, такие, как дата создания, автор, рубрика, метки и комментарии могут быть вставлены в каждый файл произвольно.
Так или иначе, мы получаем одинаковый код в нескольких файлах, а вынеся его в отдельный файл можно существенно уменьшить размер темы оформления – Slaff предложил способ, как это сделать, а мы разберем и дополним его:

Начнём с кода файла index.php, выдернутого наугад из первой попавшейся темы:

<?php get_header(); ?>
<div id=”wrapper”>
<div id=”content”>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div class=”post” id=”post-<?php the_ID(); ?>”>
<div class=”post_title”>
<div class=”time”><?php the_time(‘F jS, Y’) ?></div>
<h2><a href=”<?php the_permalink() ?>” rel=”bookmark” title=”Ссылка на запись <?php the_title(); ?>”><?php the_title(); ?></a></h2>
<div class=”author”>Написано <?php the_author() ?> в рубрике <?php the_category(‘, ‘) ?> </div>
</div>
<div class=”entry”>
<?php the_content(‘Читать всю статью &raquo;’); ?>
</div>
<p class=”postmetadata”><?php edit_post_link(‘Правка’,”,’ <strong>|</strong>’); ?>  <?php comments_popup_link(); ?></p>
</div>
<?php endwhile; ?>
<div class=”navigation”>
<div class=”alignleft”><?php next_posts_link(‘&laquo; Раньше’) ?></div>
<div class=”alignright”><?php previous_posts_link(‘Позже &raquo;’) ?></div>
</div>
<?php else : ?>
<h2 class=”center”>Не найдено</h2>
<p class=”center”>Извините, того, что Вы ищете, здесь нет.</p>
<?php include (TEMPLATEPATH . “/searchform.php”); ?>
<?php endif; ?>
</div>
<?php get_sidebar(); ?>
</div>
<?php get_footer(); ?>

Попробуем разделить код на два файла, в index.php подключим theloop.php, а в него вынесем цикл:

index.php

<?php get_header(); ?>
<div id=”wrapper”>
<div id=”content”>
<?php include (TEMPLATEPATH . ‘/theloop.php’); ?>  //подключаем файл theloop.php из темы
</div>
<?php get_sidebar(); ?>
</div>
<?php get_footer(); ?>

theloop.php

<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div class=”post” id=”post-<?php the_ID(); ?>”>
<div class=”post_title”>
<div class=”time”><?php the_time(‘F jS, Y’) ?></div>
<h2><a href=”<?php the_permalink() ?>” rel=”bookmark” title=”Ссылка на запись <?php the_title(); ?>”><?php the_title(); ?></a></h2>
<div class=”author”>Написано <?php the_author() ?> в рубрике <?php the_category(‘, ‘) ?> </div>
</div>
<div class=”entry”>
<?php the_content(‘Читать всю статью &raquo;’); ?>
</div>
<p class=”postmetadata”><?php edit_post_link(‘Правка’,”,’ <strong>|</strong>’); ?>  <?php comments_popup_link(); ?></p>
</div>
<?php endwhile; ?>
<div class=”navigation”>
<div class=”alignleft”><?php next_posts_link(‘&laquo; Раньше’) ?></div>
<div class=”alignright”><?php previous_posts_link(‘Позже &raquo;’) ?></div>
</div>
<?php else : ?>
<h2 class=”center”>Не найдено</h2>
<p class=”center”>Извините, того, что Вы ищете, здесь нет.</p>
<?php include (TEMPLATEPATH . “/searchform.php”); ?>
<?php endif; ?>

Ничего не поменялось?

Этот же файл theloop.php можно подключить в single.php, archive.php, page.php, author.php и прочие использующие цикл вывода элементы темы, а это уже экономия размера файлов за счёт обобщения кода.

А как быть, если шаблоны вывода, к примеру single.php и author.php, должны быть разные?

Воспользоваться условными операторами отбора в WordPress:

is_home();
is_front_page();
is_sticky();
is_singular();
is_single();
is_page();
is_attachment();

is_paged();
is_search();
is_404();
is_archive();
is_category();
is_tag();
is_author();
is_time();
is_date();
is_month();
is_year();
//Главная страница блога;
//Главная страница сайта*;
//”Прилепленная” запись;
//Отдельная публикация(обобщенный вывод);**
//Отдельная запись;
//Отдельная страница;
//Вложение в публикацию;
//Страница многостраничной публикации;***
//Страница результатов поиска на сайте;
//Страница 404-й ошибки (“не найдено”);
//Отбор записей(обобщенный вывод);**
//Отбор записей одной рубрики;
//Отбор записей по метке;
//Отбор записей одного автора;
//Отбор записей по времени публикации;
//Отбор записей по дате;
//Отбор записей по месяцу;
//Отбор записей по году;

* – Сайту и блогу на сайте можно назначить разные главные страницы в настройках WordPress. Если они совпадают – я пользуюсь оператором is_home();

** – Обобщенный вывод включает в себя все нижеследующие операторы, выделенные в таблице тем же цветом;

*** – Фрагмент публикации, которая разбивается постранично WordPress-тегом <!–nextpage–>, а не является отдельной страницей сайта.

Что с этим добром делать дальше?

Разберем на примере is_singular():

<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div class=”post” id=”post-<?php the_ID(); ?>”>
<div class=”post_title”>
<?php if (is_singular()) { ?>
<h1><a href=”<?php the_permalink() ?>” rel=”bookmark” title=”Ссылка на запись <?php the_title(); ?>”><?php the_title(); ?></a></h1>
<?php } else { ?>
<div class=”time”><?php the_time(‘F jS, Y’) ?></div>
<h2><a href=”<?php the_permalink() ?>” rel=”bookmark” title=”Ссылка на запись <?php the_title(); ?>”><?php the_title(); ?></a></h2>
<?php } ?>
<div class=”author”>Написано <?php the_author() ?> в рубрике <?php the_category(‘, ‘) ?> </div>

Теперь при выводе отдельной публикации заголовок будет оформлен тегом первого уровня, а в остальных случаях – второго уровня. Говорят, для СЕО такой вариант лучше. Кроме того, вывод даты создания будет только в архивных страницах, результатах поиска и на главной странице сайта.

Таким же образом помещаете весь желаемый код из файлов вывода в theloop.php, в сами файлы копируете код из index.php, если захотите – то и вовсе удалите их. А дальше – возвращаетесь к циклу и напильничком его, напильничком.

Читайте в этой серии: