Пользовательские запросы WordPress — несколько циклов

Опубликовано: 2021-01-29

В большинстве случаев при создании веб-сайта с помощью WordPress активируемая тема по умолчанию будет отображать главную страницу со списком ваших последних сообщений, если только вы не выберете отображение статической страницы в параметрах администратора в разделе «Настройки»> «Чтение». Но что, если вы хотите отобразить другой диапазон контента, который не является ни статической страницей, ни вашими последними сообщениями? К счастью, это возможно с помощью WordPress Multiple Loops.

Давайте посмотрим, как это может быть достигнуто!

Используйте несколько циклов на главной странице WordPress

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

Независимо от того, какую тему вы используете, соответствующий файл PHP для домашней страницы будет включать стандартный цикл, который отображает некоторые сообщения (в большинстве случаев это будут недавно опубликованные сообщения). Например, в теме Twenty Twenty вы найдете код, управляющий этим, в файле index.php в строке 79.

 if ( have_posts() ) { $i = 0; while ( have_posts() ) { $i++; if ( $i > 1 ) { echo '<hr class="post-separator styled-separator is-style-wide section-inner" aria-hidden="true" />'; } the_post(); get_template_part( 'template-parts/content', get_post_type() ); } }

В таком стандартном цикле используются две важные глобальные переменные:

  • $wp_query , который является объектом класса WP_Query и содержит результат запроса к базе данных WP.
  • $post , который является текущим объектом класса WP_Post .

В приведенном выше фрагменте кода мы сначала проверяем, есть ли какие-либо сообщения для отображения, с помощью глобальной функции have_posts() и, если есть, перебираем эти сообщения внутри цикла while. Глобальная функция the_post() — это та, которая перебирает сообщения, сообщая WordPress о переходе к следующему сообщению.

Если вы хотите увидеть эти функции и классы в деталях, вы можете найти их в файле wp-includes/class-wp-query.php .

Для целей нашего примера мы активировали тему Twenty Twenty, а затем создали 6 сообщений в категории «Категория 1» и 5 служебных сообщений в категории «Услуги».

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

 if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h3 class="entry-title">', '</h3>' ); } }

Это означает, что на нашей домашней странице мы увидим что-то вроде этого:

Приступаем к настройке вывода нашей домашней страницы

Как мы видели на снимке экрана выше, если мы посетим нашу «главную страницу», мы увидим 10 самых последних сообщений, независимо от категорий, которые были им присвоены.

Теперь мы приступим к созданию нашего собственного пользовательского шаблона домашней страницы, куда мы добавим настраиваемый вывод.

Для этого создайте файл custom-homepage.php и сохраните его в папке вашей темы. Добавьте следующий код на эту страницу:

 <?php /* * Template Name: My custom homepage template */ get_header(); if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h4 class="example"></h4>' ); } } get_footer();

Затем перейдите к своему администратору WordPress и создайте страницу под названием «Моя домашняя страница» и выберите «Мой собственный шаблон домашней страницы» в раскрывающемся меню «Шаблон» в качестве шаблона.

Затем, чтобы сделать это домашней страницей по умолчанию, вам нужно выбрать ее в меню «Настройки» («Настройки»> «Чтение»> «Статическая страница»).

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

Теперь у нас есть эта настройка, давайте добавим несколько запросов в наш шаблон «Моя пользовательская домашняя страница».

Добавление пользовательских запросов

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

Давайте начнем с замены текущего цикла (найденного в index.php примерно в строке 79) на этот:

 $args = array( 'posts_per_page' => 8, 'orderby', 'date', 'order', 'DESC' ); $query = new WP_Query( $args ); while ( $query->have_posts() ) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Этот цикл будет означать, что на вашей домашней странице теперь будут отображаться ваши 8 последних сообщений (как показано ниже):

Затем, если вы хотите включить настраиваемый тип записи «книги» (или любой другой настраиваемый тип записи, если на то пошло), мы добавим второй цикл для сообщений о книгах прямо под первым циклом, например:

 echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', 'posts_per_page' => 8 ); $query = new WP_Query( $args ); while ($query->have_posts()) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Перейдите к интерфейсу своего веб-сайта и обновите страницу, чтобы убедиться, что все работает должным образом.

Разбить пользовательский запрос на части

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

Давайте прыгнем в это. Для начала удалите содержимое файла custom-homepage.php , который мы использовали ранее, и добавьте приведенный ниже код.

 <?php /* * Template Name: My custom homepage template */ get_header(); //////////// // Services Posts loop echo '<h4>Services</h4>'; $args = array( 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Books Posts in between echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', ); $books = new WP_Query( $args ); while ( $books->have_posts() ) : $books->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Resume Services Posts loop echo '<h4>More Services</h4>'; $args = array( 'offset' => '3', 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; //////////// get_footer();

В первом цикле мы получаем 3 сообщения из категории «Услуги». Чтобы возобновить публикации категории «Услуги» в третьем цикле, избегая дублирования, мы определяем смещение => 3 . Это означает, что мы увидим следующее:

Конечно, вы можете изменить значение смещения на любое желаемое число.

Добавить пользовательские сообщения в запрос последних сообщений

Что, если мы хотим включить сообщения о книгах в последние сообщения на главной странице? Цикл по умолчанию по умолчанию не включает пользовательские сообщения. Вот как мы можем это исправить.

Для этого раздела мы установим настройки чтения для домашней страницы на «Ваши последние сообщения».

Путь, которому следует следовать здесь, — это использование хука pre_get_posts . Этот хук представлен в файле wp-includes/class-wp-query.php и используется для настройки объекта $query и основного цикла WordPress по вашему усмотрению. Он выполняется после создания объекта переменной запроса, но до выполнения фактического запроса.

Откройте файл functions.php вашей активной темы и вставьте в конец следующий фрагмент кода:

 function homepage_add_cpt( $query ) { if ( $query->is_main_query() && is_home() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } add_action( 'pre_get_posts', 'homepage_add_cpt' );

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

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

Вывод

Почти все без исключения, чего бы вы ни хотели достичь с точки зрения контента для вашей домашней страницы WordPress, возможно. Как мы показали здесь, использование WordPress Multiple Loops — это мощный способ настройки вывода, который отображается на вашей домашней странице. Наш подход здесь — лишь один из многих. WordPress предлагает невероятные уровни контроля над выводом, который появляется на вашем сайте. Экспериментируйте с инструментами, которые они предоставляют, чтобы достичь того, чего вы хотите!