Работа с WP_Query: Использование цикла
29 Мая 2022г. в 04:33Как было сказано в вступительной статье, мы начинаем разбор класса WP_Query. Напомним, что работу с данным классом можно разделить на четыре этапа:
передача аргументов запроса
выполнение запроса
прохождение по результату в цикле
завершение: сброс данных постов
В этом уроке мы рассмотрим несколько способов использования циклов, для прохождения по результатам запроса WP_Query.
Циклы
Без цикла невозможно отобразить контент страницы.
Итак, цикл состоит из следующих этапов:
if( $query->have_posts() ) проверяет наличие результата.
while( $query->have_posts() ) выполняет внутренний код для каждого поста, полученного в результате выполнения запроса.
$query->the_post() осуществляет доступ к посту.
Пример рабочего цикла с использованием класса WP_Query:
01
<?php
02
03
$args = array(
04
// аргументы
05
);
06
07
// Собственный запрос
08
$query = new WP_Query( $args );
09
10
// Проверка на наличие результата
11
if ( $query->have_posts() ) {
12
13
// Прохождение по результатам в цикле
14
while ( $query->have_posts() ) {
15
16
$query->the_post();
17
18
}
19
20
}
21
22
// Восстановление оригинальных данных запроса
23
wp_reset_postdata();
24
25
?>
После цикла следует вызвать функцию wp_reset_postdata().
Структура цикла
Структура цикла напрямую зависит от данных, которые вы хотите вывести. Вот пример вывода названия постов, изображения и выдержки.
01
<?php
02
03
$args = array(
04
// аргументы.
05
);
06
07
// Собственный запрос.
08
$query = new WP_Query( $args );
09
10
// Проверка на наличие результата.
11
if ( $query->have_posts() ) {
12
13
// Прохождение по результатам в цикле.
14
while ( $query->have_posts() ) {
15
16
$query->the_post();
17
18
?>
19
20
<article id="post-<?php the_ID(); ?>" <?php post_class( 'left' ); ?>>
21
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
22
<?php post_thumbnail( 'thumbnail' );?>
23
</a>
24
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
25
<?php the_title(); ?>
26
</a>
27
<?php the_excerpt(); ?>
28
</article>
29
30
<?php
31
32
}
33
34
}
35
36
// Восстановление оригинальных данных запроса.
37
wp_reset_postdata();
38
39
?>
Детали: проверка наличия контента
Теперь мы хотим вывести заголовок перед списком постов или обернуть их в какой-то отдельный html элемент. Если мы просто выведем этот код перед циклом, то он будет отображён в любом случае: есть посты или нет.
Чтобы этого избежать, можем осуществить проверку, воспользовавшись условным выражением if:
01
<?php
02
03
$args = array(
04
// аргументы.
05
);
06
07
// Собственный запрос.
08
$query = new WP_Query( $args );
09
10
// Проверка на наличие результата.
11
if ( $query->have_posts() ) {
12
13
14
echo '<section class="clear">';
15
echo '<h2>' . __( 'Heading', 'tutsplus' ) . '</h2>';
16
17
// Прохождение по результатам в цикле.
18
while ( $query->have_posts() ) {
19
20
$query->the_post();
21
22
?>
23
24
<article id="post-<?php the_ID(); ?>" <?php post_class( 'left' ); ?>>
25
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
26
<?php post_thumbnail( 'thumbnail' );?>
27
</a>
28
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
29
<?php the_title(); ?>
30
</a>
31
<?php the_excerpt(); ?>
32
</article>
33
34
<?php
35
36
}
37
38
echo '</section>';
39
40
}
41
42
// Восстановление оригинальных данных запроса.
43
wp_reset_postdata();
44
45
?>
Сначала мы проверяем наличие постов, выводим заголовок, а затем и сами посты.
Эта техника может пригодиться если мы хотим вывести список постов какой-то категории. Элемент ul будет располагаться перед циклом, но после проверки на наличие результатов запроса:
01
<?php
02
03
$args = array(
04
'category_name' => 'category-slug',
05
'post_type' => 'post'
06
);
07
08
// Собственный запрос.
09
$query = new WP_Query( $args );
10
11
// Проверка на наличие результата.
12
if ( $query->have_posts() ) {
13
14
echo '<ul class="category posts">';
15
16
// Прохождение по результатам в цикле.
17
while ( $query->have_posts() ) {
18
19
$query->the_post();
20
21
?>
22
23
<li <?php post_class( 'left' ); ?>>
24
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
25
<?php the_title(); ?>
26
</a>
27
</li>
28
29
<?php
30
31
}
32
33
echo '</ul>';
34
35
}
36
37
// Восстановление оригинальных данных запроса.
38
wp_reset_postdata();
39
40
?>
Запуск дополнительных запросов
Важно знать, что для многократного использования класса WP_Query на одной и той же странице, после каждого запроса следует запускать очистку. Затем для последующих запросов необходимо создать отдельный объект WP_Query.
В данном примере мы выводим изображение только для первого поста, а для всех последующих только название:
01
<?php
02
03
// Параметры первого запроса.
04
$args1 = array(
05
'post_type' => 'post',
06
'posts_per_page' => '1'
07
);
08
09
// Выполнение первого запроса.
10
$query1 = new WP_Query( $args1 );
11
12
// Проверка наличия постов.
13
if ( $query1->have_posts() ) {
14
15
// Цикл по результату.
16
while ( $query1->have_posts() ) {
17
18
$query1->the_post();
19
20
?>
21
22
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
23
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
24
<?php post_thumbnail( 'thumbnail' );?>
25
</a>
26
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
27
<?php the_title(); ?>
28
</a>
29
<?php the_excerpt(); ?>
30
</article>
31
32
<?php
33
34
}
35
36
}
37
38
// Очистка данных.
39
wp_reset_postdata();
40
41
// Параметры второго запроса.
42
$args2 = array(
43
'offset' => '1',
44
'post_type' => 'post'
45
);
46
47
// Выполнение второго запроса.
48
$query2 = new WP_Query( $args2 );
49
50
// Проверка наличия результата.
51
if ( $query2->have_posts() ) {
52
53
echo '<ul class="more-posts">';
54
55
// Цикл по результату.
56
while ( $query2->have_posts() ) {
57
58
$query2->the_post();
59
60
?>
61
62
<li <?php post_class(); ?>>
63
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
64
<?php the_title(); ?>
65
</a>
66
</li>
67
68
<?php
69
70
}
71
72
echo '</ul>';
73
74
}
75
76
// Очистака данных.
77
wp_reset_postdata();
78
79
?>
В этом примере использовались запросы с следующими параметрами:
'posts_per_page' => '1', в первом запросе, вывод самого свежего поста.
'offset' = '1', во втором запросе, смещение на один запрос, который уже был извлечён на первом шаге.
Как видно из листинга запросы очень схожи, только в первом случаем мы извлекаем не только заголовок, но и краткое описание с изображением, а во втором только заголовки, помещённые в элемент списка ul и li.
Прошу заметить, что после каждого запроса я вызывал функцию wp_reset_postdata(). Если этого не сделать, то в результат второго запросы был бы идентичен результату первого запроса.
Заключение
Без цикла, WP_Query абсолютно бесполезен. В цикле как раз и происходит вывод данных, которые мы хотим видеть на странице.
В этом уроке мы рассмотрели несколько примеров использования цикла: простой вывод данных; вывод, используя связку if( $query->have_posts() ) и while( $query->have_posts() ). Так же нами был рассмотрен пример отправки запросов с параметрами.