Работа с WP_Query: связные функции

29 Мая 2022г. в 04:33

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

Давайте начнём!

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

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

Связные функции
В WordPress существует 13 функций, которые можно задействовать при работе с классом WP_Query:

Получение публичных параметров запроса: get_query_var()
Название данной функции говорит само за себя: оно берёт глобальный объект $wp_query и извлекает публичные переменные запроса. Принимает два параметра: название переменной; значение по умолчанию переменной, если оно не задано:

1
<?php
2

3
$paged = get_query_var( 'paged', 1 );
4

5
?>
Влияние на основной цикл: query_posts()
Если быть честным, то использование данной функции следует избегать, но для того чтобы осветить общую картину, давайте рассмотрим и её.

query_posts() - это функция, которая преобразует основной запрос, заменяя обычное поведение другим. После использования следует вызвать wp_reset_query() для сброса данных запроса.

1
<?php
2

3
query_posts( 'category_name=news' );
4

5
?>
Редко встретишь случай правильного использования данной функции. Для создания вторичных запросов следует использовать не её, а класс WP_Query или функцию get_posts() (о которой поговорим в будущем). Для преобразования основного запроса так же лучше воспользоваться экшеном pre_get_posts.

И ещё раз: не используйте данный метод.

Извлечение одиночного поста: get_post()
Ещё одна функция, которая говорит сама за себя: get_post(). Принимает три необязательных параметра:

Идентификатор поста (по умолчанию: ID текущего поста).
Тип возвращаемого результата: OBJECT, ARRAY_A (ассоциативный массив) или ARRAY_N (обычный массив).
Фильтрация результата. По умолчанию 'raw' (фильтрация не будет применяться). Другие значения 'edit', 'display', 'attribute' или 'js'.
1
<?php
2

3
$first_post = get_post( 1, ARRAY_A );
4
$post_title = $first_post[ 'post_title' ];
5

6
?>
Сохранение запросов в массивы: get_posts()
Функция get_posts() позволяет запускать запросы и сохранять их в массивы для использования в других местах. Принимает те же параметры что и WP_Query. Лучший способ создания списков постов — но не циклов.

01
<l?php
02

03
$args = array(
04
'category_name' => 'news',
05
'order' => 'ASC',
06
'orderby' => 'post_title',
07
'posts_per_page' => -1
08
);
09

10
// Получение массива постов категории "news".
11
$all_posts_list = get_posts( $args );
12

13
?>
Извлечение страниц: get_pages()
Данная функция предназначена для извлечения массивов страниц. Так же вы можете указать параметр post_type, что позволит извлечь другие типы постов (если указать, то ответ будет с вложенными результатами, по умолчанию false).

01
<?php
02

03
$args = array(
04
'sort_order' => 'ASC',
05
'sort_column' => 'post_title',
06
'hierarchical' => 1,
07
'exclude' => '',
08
'include' => '',
09
'meta_key' => '',
10
'meta_value' => '',
11
'authors' => '',
12
'child_of' => 0,
13
'parent' => -1,
14
'exclude_tree' => '',
15
'number' => '',
16
'offset' => 0,
17
'post_type' => 'page',
18
'post_status' => 'publish'
19
);
20

21
$pages = get_pages( $args );
22

23
?>
Принимает аргументы схожие с WP_Query:

sort_order: порядок вывода, в порядке возрастания (asc) или убывания (desc).
sort_column: сортировка. Принимает post_title, menu_order, post_date, post_modified, ID, post_author и post_name.
hierarchical: результат с вложениями (1) или нет (0).
exclude: массив с идентификаторами, которые нужно исключить из списка.
include: массив с идентификаторами, которые нужно обязательно включить в список.
meta_key: при использовании аргумента meta_value, будут извлечены только страницы с поисковым meta по ключу и значению.
meta_value: при использовании аргумента meta_key, будут извлечены только страницы с поисковым meta по ключу и значению.
authors: список идентификаторов авторов.
child_of: идентификатор страницы потомков которых необходимо сканировать.
parent: идентификатор родителя. Для активации данного параметра, hierarchical должен быть равен 0.
exclude_tree: массив идентификаторов, страницы которых должны быть исключены (включая потомков).
number: количество страниц, которые нужно извлечь.
offset: смещение.
post_type: типы постов. По умолчанию page.
post_status: список статусов, которые следует рассматривать.
Проверка наличия постов: have_posts()
Данная функция просто вернёт TRUE если по запросу будут какие-то результаты или FALSE в противном случае.

01
<?php
02

03
if ( have_posts() ) {
04

05
// Success.
06

07
} else {
08

09
// Failure.
10

11
}
12

13
?>
Работа с циклом: the_post()
Схема работы согласно кодексу:

Извлечение результата из запроса.
Установка значения для $post.
Установка значения TRUE параметру in_the_loop.
01
<?php
02

03
if ( have_posts() ) {
04

05
while ( have_posts() ) {
06

07
the_post();
08

09
the_title();
10

11
the_content();
12

13
}
14

15
}
16

17
?>
Настройка $post: setup_postdata()
Данная функция предназначена для установки глобальных параметров поста.

setup_postdata() позволяет работать с параметрами $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages.

1
<?php
2

3
global $post;
4

5
setup_postdata( $post );
6

7
?>
Очистка дынных текущего запроса: rewind_posts()
Перенос указателя на первый результат в списке постов (для дальнейшего использования цикла в другом месте).

1
<?php
2

3
// После цикла.
4
rewind_posts();
5

6
?>
Сброс $post: wp_reset_postdata()
Данная функция сбрасывает значения глобальной переменной $post. Полезна при запуске вторичных запросов.

1
<?php
2

3
wp_reset_postdata();
4

5
?>
Сброс Query: wp_reset_query()
Следует использовать в случае изменения основного запроса.

1
<?php
2

3
// После преобразования основного запроса.
4
wp_reset_query();
5

6
?>
Является ли текущий запрос - основным: is_main_query()
Это один из условных тегов, который вернёт TRUE если текущий запрос является основным и FALSE если нет.

01
<?php
02

03
if ( is_main_query() ) {
04

05
// Success.
06

07
} else {
08

09
// Failure.
10

11
}
12

13
?>
Проверка нахождения в цикле: in_the_loop()
Ещё один условный тег, который возвращает TRUE или FALSE в зависимости от того выполняется ли цикл.

01
<?php
02

03
if ( in_the_loop() ) {
04

05
// Success.
06

07
} else {
08

09
// Failure.
10

11
}
12

13
?>
Заключение
Вот и всё что касается функций, которые тем или иным способом связаны с классом WP_Query! В следующей части мы поговорим о экшенах и фильтрах.