циклы WordPress бывают двух видов:
Основной цикл (про который мы и будем говорить в этом уроке).
Дополнительные циклы.
Основной цикл
Сам знает, какой контент выводить на странице, на которой используется. Не имеет параметров.
Может быть только один на странице.
Пример:
if ( have_posts() ) : // если есть посты
while ( have_posts() ) : the_post(); // то инициализируем каждый пост по порядку
// выполняем код для каждого конкретного поста
the_title( '<h2>', '</h2>' ); // например выводим заголовок
endwhile;
else:
echo 'В этой категории нет записей, вероятно.';
endif;
Как изменить количество записей в основном цикле WordPress?
Если вы перейдёте на страницу блога или в категорию, то можете заметить, что WordPress разделяет записи по страницам, причём это могут быть именно отдельные страницы с постраничной навигацией, либо подгрузка новых страниц при скролле. Потому что, если у вас сразу будут загружаться все существующие посты (а их могут быть сотни и тысячи), то браузер просто зависнет.
Способ 1. В настройках чтения
Если мы говорим о страницах архивов (рубрики, метки, поиск, архивы автора и т.д), то количество отображаемых за раз постов зависит от того, сколько их указано в Настройки > Чтение.
Способ 2. При помощи pre_get_posts
Кроме того, мы можем модифицировать это значение при помощи хука pre_get_posts
add_action( 'pre_get_posts', 'true_modify_posts_per_page', 25 );
function true_modify_posts_per_page( $query ) {
$query->set( 'posts_per_page', 5 ); // отображает 5 записей на странице
// но мы можем изменять и многие другие параметры основного цикла
}
Только обратите внимание, что действие хука pre_get_posts распространяется на все существующие циклы, в том числе и на дополнительные, поэтому вам может понадобиться условие $query->is_main_query() или условные теги.
Как стилизовать один пост по-другому
Иногда бывает нужно, чтобы в цикле постов – один или несколько из них выводились в другом стиле. Это также заметно и на примере темы, которую мы используем – в ней первая запись в блоге больше, чем остальные. Это можно сделать при помощи обычной переменной-счётчика и функции get_template_part().
$i = 0;
while( have_posts() ) { the_post();
$i++;
if( 1 === $i ) {
// если первая запись, то подключаем файл entry-featured.php
get_template_part( 'entry', 'featured' );
} else {
// иначе подключаем обычный entry.php
get_template_part( 'entry' );
}
}
Дополнительные циклы
В функции вывода этих циклов требуется передавать дополнительные параметры, иначе они не знают, какие посты выводить.
Может быть сколько угодно на странице.
Дополнительные циклы – это когда на какой-то определённой странице, помимо её основного контента, мы выводим посты каким-то ещё образом.
Примеры таких блоков.
Первое – это блок с похожими запиcями в WordPress.
Второе – свежие посты в сайдбаре темы.
Третье – блок сотрудников компании.
Четвёртое – блок брендов товаров.
Могут быть и другие блоки – всё зависит от дизайна.
Цикл на основе get_posts()
Самый удобный вариант выводить нужные записи в нужном порядке — это выводить их с помощью get_posts(). get_posts() чаще всего подходит лучше под вашу задачу, например:
нужно вывести 10 последних постов в сайдбаре.
нужно вывести 10 случайных записей в подвале.
нужно вывести все картинки прикрепленные к посту.
нужно вывести записи с определенным произвольным полем.
get_posts() так же как и query_posts() работает на основе класса WP_Query() и поэтому передаваемые параметры одинаковые.
Важной особенностью этой функции является то, что она форсированно устанавливает параметры:
suppress_filters=true (можно изменить)
posts_per_page=5 (можно изменить)
ignore_sticky_posts=true (нельзя изменить)
no_found_rows=true (нельзя изменить)
Последние два параметра значительно ускоряют запрос. Чем больше постов на сайте, тем больше будет разница в скорости работы функции get_posts() и WP_Query.
Пример цикла на основе get_posts().
Выведем 5 записей из рубрики 9:
<?php
global $post; // не обязательно
// 5 записей из рубрики 9
$myposts = get_posts( array(
'category' => 9
) );
foreach( $myposts as $post ){
setup_postdata( $post );
// стандартный вывод записей
}
wp_reset_postdata(); // сбрасываем переменную $post
?>
Код выведет именно 5 записей, хотя в аргументах мы указали только номер рубрики. Вызвано это тем, что у функции get_posts() есть параметры по умолчанию (см. описание), о которых нужно помнить. Например, если нам нужно вывести все записи из рубрики 9, то мы должны добавить еще параметр ‘nopaging’ => 1 или ‘posts_per_page’ => -1 (разницы нет).
Когда использовать get_posts()
Всегда, когда нужно просто вывести записи из БД в любом месте шаблона.
Когда нужно создать несколько циклов.
Когда не нужно знать сколько всего записей подходят под выборку.
Так как get_posts() принимает те же параметры что и query_posts(), её очень удобно использовать для вывода записей по самым разным критериям.