Цикл по категориям wordpress

Цикл по категориям wordpress thumbnail
3 способа построения циклов в WordPress

Статья для новичков и тех, кто уже немного знаком с WordPress, которая должна развенчать все мифы использования разных вариантов циклов в WordPress.

О Цикле WordPress и с чем его едят я уже писал и вскользь упоминал о разных вариантах циклов в описаниях функций. В этой статье я сделаю следующий шаг и расскажу о 3-х вариантах построения циклов для вывода записей и о плюсах и минусах каждого из них.

Правильное использование нескольких циклов на странице даст вам возможность выводить блоки с нужными записями, сортировать их в нужном порядке и при этом не переживать о нарушении логической структуры страницы и «ловле» различных багов.

Возможные варианты построения циклов вывода записей:

  1. Стандартный цикл и цикл на основе query_posts().
  2. Дополнительный цикл на основе WP_Query().
  3. Дополнительный цикл на основе get_posts().

Каждый из этих вариантов удобно использовать в разных ситуациях. Для использования каждого варианта не нужно изучать разный мануал, потому что все они работают с одинаковыми параметрами, нужно лишь понять как и где их использовать.

Для лучшего понимания и визуального восприятия работы функций запроса, изучите эту схему:

Как работают функции запросов в WordPress

1) Стандартный Цикл и цикл на основе query_posts()

