Циклы wordpress

циклы 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(), её очень удобно использовать для вывода записей по самым разным критериям.

Добавить комментарий

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