Привет и добро пожаловать во вторую часть серии под названием «Мастеринг WP_Query». В первой части мы начали с серии, просто представив, что WP_Query
класс WP_Query
. И во второй части мы узнаем о функциях, связанных с WP_Query
.
Давайте начнем!
Использование возможностей WP_Query с функциями, действиями и фильтрами
Я не специалист по программированию, но я вижу, что класс WP_Query
является одним из лучших примеров шаблона MVC. Он чрезвычайно мощный, полностью расширяемый и очень простой в использовании, когда вы познакомитесь с основами.
В дополнение к своим свойствам, методам и параметрам (которые мы рассмотрим в будущем), WordPress предлагает дополнительные функции и хуки (то есть действия и фильтры) для работы с классом WP_Query
. В этом уроке мы познакомимся с функциями, а в следующей части увидим действия и фильтры, связанные с WP_Query
. Если вы видите, что я что-то забыл, не стесняйтесь сообщить мне, сняв комментарий.
WP_Query Связанные функции
Существует 13 функций WordPress, которые работают с классом WP_Query
которые могут помочь вам использовать возможности WP_Query
. Они не нуждаются в представлении, поэтому здесь мы идем:
Получение открытых переменных запроса: get_query_var()
Имя нашей первой функции говорит само за себя: она берет глобальный объект $wp_query
и извлекает из него общедоступную переменную запроса. Он имеет два параметра: первый — это переменная, которая возвращает свое значение, а второй — значение по умолчанию, которое возвращается, если переменная не установлена:
1
2
3
4
5
|
<?php
$paged = get_query_var( ‘paged’, 1 );
?>
|
Влияние на основной цикл: query_posts()
Если честно, это плохая функция. Вы действительно не должны использовать это вообще, но ради того, чтобы сказать «правильный путь», мы собираемся пройти через это и сказать вам, что это «неправильный путь».
query_posts()
— это функция, которая изменяет основной запрос, откладывая основной запрос и выполняя новый запрос, и вам нужно будет использовать wp_reset_query()
для очистки после него.
1
2
3
4
5
|
<?php
query_posts( ‘category_name=news’ );
?>
|
Эта функция является одной из наиболее часто используемых функций в ядре WordPress. Вы не должны использовать его для создания вторичных запросов — вы можете использовать класс WP_Query
или get_posts()
(о которой мы поговорим позже в этом уроке). Вы также не должны использовать его для изменения основного запроса — вы должны использовать действие pre_get_posts
(о котором мы также поговорим позже). Даже Кодекс отговаривает нас от его использования и показывает альтернативы.
Итог: не используйте его.
Получение одного поста: get_post()
Другая get_post()
функция — get_post()
, которую вы используете, чтобы получить один пост. Имеет три необязательных параметра:
- Первый — это идентификатор сообщения (или идентификатор текущего сообщения по умолчанию).
- Второй — тип результата, который вы получите:
OBJECT
,ARRAY_A
(ассоциативный массив) илиARRAY_N
(числовой массив). - Третий — выбор фильтрации результата. По умолчанию используется значение
'raw'
поэтому оно не будет отфильтровано, если вы не установите для него значение'edit'
,'display'
,'attribute'
или'js'
.
1
2
3
4
5
6
|
<?php
$first_post = get_post( 1, ARRAY_A );
$post_title = $first_post[ ‘post_title’ ];
?>
|
Сохранение запросов в массивы: get_posts()
Функция get_posts()
позволяет нам запускать запросы и сохранять их как массивы для использования в разных местах. Он требует тех же аргументов с WP_Query
чтобы вы могли настроить запрос так, как вам нравится. (Мы рассмотрим параметры WP_Query
в будущем, так что следите за обновлениями!) Это лучший и самый эффективный способ создания списков сообщений, но не циклов.
01
02
03
04
05
06
07
08
09
10
11
12
13
|
<?php
$args = array(
‘category_name’ => ‘news’,
‘order’ => ‘ASC’,
‘orderby’ => ‘post_title’,
‘posts_per_page’ => -1
);
// Return an array of all posts in the «news» category.
$all_posts_list = get_posts( $args );
?>
|
Хотя эту функцию можно использовать для выполнения «вторичных запросов» без проблем, Кодекс рекомендует использовать WP_Query
при создании нескольких циклов и использовать get_posts()
при получении списка сообщений. Питер Р. Найт объясняет разницу между get_posts()
и WP_Query
простыми словами: главное отличие заключается в том, что WP_Query
выполняет больше запросов к базе данных ( WP_Query
данные, метаданные, данные об get_posts()
и комментарии), а get_posts()
выполняет только один запрос (публикация). данные).
Получение страниц: get_pages()
Эта нечетная функция предназначена для извлечения списка страниц, хотя у нее есть параметр post_type
который также может позволить вам выбрать другой тип записи (при условии, что тип записи является иерархическим, в противном случае он возвращает false
).
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?php
$args = array(
‘sort_order’ => ‘ASC’,
‘sort_column’ => ‘post_title’,
‘hierarchical’ => 1,
‘exclude’ => »,
‘include’ => »,
‘meta_key’ => »,
‘meta_value’ => »,
‘authors’ => »,
‘child_of’ => 0,
‘parent’ => -1,
‘exclude_tree’ => »,
‘number’ => »,
‘offset’ => 0,
‘post_type’ => ‘page’,
‘post_status’ => ‘publish’
);
$pages = get_pages( $args );
?>
|
Он принимает аргументы, которые очень похожи на аргументы 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_value
: при использовании с аргументомmeta_key
он включает только страницы, которые имеют определенный мета-ключ и значение. -
authors
: список идентификаторовauthors
через запятую. -
child_of
: идентификатор страницы, из которой можно выбрать только своих детей и внуков в списке. -
parent
: список страниц с указанным идентификатором страницы в качестве родительского. Чтобы этот аргумент работал,hierarchical
аргумент должен быть установлен в0
. -
exclude_tree
: список, разделенный запятыми, или массив идентификаторов страниц, которые необходимо исключить вместе со своими дочерними элементами. -
number
: количество страниц для извлечения. -
offset
: количество страниц, пропускаемых сверху. -
post_type
: тип записи для запроса. Естественно, по умолчанию этоpage
. -
post_status
: разделенный запятыми список типов статуса записи для включения.
Проверка того, возвращает ли запрос сообщения: have_posts()
Не принимая никаких параметров, эта функция просто возвращает TRUE
если запрос возвращает какие-либо записи, и FALSE
если нет.
01
02
03
04
05
06
07
08
09
10
11
12
13
|
<?php
if ( have_posts() ) {
// Success.
} else {
// Failure.
}
?>
|
Работа в цикле: the_post()
Кодекс говорит, что он «выполняет итерации индекса в цикле». Это делает несколько вещей:
- Извлекает следующую запись из запроса.
- Он устанавливает данные
$post
. - Он устанавливает для параметра
in_the_loop
значениеTRUE
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
<?php
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
the_title();
the_content();
}
}
?>
|
Настройка $post
: setup_postdata()
Эта функция также говорит сама за себя: она устанавливает глобальные почтовые данные. Давайте посмотрим, что Кодекс говорит об этом:
setup_postdata () заполняет глобальные переменные
$id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages
, которые помогают многим$id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages
шаблона работать в контексте текущего поста. Он не назначает глобальную переменную$post
, но, похоже, ожидает, что ее аргумент является ссылкой на нее.
1
2
3
4
5
6
7
|
<?php
global $post;
setup_postdata( $post );
?>
|
Очистка текущего цикла: rewind_posts()
Еще одна функция, имя которой определяет ее функциональность: эта функция просто «перематывает» цикл, чтобы вы могли запустить его позже.
1
2
3
4
5
6
|
<?php
// After the loop.
rewind_posts();
?>
|
Сброс $post
: wp_reset_postdata()
Эта функция сбрасывает глобальную переменную $post
обратно на первое сообщение в основном запросе. Лучше использовать этот после вторичного запроса.
1
2
3
4
5
6
|
<?php
// After a secondary query.
wp_reset_postdata();
?>
|
Сброс запроса: wp_reset_query()
Этот следует использовать, если основной запрос изменен (с помощью функции query_posts()
или действия pre_get_posts
которое мы увидим в следующей части), чтобы основной запрос можно было сбросить.
1
2
3
4
5
6
|
<?php
// After the main query is altered.
wp_reset_query();
?>
|
Проверка, является ли текущий запрос основным is_main_query()
: is_main_query()
Это условный тег, который возвращает TRUE
если текущий запрос является основным, и FALSE
если это не так. Просто, правда?
01
02
03
04
05
06
07
08
09
10
11
12
13
|
<?php
if ( is_main_query() ) {
// Success.
} else {
// Failure.
}
?>
|
Проверка, находимся ли мы в цикле: in_the_loop()
Другой in_the_loop()
тег — это in_the_loop()
который просто возвращает TRUE
или FALSE
если ваш код выполняется внутри цикла или нет.
01
02
03
04
05
06
07
08
09
10
11
12
13
|
<?php
if ( in_the_loop() ) {
// Success.
} else {
// Failure.
}
?>
|
Конец второй части
Вот и все — теперь вы знаете (возможно) все функции, связанные с WP_Query
! Следите за следующей частью, где мы узнаем о действиях и фильтрах, связанных с WP_Query
.
Есть ли у вас какие-либо комментарии или что-нибудь добавить к этой части? Не стесняйтесь поделиться своими мыслями, комментируя ниже. И если вам понравилась статья, не забудьте поделиться ею с друзьями!