Я объединил 2 вида циклов (с query_posts() и начинающийся с if( have_posts() ), потому что технически они абсолютно одинаковые.

Давайте вспомним, как выглядит стандартный Цикл WordPress:

<?php // проверяем есть ли посты в глобальном запросе – переменная $wp_query if( have_posts() ){ // перебираем все имеющиеся посты и выводим их while( have_posts() ){ the_post(); ?> <div <?php post_class(); ?> id=”post-<?php the_ID(); ?>”> <h1><a href=”<?php the_perma(); ?>”><?php the_title(); ?></a></h1> <?php the_content(); ?> </div> <?php } ?> <div class=”igation”> <div class=”next-posts”><?php next_posts_(); ?></div> <div class=”prev-posts”><?php previous_posts_(); ?></div> </div> <?php } // постов нет else { echo “<h2>Записей нет.</h2>”; }

Такой код мы можем встретить в файлах index.php, .php и т.д. Эти файлы отвечают за вывод на странице списка записей. Этот цикл перебирает по очереди посты, которые выводятся на странице и во время перебора, используя Теги Шаблона (предназначенные для использования внутри Цикла), мы можем вывести различные данные поста (заголовок, текст, метаданные и т.д.).

Обратите внимание: в стандартном Цикле мы не указываем никаких данных для выборки записей, а сразу начинаем цикл с if( have_posts() ){ while( have_posts() ){… Это говорит о том, что данные уже существуют и их нужно просто обработать и вывести на экран.

«Уже существующие» данные находятся в глобальной переменной $wp_query и для каждого типа страниц WordPress определяются автоматически, т.е. WordPress заранее делает запрос в БД, на основе того какая страница сейчас отображается (категория, метка, статья, постоянная страница и т.д.) и результат запроса записывается в $wp_query, а затем мы используем эти данные для создания цикла. Интересно, что такой запрос делается функцией query_posts(), которую мы разберем ниже.

Обычный Цикл WordPress используется для базовых страниц WP (категории, метки, архивы по дате).

Цикл на основе query_posts()

query_posts() позволяет изменить базовый запрос и вывести нужный нам вариант записей.

Вариант 1

Мы можем изменить базовый запрос (сделать еще один запрос и перезаписать данные предыдущего запроса) и, например, вырезать ненужные категории из вывода или изменить количество выводимых записей, порядок сортировки и т.д.

<?php global $query_string; // параметры базового запроса // базовый запрос + свои параметры query_posts( $query_string .’&cat=-6,-9&order=ASC&posts_per_page=20′ ); [СТАНДАРТНЫЙ ЦИКЛ WORDPRESS] wp_reset_query(); // сброс запроса ?>

В этом примере мы создали новый запрос к БД, в котором использовали параметры базового запроса + свои параметры: исключили категории 6 и 9 (cat=-6,-9), а также отсортировали записи по порядку (order=ASC) и вывели 20 записей на странице вместо, установленных в настройках 10 (posts_per_page=20).

Полный список параметров, которыми можно сформировать нужный нам вывод, смотрите в описании функции query_posts().

Преимущества такого изменения в том, что если мы, например, изменим количество выводимых записей на странице с 10 (по умолчанию) на 20, то пагинация на странице автоматически подстроится под это изменение, потому что query_post() меняет данные глобальной переменной $wp_query, а пагинация строится именно на основе этих данных. Это лишь один из примеров, показывающий что query_posts() и поведение других функций на странице взаимосвязаны.

Но все же, изменять базовый запрос WP рекомендуется через фильтр pre_get_posts, а не через query_posts().

Вариант 2

Можно не использовать параметры базового запроса ($query_string), а полностью переписать базовый запрос:

query_posts( ‘cat=-6,-9&order=ASC’ );

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

Необходимость wp_reset_query()

Сбрасывать измененный запрос при использовании query_posts() нужно, потому что query_posts() переписывает глобальную переменную $wp_query которая отвечает за некоторые свойства страницы. Давайте посмотрим на примере.

Предположим нам на странице категории 6 (ID категории), нужно вывести данные только поста 9 (ID поста):

<?php query_posts( ‘p=9’ ); if( have_posts() ){ while( have_posts() ){ the_post(); the_title(); the_content(); } } else { echo ‘Записей нет’; } ?>

В этом примере мы не сбросили запрос и функция query_posts() переписала глобальную переменную $wp_query. Теперь, кода мы проверим какая это страница (а это страница категории: is_() == true), мы увидим, что это уже совсем не страница категории, а страница поста: is_() == true. Т.е. следующий код вернет нам «Это страница поста», хотя на самом деле это страница категории:

if( is_() ) echo ‘Это страница категории’; // не сработает if( is_() ) echo ‘Это страница поста’; // сработает

Ошибочка, которая может в последствии создать немало головной боли.

Когда использовать query_posts()?

Когда нужно немного изменить основной (базовый) запрос WordPress. В идеале: для исключения рубрики/метки (например, на главной странице); изменение направления сортировки; ограничения количества выводимых постов; исключения определенных постов из категории/метки и т.п. И напомню еще раз, для таких задач все же лучше использовать фильтр pre_get_posts.

Не нужно использовать query_posts() для создания нескольких циклов на одной странице, для вывода в сайдбар списка постов, для создания дополнительного вывода записей и т.п., для этих целей используйте циклы на основе get_posts(). К тому же, обе функции понимают параметры одинаково! Так зачем “платить” больше?..

2) Цикл на основе WP_Query()

Для вывода записей никак не связанных со страницей или создания множественных (дополнительных) циклов можно использовать циклы на основе класса WP_Query. Выглядят они аналогично циклам с использование query_posts(). Для WP_Query используются те же самые параметры, что и для query_posts().

Интересно, что WP_Query является ядром функций query_posts() и get_posts(), т.е. обе эти функции работают на основе этого класса.

Пример цикла: выведем все записи из категории 9:

<?php // указываем категорию 9 и выключаем разбиение на страницы (пагинацию) $query = new WP_Query( ‘cat=9&nopaging=1’ ); if( $query->have_posts() ){ while( $query->have_posts() ){ $query->the_post(); ?> <h2><a href=”<?php the_perma(); ?>”><?php the_title(); ?></a></h2> <?php the_content(); ?> <?php } wp_reset_postdata(); // сбрасываем переменную $post } else echo ‘Записей нет.’; ?>

Читайте также:  Космические и биологические циклы

Пример создания множественных циклов на основе WP_Query():

<?php // Цикл 1 $query1 = new WP_Query(‘cat=-1&nopaging=1’); // все посты, кроме категории 1 while( $query1->have_posts() ){ $query1->the_post(); // вывод записей } wp_reset_postdata(); // Цикл 2 $query2 = new WP_Query(‘cat=-2&nopaging=1’); // все посты, кроме категории 2 while( $query2->have_posts() ){ $query2->the_post(); // вывод записей } wp_reset_postdata(); // Цикл 3 $query3 = new WP_Query(‘cat=-3&nopaging=1’); // все посты, кроме категории 3 while( $query3->have_posts() ){ $query3->the_post(); // вывод записей } wp_reset_postdata(); ?>

Особенность циклов на WP_Query() в том, что мы создаем новый объект $query, который никак не связан с аналогичным глобальным объектом $wp_query и поэтому мы никак не нарушаем структуру текущей страницы.

Также, мы можем использовать новый объект в других целях, не только для вывода записей, но и для различного рода проверок: например, записи какого типа страницы используются в этом новом объекте; можем узнать общее количество записей удовлетворяющих запросу ($query->found_posts) и т.д. Такие данные могут пригодится при создании дополнительных запросов с пагинацией или где-то еще (пример в комментариях).

Зачем нужно использовать wp_reset_postdata()?

В глобальной переменной $post хранятся данные текущего поста (если показывается страница поста, то данные этого поста). Когда срабатывает часть кода $query->the_post(), то в переменную $post записываются данные текущего поста в цикле и в конце цикла в этой переменной остаются данные последнего поста из этого цикла, а нужно чтобы $post всегда содержала данные текущего поста страницы. Т.е. получается до использования цикла $post->ID (ID текущего поста) было равно, допустим, 10, а после срабатывания цикла, та же самая переменная $post->ID уже равна, допустим, 56 (ID последнего поста из цикле), а нужно чтобы она по-прежнему равнялась 10.

wp_reset_postdata() используется как раз для того, чтобы вернуть правильные данные в переменную $post.

Когда использовать WP_Query()?

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

3) Цикл на основе get_posts()

Самый удобный вариант выводить нужные записи в нужном порядке – это выводить их с помощью get_posts() (см. описание). get_posts() в 99% случаев полностью заменяет WP_Query(): нужно вывести 10 последних постов в сайдбаре или 10 случайных записей в подвале – пожалуйста; нужно вывести все картинки прикрепленные к посту или вывести записи с определенным произвольным полем – get_posts() прекрасно справится с этой задачей.

get_posts() так же как и query_posts() работает на основе класса WP_Query() и поэтому передаваемые параметры одинаковые (см. их здесь).

#1. Пример цикла на основе get_posts(). Выведем 5 записей из рубрики 9:

<?php global $post; // не обязательно // 5 записей из рубрики 9 $myposts = get_posts( array( ” => 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(), её очень удобно использовать для вывода записей по самым разным критериям.

Выводы

Где и какой из 3-х вариантов циклов использовать:

  • query_posts() – если нужно изменить/подправить стандартный вывод записей на страницах WordPress. Можно использовать 1 раз на странице;

  • get_posts() – если нужно вывести записи из Базы Данных. Можно использовать сколько угодно раз на странице;

  • WP_Query() – во всех других случаях когда не подошли query_posts() и get_posts(). Класс WP_Query() является ядром query_posts() и get_posts() и может быть использован для каких-либо сложных случаев вывода.

Помните, что параметры для всех вариантов одинаковые и описаны они на этом блоге.

Попробуйте уже сейчас заказать комментарии к посту в Инстаграм с привлекательными скидками на сайте doctorsmm. Здесь Вам будут предложены разнообразные форматы текстов на выбор, а также возможность самостоятельно выбрать любое подходящее предложение.

Источник

Languages: English • Loop 日本語 Русский • (Add your language)

Цикл используется в WordPress для отображения записей. Используя Цикл, WordPress обрабатывает каждую из этих записей для вывода на текущей странице и форматирует ее в соответствии с указанными критериями внутри Цикла. Любой HTML или PHP код, раположенный внутри Цикла, будет повторен для каждой записи.

Когда в документации WordPress говорится “Этот тэг используется внутри Цикла”, как для конкретных Тэгов Шаблона или плагинов, тэг будет повторен для каждой записи. Например, в Цикле, по умолчанию, для каждой записи выводится следующая информация:

  • Заголовок (the_title())
  • Время (the_())
  • Рубрики (the_())

Другую информацию о каждой записи можно отобразить с помощью соответствующих тэгов шаблона или (для продвинутых пользователей) с помощью введения переменной $post, которая содержит информацию текущей записи, пока Цикл выполняется.

Для первого знакомства с Циклом, читайте Цикл в Действии.

Использование Цикла

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

Убедитесь, что включили вызов заголовка Шаблона (er.php), в верхней части Шаблонов вашей Темы. Если вы используете Цикл внутри собственного дизайна (и ваш дизайн не является шаблоном), установите WP_USE_THEMES в значение false.

<?php define(‘WP_USE_THEMES’, false); get_er(); ?>

Цикл стартует здесь:

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

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

<?php endwhile; else: ?> <p><?php _e(‘Sorry, no posts matched your criteria.’); ?></p> <?php endif; ?>

Примеры Циклов

Стилизация Записей из различных Рубрик

Этот пример отображает каждую запись с заголовком (который используется в качестве Постоянной ссылки к записи), Рубриками и Содержимым. Это очень простой пример; вероятно ваши Шаблоны будут отображать больше информации, в таком случае стилизацию будет проще сделать с помощью CSS.

Для того чтобы извлечь больше пользы из этого примера, выделим записи из Рубрики с ID равным ‘3’. Для этого используется Тэг Шаблона in_().

Тэги <!– –> являются HTML-тэгами комментариев; если вы используете данный пример, эти тэги не будут отображаться в браузере. Они нужны только для комментирования кода.

<!– Start the Loop. –> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <!– Далее проверяется, находится ли текущая запись в рубрике 3. –> <!– Если да, то блоку div, будет присвоен класс “post-cat-three”. –> <!– Иначе, блоку div будет присвоен класс “post”. –> <?php if ( in_(‘3’) ) { ?> <div class=”post-cat-three”> <?php } else { ?> <div class=”post”> <?php } ?> <!– Отобразить Заголовок как постоянную ссылку на Запись. –> <h2><a href=”<?php the_perma(); ?>”><?php the_title(); ?></a></h2> <!– Отобразить время. –> <small><?php the_(‘F jS, Y’); ?></small> <!– Отобразить Содержимое Записи внутри div. –> <div class=”entry”> <?php the_content(); ?> </div> <!– Отобразить список Рубрик Записи, разделенных запятой. –> <p class=”postdata”>Posted in <?php the_(‘, ‘); ?></p> </div> <!– closes the first div box –> <!– Остановить Цикл (но есть ключевое слово “else:” – смотрите далее). –> <?php endwhile; else: ?> <!– В первом “if” проверяется существуют ли каки-либо записи для –> <!– вывода. Эта часть “else”, говорит что делать, если записей не нашлось.–> <p>Sorry, no posts matched your criteria.</p> <!– ДЕЙСТВИТЕЛЬНО остановить Цикл –> <?php endif; ?>

Читайте также:  Цикл obd2 не завершен

Запомните: Каждый раз, когда вы хотите использовать HTML код, вы должны находиться вне <?php ?> тэгов. PHP код (даже такие вещи как простые фигурные скобки: } ) должны быть внутри <?php ?> тэгов. Вы можете запускать и останавливать PHP код с тем чтобы вставлять в промежутки HTML код, с каждым if и else выражением, как показано в примере выше.

