Здравствуй, дорогой читатель!
Сегодня хочу продолжить пополнять копилку разработчика WordPress и познакомлю Вас с четырьмя способами задания главного цикла WordPress, получил он название в народе loop. Циклом называется, потому что это запрос к базе данных на наличе постов/записей в определенной таблице и если они есть то с помощью цикла while
происходит перебор всех записей и отображение каждой из них на блоге с помощью специальных тегов WordPress.
Для начала следует понимать, что loop — это основа, так сказать сердце любой темы и важно корректно его использовать.
Loop, который WordPress использует по умолчанию Вы можете найти в файле index.php cтандартной темы (на данный момент twentytwelve) начинается он обычно строками if(have_posts())
и содержит в себе всю разметку записи или списка записей. Как это ни странно но стандартный цикл прекрасно работает для большинства «одноцикловых» тем, но когда требуется создавать более сложные шаблонные конструкции, использующие для вывода информации несколько циклов или для вывода произвольных типов записей, то в таких случаях использовать стандартный цикл не получится. К счастью разработчики позаботились об этой проблеме и есть 4 способа задать цикл WordPress:
- Стандартный цикл
- Цикл c query_posts()
- Цикл c WP_Query()
- Цикл c get_posts()
Каждый из приведенных циклов выполняет по сути одну и ту же задачу: выводит записи или список записей, удовлетворяющих определенным заданным параметрам. Давайте подробно рассмотрим каким образом использовать цикл в создании темы.
Стандартный цикл
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div <?php post_class(); ?> id="post-<?php the_ID(); ?>">
<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
<?php the_content(); ?>
</div>
<?php endwhile; ?>
<div class="navigation">
<div class="next-posts"><?php next_posts_link(); ?></div>
<div class="prev-posts"><?php previous_posts_link(); ?></div>
</div>
<?php else : ?>
<div <?php post_class(); ?> id="post-0">
<h1>Ничего не найдено</h1>
</div>
<?php endif; ?>
Стандартный цикл включает в себя условие (if
) и перебор (while
). Условие на наличие постов, если постов нет то выводится контейнер с сообщением, что записей нет, а если записи есть то с помощью перебора отображается контент записи. Контент записи выводится стандартными тегами WordPress: the_title
, the_content
, the_excerpt
, the_permalink
и так далее. Количество отображаемых записей на страницах блога/сайта можно указать в настройках панели управления в разделе «Чтение».
Цикл с query_posts()
Функция query_posts()
позволяет полностью изменить стандартный цикл, также с ее помощью можно установить только некоторые параметры для стандартного цикла.
<?php global $query_string; /* обязятельно объявлем!!! */
$posts = query_posts($query_string.'&posts_per_page=15&cat=-1,-2,-3'); /* исключаем отображение записей из трех категорий 1,2,3 и устанавливаем к-во отображаемых записей */ ?>
<?php /* Здесь пишем стандартный цикл */ ?>
<?php wp_reset_query(); /* обязятельно сбрасываем цикл */ ?>
У функции query_posts() есть много настраиваемых параметров, почитать о их применении можно в кодексе WordPress. Использовать этот тип задания цикла отлично подходит для задания параметров одного цикла, для задания нескольких циклов целесообразно использовать следующие функции.
Цикл с WP_Query()
Для лучшей функциональности и задания нескольких циклов рекомендуют использовать функцию WP_Query(). Она принимает такие же параметры как и query_posts(), но слегка отличается заданием цикла:
<?php $custom_query = new WP_Query('cat=-9'); /* исключаем категорию с айди 9 */
while($custom_query->have_posts()) : $custom_query->the_post(); ?>
<div <?php post_class(); ?> id="post-<?php the_ID(); ?>">
<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
<?php the_content(); ?>
</div>
<?php endwhile; ?>
<?php wp_reset_postdata(); // reset the query ?>
Для задания цикла с помощью функции WP_Query()
нам не нужна переменная query_string и для задания парметров цикла мы можем использовать теже параметры что и для query_posts(). Для того чтобы задать несколько циклов можете воспользоваться следующим шаблоном:
<?php // Цикл 1
$one_query = new WP_Query('cat=-1'); // исключаем категорию
while($first_query->have_posts()) : $one_query->the_post();
...
endwhile;
wp_reset_postdata();
// Цикл 2
$two_query = new WP_Query('cat=-2'); // исключаем категорию
while($second_query->have_posts()) : $two_query->the_post();
...
endwhile;
wp_reset_postdata();
// Цикл 3
$three_query = new WP_Query('cat=-3'); // исключаем категорию
while($third_query->have_posts()) : $three_query->the_post();
...
endwhile;
wp_reset_postdata();
?>
Каждый дополнительный цикл может быть размещены в любом месте шаблона вашей темы, причем не обязательно использовать их последовательно. Например, один цикл можете размещестить в сайдбаре, другой в шапке, третий в подвале и так далее. Как плюс каждому циклю можно задатьуникальную конфигурацию.
Использовать WP_Query() целесообразно для создания нескольких, индивидуальных циклов, с его помощью можно задать любое необходимое к-во циклов. Подробнее о функции WP_Query() в кодексе WordPress
Цикл с get_posts()
Использование функции get_posts()
самый простой и безопасный способ для задания нескольких циклов. В любом месте Вашей темы где Вы хотите задать цикл функция get_posts будет идеальным решением. Задается цикл с ее помощью, таким образом:
<?php
global $post; /* Обязательно */
$args = array('category' => -9); /* исключаем категорию с айди 9 /
$custom_posts = get_posts($args);
foreach($custom_posts as $post) : setup_postdata($post);
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php the_content(); ?>
endforeach;
wp_reset_postdata();
?>
Функция get_posts() требует массива параметров, кстати параметры к ней подходят от функций WP_query()
и query_posts()
, исключениями являются:
numberposts
вместо post_per_page
category
вместо cat
Подробнее о функции get_posts() читайте в кодексе WordPress
Подведем итоги
Как и обещалось мы раскрыли секреты задания и изменения цикла WordPress, напомню что когда используется:
- query_posts() — используется для изменения стандартного цикла
- WP_Query() — использется для изменения цикла или для создания нескольких циклов
- get_posts() — используется для создания нескольких дополнительных циклов
Спасибо за внимание, буду признателен за комментарии и распространении ссылки на статью в социальных сетях!