Исключение Записей из некоторых Рубрик

Этот пример может быть использован для исключения определенной Рубрики из обычного отображения. Он основан на предыдущем примере.

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <!– Если запись находится в рубрике, которую мы хотим исключить, мы просто переходим к следующей записи. –> <?php if (in_(‘3’)) continue; ?> <div class=”post”> <h2><a href=”<?php the_perma(); ?>”><?php the_title(); ?></a></h2> <small><?php the_(‘F jS, Y’); ?></small> <div class=”entry”> <?php the_content(); ?> </div> <p class=”postdata”>Posted in <?php the_(‘, ‘); ?></p> </div> <!– closes the first div box –> <?php endwhile; else: ?> <p>Sorry, no posts matched your criteria.</p> <?php endif; ?>

Запомните: Если вы используете этот пример для основной страницы, вы должны использовать другой Шаблон для архивов Рубрик. Иначе, WordPress будет исключать все записи в Рубрике 3, каждый раз, когда вы просматриваете Архив этой Рубрики!

Однако, если вы хотите использовать этот же файл шаблона, вы должны обойти это используя тэг is_home():

… <?php if (in_(‘3’) && is_home() ) continue; ?> …

Благодаря этому записи из Рубрики 3 будут исключены только с главной страницы. Существуют другие Условные Тэги, которые можно использовать для управления выводом в зависимости от того выполняется ли определенное условие на запрашиваемой странице.

Пожалуйста запомните, что несмотря на то что запись не отображается, WordPress все равно ее считает, как если бы она отображалась – это значит, что если вы указали WordPress выводить максимум семь записей, и две, последние из семи находятся в Рубрике 3, на главной странице отобразяться только пять записей. Если вы столкнулись с такой проблемой, можно воспользоваться более сложным приемом, описанным в разделе “Дизайн и Раскладка. Часто задаваемые вопросы” или вы можете использовать query_posts, если вам нужно просто исключить одну рубрику из Цикла.

Множественные Циклы

Этот раздел посвящен расширенному использованию Цикла. Здесь будет немного технической информации – но пусть это вас не пугает. Мы начнем с самого простого и приложив немного сообразительности, терпения и энтузиазма, вы тоже сможете строить множественные Циклы.

Во-первых, “зачем нужно использовать множественные Циклы?” Множественные циклы могут понадобиться в том случае, если вам необходимо произвести какие-то различные дейстия над несколькими группами записей, и при этом расположить их на одной странице. Различные действия – могут означать все что угодно, вы ограничены только PHP-мастерством и собственной фантазией.

Мы перейдем к примерам ниже, но сначала вы должны ознакомиться с основами. Взгляните на простой Цикл. Он состоит из:

<?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <!– атрибуты записи … –> <?php endwhile; ?>

Проще говоря (люди, знакомые с PHP и языком кода, могут пропустить), вышеуказанное можно прочитать как: Если мы собираемся отображать записи, тогда получим их по одной. Для каждой записи в списке отобразить соответствующие ей <!– атрибуты записи … –>. Когда дойдем до последней записи, остановиться. Строка (ки) <!– атрибуты записи … –> зависит от шаблона.

Слова атрибуты записи: в этом примере простой заменитель части кода, который описывает как форматировать и отображать каждую запись на странице. Этот код может быть изменен в зависимости от того, каким вы хотите видеть свой WordPress. Если откроете файла index.php темы Кубрика, секция атрибуты записи будет выглядеть вот так:

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

Выше:

<?php s__(‘No s »’, ‘1 »’, ‘% s »’); ?>

Разъяснение для кодеров там же: have_posts() и the_post() являются удобными обертками вокруг глобального объекта $wp_query, в котором происходят все эти действия. $wp_query вызывается в заголовке блога и аргументы запроса передаются к нему через GET и PATH_. Приняв аргументы, $wp_query, строит и выполняет запрос к базе данных, а результаты запроса возвращает в виде массива записей. Этот массив записывается в объект и также возвращается назад в заголовок блога, где он заполняется в глобальный массив $posts (для обратной совместимости со старыми версиями циклов).

После того как WordPress загрузил заголовок блога и передал его в шаблон, мы перейдем к нашему Циклу записей. have_posts() просто вызывает $wp_query->have_posts(), который проверяет счетчик цикла на наличие каких-либо записей в массиве записей. Также the_post() вызывает $wp_query->the_post(), который увеличивает счетчик цикла и устанавливает глобальную переменную $post, также как и все данные записей. Один раз выполнив Цикл,have_posts() вернет false и мы закончим.

Примеры Циклов

Далее следуют два примера использования множественных циклов. Ключем к использованию множественных циклов является тот факт, что $wp_query может быть вызван только один раз. Для того чтобы обойти это, можно повторно использовать запрос, вызвав rewind_posts() или создав новый объект запроса. Это описывается в примере 1. В примере 2 описывается, использование переменной для хранения результатов запроса. В примере 3 документирована функция up_post_caches();, используемая для обхождения общих проблем с плагинами. Наконец, “множественные циклы в действии” включает множество идей, одна из которых – использование множественных циклов для взаимодействия записей из конкретной категории на домашней странице вашего блога.

Множественные Циклы. Пример 1

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

<?php rewind_posts(); ?> <?php while (have_posts()) : the_post(); ?> <!– получить записи… –> <?php endwhile; ?>

Если вы хотите использовать два различных запроса для получения записей, вы можете повторно запустить объект $wp_query, с помощью вызова query_posts(). query_posts() выполнит новый запрос, посторит новый массив записей, и сбросит счетчик цикла.

// Получить последние 10 записей в рубрике special_cat <?php query_posts(‘_name=special_cat&posts_per_page=10’); ?> <?php while (have_posts()) : the_post(); ?> <!– получить записи из рубрики special_cat… –> <?php endwhile;?>

Если вам нужно сохранить оригинальный запрос, вы можете создать новый объект запроса.

<?php $my_query = new WP_Query(‘_name=special_cat&posts_per_page=10’); ?> <?php while ($my_query->have_posts()) : $my_query->the_post(); ?> <!– получить записи из рубрики special_cat… –> <?php endwhile; ?>

Читайте также:  Открылись кровотечения в середине цикла

Объект запроса my_query используется потому, что вы не можете использовать глобальные have_posts() и the_post(), поскольку они оба используются $wp_query. Вместо этого, используйте ваш новый объект $my_query.

Множественные Циклы Пример 2

Существует другой способ использования множественных Циклов, позволяющий обойти невозможность использования have_posts() и the_post(). Для этого, вам потребуется сохранить оригинальный запрос в переменную, а затем переназначить ее, за пределами другого Цикла. Этот способ позволяет использовать все стандартные функции, основывающиеся на глобальных данных.

Например:

// оригинальный запрос сохраняется в переменную $temp_query <?php $temp_query = $wp_query; ?> <!– Получить записи… –> <?php query_posts(‘_name=special_cat&showposts=10’); ?> <?php while (have_posts()) : the_post(); ?> <!– Получить записи из рубрики special_cat… –> <?php endwhile; ?> // $wp_query вновь присвается значение оригинального запроса <?php $wp_query = $temp_query; ?>

Важно:В PHP5, оператор “=” создает ссылку на объект, вместо того что копировать его, как это было в php4. Чтобы Пример 2 заработал в PHP 5, вам нужно использовать следующий код:

// оригинальный запрос сохраняется в переменную $temp_query <?php $temp_query = clone $wp_query; ?> <!– Получить записи… –> <?php query_posts(‘_name=special_cat&showposts=10’); ?> <?php while (have_posts()) : the_post(); ?> <!– Получить записи из рубрики special_cat… –> <?php endwhile; ?> // $wp_query вновь присвается значение оригинального запроса <?php $wp_query = clone $temp_query; ?>

Однако, этот второй пример не работает в WordPress 2.1.

Множественные Циклы Пример 3 – Плагины

Было установлено, что некоторые плагины плохо взаимодействуют с множественными циклами. В этих случаях было обнаружено, что плагины, имеющие отношение к ключевым словам и тэгированию записей, работают только с первым циклом на странице, который включает в себя подмножество всех записей. Если вы столкнулись с подобным, можно попробовать следующую реализацию основного цикла, с добавлением функции up_post_caches($posts). Эта функция сбрасывает кэш записей, и пока не документирована. Эта реализация будет использоваться во втором цикле на странице, только если первый цикл вернул подмножество записей.

Просто замените следующие строки:

<?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <!– Получить записи… –> <?php endwhile; ?>

на эти:

<?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); up_post_caches($posts); ?> <!– Получить записи… –> <?php endwhile; ?>

Множественные Циклы в Действии

Самый лучший способ понять как использовать множественные циклы – рассмотреть пример их использования. Чаще всего, множественные циклы используются для отображения двух (и более) списков записей на странице.Этот метод используется веб-мастером в том случае, когда он хочет отобразить не только последние записи, а еще и записи из некоторой рубрики.

Оставим в стороне все вопросы форматирования и CSS, представим что нам нужно отобразить два списка записей. Один из которых будет списком последних записей (стандартное количество записей равное 10,недавно добавили), и другой, который будет содержать только записи из рубрики “featured”. Записи в рубрике “featured” должны быть отображены первыми, следущими за вторым списком записей (стандарт).Хитрость в том, что не одна запись не должна присутствовать в обоих рубриках.

Шаг 1. Получить записи только из рубрики “featured”.

<?php $my_query = new WP_Query(‘_name=featured&showposts=1’); while ($my_query->have_posts()) : $my_query->the_post(); $do_not_duplicate = $post->ID; ?> <!– Получить записи… –> <?php endwhile; ?>

Говоря обычным языком, вышеуказанный код можно прочтитать так:

Установить $my_query равным результату запроса всех записей, где название рубрики featured, и кроме того, вернуть мне только одну запись. Также, установить значение переменной $do_not_duplicate равной ID-значению одиночной, возвращаемой записи. Выбрать то что описано в строке Получить записи вместе с параметрами форматирования, связанные с возвращаемой записью.

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

Шаг 2. Второй цикл, получение Х последних записей (исключая первую).

Представленный код получает X последних записей (как описано в настройках WordPress), сохраняет одну, уже отображенную в первом цикле, и отображает остальные записи, в соответствии с секцией Получить записи.

<?php if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID == $do_not_duplicate ) continue; up_post_caches($posts); ?> <!– Получить записи… –> <?php endwhile; endif; ?>

Говоря обычным языком, вышеуказанный код можно прочтитать так:

Получить все записи; где запись равна $do_not_duplicate, то ничего не делать (continue), в другом случае отобразить все другие записи в соответствии с секцией Do stuff. Также, обновить кэш, чтобы плагины связанные с тэгированием и ключевыми словами работали нормально. Вернуть переменную $do_not_duplicate, содержащую ID записи, ранее выведенной.

Конечный результат

Here is what the final piece of code looks like without any formatting:

<?php $my_query = new WP_Query(‘_name=featured&showposts=1’); while ($my_query->have_posts()) : $my_query->the_post(); $do_not_duplicate = $post->ID;?> <!– Do stuff… –> <?php endwhile; ?> <!– Do other stuff… –> <?php if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID == $do_not_duplicate ) continue; up_post_caches($posts); ?> <!– Do stuff… –> <?php endwhile; endif; ?>

В итоге мы получим два вывода. Первый вывод содержит самую свежую запись из категории ‘featured’. Второй вывод будет содержать X свежих записей (Как задано в настройках WordPress) за исключение записи которая уже показана в первом выводе. So, once the feature post is replaced with a new one, the previous feature will show up in standard post list section below (depending on how many posts you choose to display and on the post frequency). This technique (or similar) has been used by many in conjunction with knowledge of the Template Hierarchy to create a different look for home.php and index.php. See associated resources at the of this page.

Note for Multiple Posts in the First

If showposts=2 or more, you will need to alter the code a bit. The variable $do_not_duplicate needs to be changed into an array as opposed to a value. Otherwise, the first loop will finish and the variable $do_not_duplicate will equal only the id of the latest post. This will result in duplicated posts in the second loop. To fix the problem replace

<?php $my_query = new WP_Query(‘_name=featured&showposts=1’); while ($my_query->have_posts()) : $my_query->the_post(); $do_not_duplicate = $post->ID;?>

with

<?php $my_query = new WP_Query(‘_name=featured&showposts=2’); while ($my_query->have_posts()) : $my_query->the_post(); $do_not_duplicate[] = $post->ID ?>

Note that “showposts” can be any number. This changes $do_not_duplicate into an array. Then replace

<?php if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID == $do_not_duplicate ) continue; up_post_caches($posts); ?>

with

<?php if (have_posts()) : while (have_posts()) : the_post(); if (in_array($post->ID, $do_not_duplicate)) continue; up_post_caches($posts); ?>

Where you continue the pattern for whatever showposts is set equal to (2 in this case).

Sources

This article on multiple loops is a combination of Ryan Boren and Alex King’s ion the Loop on the Hackers Mailing List as well as the tutorial written at MaxPower.

Дополнительные материалы

  • Основы WP_Query – работа с запросами в WordPress с помощью класса WP_Query
  • Почему не следует использовать query_posts() в WordPress

Источник