В этой части этой серии статей о WP_Query
вы узнаете, как использовать WP_Query
для запроса сообщений, страниц и пользовательских типов сообщений. Вы можете запросить определенные сообщения и страницы или выполнить запрос, чтобы вернуть сообщения одного или нескольких типов сообщений.
Резюме о том, как аргументы работают в WP_Query
Прежде чем мы начнем, давайте WP_Query
как работают аргументы в WP_Query
. Когда вы WP_Query
в своих темах или плагинах, вам нужно включить четыре основных элемента:
- аргументы для запроса, используя параметры, которые будут рассмотрены в этом руководстве
- сам запрос
- петля
- завершение: закрытие тегов if и while и сброс данных поста
На практике это будет выглядеть примерно так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php
$args = array(
// Arguments for your query.
);
// Custom query.
$query = new WP_Query( $args );
// Check that we have query results.
if ( $query->have_posts() ) {
// Start looping over the query results.
while ( $query->have_posts() ) {
$query->the_post();
// Contents of the queried post results go here.
}
}
// Restore original post data.
wp_reset_postdata();
?>
|
Аргументы — это то, что сообщает WordPress, какие данные нужно извлечь из базы данных, и это те, которые я расскажу здесь. Итак, все, на чем мы концентрируемся, это первая часть кода:
1
2
3
|
$args = array(
// Arguments for your query.
);
|
Как видите, аргументы содержатся в массиве. В этом уроке вы узнаете, как их кодировать.
Кодирование ваших аргументов
Существует специальный способ кодирования аргументов в массиве, который заключается в следующем:
1
2
3
4
5
|
$args = array(
‘parameter1’ => ‘value’,
‘parameter2’ => ‘value’,
‘parameter3’ => ‘value’
);
|
Вы должны заключить параметры и их значения в одинарные кавычки, использовать =>
между ними и разделить их запятой. Если вы ошиблись, WordPress может не добавить все ваши аргументы в запрос, или вы можете получить белый экран.
Запросы на отдельные сообщения или страницы
Давайте начнем с самого простого сценария: запустив запрос, чтобы найти один конкретный пост или страницу.
Запросы на один пост
Чтобы найти конкретное сообщение (или набор сообщений), у вас есть два варианта:
-
p
( int ): использовать идентификатор записи. -
name
( строка ): использовать пост-слаг.
Вы можете использовать эти параметры с любым типом поста, включая посты, страницы, вложения и пользовательские типы постов. По умолчанию WordPress будет запрашивать тип записи 'post'
а не возвращать страницы или пользовательские типы записей — если вы хотите сделать это, вам нужно добавить дополнительные аргументы или использовать другой аргумент, о котором я расскажу позже в этой статье. руководство.
Итак, чтобы вернуть конкретный пост, вы должны использовать один из них:
1
2
3
|
$args = array(
‘p’ => ’32’
);
|
или:
1
2
3
|
$args = array(
‘name’ => ‘post_slug’
);
|
Обратите внимание, что параметр name
принимает пост-слаг в качестве аргумента, а не его заголовок.
Использование параметра name
упрощает определение того, что ваш запрос будет извлекать из базы данных при повторном посещении вашего кода позднее, но есть риск, что он не будет работать, если один из пользователей вашего сайта изменит пост-слаг. ID сообщения не может быть изменен, так что это безопаснее.
Запрос на одну страницу
Чтобы запросить определенную страницу, у вас снова есть два варианта:
-
page_id
( int ): использовать идентификатор страницы. -
pagename
( строка ): использовать слаг страницы.
Итак, чтобы запустить запрос, извлекающий только одну конкретную страницу из базы данных, вы должны использовать одну из них:
1
2
3
|
$args = array(
‘page_id’ => ’20’
);
|
или:
1
2
3
|
$args = array(
‘pagename’ => ‘page_slug’
);
|
Запрос одного поста другого типа
Чтобы выполнить запрос для сообщения другого типа, включая пользовательский тип сообщения, вы также должны использовать параметр post_type
. Я расскажу об этом чуть подробнее позже в этом уроке, но вкратце, чтобы запросить одну публикацию в пользовательском типе записи product
, вы должны использовать это:
1
2
3
4
|
$args = array(
‘p’ => ’46’,
‘post_type’ => ‘product’
);
|
Или для запроса вложения, вы должны использовать:
1
2
3
4
|
$args = array(
‘p’ => ’46’,
‘post_type’ => ‘attachment’
);
|
Запросы на дочерние страницы
Иногда вам может потребоваться получить все страницы, которые являются дочерними для данной страницы, например, если ваш сайт имеет иерархическую структуру страниц и вы хотите отобразить список на каждой странице дочерних элементов этой страницы.
Примечание: вы не будете делать это с постами, так как они не являются иерархическими, хотя вы можете сделать это с пользовательским типом поста, если он иерархический.
У вас есть три аргумента, которые вы можете использовать для этого:
-
post_parent
( int ): использовать идентификатор страницы для возврата только дочерних страниц. Установите 0, чтобы возвращать только записи верхнего уровня. -
post_parent__in
( array ): использовать массив идентификаторовpost_parent__in
. -
post_parent__not_in
( array ): использовать массив идентификаторовpost_parent__not_in
.
Давайте посмотрим на каждого из них.
Первый, post_parent
, позволяет запрашивать страницы, которые являются post_parent
для одной конкретной страницы.
Таким образом, чтобы найти все страницы, которые являются дочерними для данной страницы, вы должны использовать это:
1
2
3
4
|
$args = array(
‘post_type’ => ‘page’,
‘post_parent’ => ‘2’
);
|
Обратите внимание, что вы должны включить аргумент post_type
в качестве типа поста по умолчанию, который WP_Query
ищет — post
.
Кроме того, вы можете использовать его для поиска дочерних элементов текущей страницы:
1
2
3
4
5
6
|
$current_page_id = get_the_ID();
$args = array(
‘post_type’ => ‘page’,
‘post_parent’ => $current_page_id
);
|
Вы также можете использовать этот параметр для идентификации страниц верхнего уровня, то есть тех, у которых нет родителя:
1
2
3
4
|
$args = array(
‘post_type’ => ‘page’,
‘post_parent’ => ‘0’
);
|
Но что, если вы хотите идентифицировать детей на нескольких страницах? Вы также можете сделать это с post_parent__in
параметра post_parent__in
. Это займет массив почтовых идентификаторов.
Таким образом, для запроса дочерних элементов двух ваших страниц вы должны использовать это:
1
2
3
4
5
6
7
|
$args = array(
‘post_type’ => ‘page’,
‘post_parent__in’ => array(
‘2’,
‘4’
)
);
|
Вы также можете исключить дочерние страницы из вашего запроса, используя параметр post_parent__not_in
:
1
2
3
4
5
6
7
|
$args = array(
‘post_type’ => ‘page’,
‘post_parent__not_in’ => array(
‘2’,
‘4’
)
);
|
Запросы на несколько сообщений
Также часто выполняется запрос для включения или исключения нескольких сообщений. У вас есть два аргумента, которые вы можете использовать для этого:
-
post__in
( массив ): использовать идентификаторы постов. -
post__not_in
( массив ): использовать идентификаторы постов.
Аргумент post__in
может использоваться для всех типов post__in
и принимает массив идентификаторов. Таким образом, чтобы вывести список конкретных сообщений, вы должны использовать это:
1
2
3
4
5
6
7
8
|
$args = array(
‘post__in’ => array(
’36’,
’52’,
‘246’,
‘354’
)
);
|
Примечание. Если вы используете этот аргумент для извлечения сообщений, WordPress будет по-прежнему извлекать прикрепленные сообщения, даже если их нет в вашем списке. Чтобы опустить их, вы используете аргумент ignore_sticky_posts
:
1
2
3
4
5
6
7
8
9
|
$args = array(
‘post__in’ => array(
’36’,
’52’,
‘246’,
‘354’
),
‘ignore_sticky_posts’ => ‘true’
);
|
Аргумент post__not_in
работает аналогичным образом, снова принимая массив идентификаторов постов, но он выводит все остальное, кроме перечисленных постов. Обычно вы комбинируете это с другими аргументами, чтобы избежать вывода огромного списка сообщений.
Таким образом, для запроса всех сообщений типа сообщения product
но исключить несколько:
1
2
3
4
5
6
7
8
9
|
$args = array(
‘post_type’ => ‘product’,
‘post__not_in’ => array(
’36’,
’52’,
‘246’,
‘354’
)
);
|
Итак, чтобы объединить это с одним из наших предыдущих примеров, вот как вы будете запрашивать все страницы верхнего уровня, кроме текущей:
1
2
3
4
5
6
|
$current_page_ids = array( get_the_ID() );
$args = array(
‘post_parent’ => ‘0’,
‘post__not_in’ => $current_page_ids
);
|
Обратите внимание, что если вы также зарегистрировали иерархический тип записи, вам нужно включить параметр post_type
в этот код, чтобы просто запрашивать страницы.
Запросы для типов сообщений
В некоторых из приведенных выше примеров я использовал параметр post_type
для идентификации сообщений определенного типа. Давайте посмотрим на аргументы, которые вы можете использовать с этим параметром:
-
post
: пост. -
page
: страница. -
revision
: пересмотр. -
attachment
: вложение. -
nav_menu_item
: пункт меню навигации. -
any
: извлекает любой тип, кроме ревизий и типов, для которого'exclude_from_search'
установлено значениеtrue
когда они были зарегистрированы. - Пользовательские типы сообщений (например,
product
).
Как мы видели выше, вы можете использовать этот параметр с другими аргументами, чтобы сделать ваш запрос более конкретным.
Итак, чтобы привести простой пример, вот как вы бы запрашивали все страницы вашего сайта:
1
2
3
|
$args = array(
‘post_type’ => ‘page’
);
|
Пользовательские типы сообщений
Запросить пользовательский тип сообщения очень просто: используйте имя, которое вы дали типу сообщения, при регистрации, а не название, которое используется в меню администратора. Допустим, вы зарегистрировали типы сообщений о вашем продукте с помощью register_post_type()
следующим образом:
1
2
3
4
5
6
7
8
9
|
function register_product() {
$args = array(
‘name’ => __( ‘Products’, ‘tutsplus’ ),
‘singular_name’ => __( ‘Product’, ‘tutsplus’ )
);
register_post_type( ‘product’, $args );
}
|
Значение, которое вы используете для аргумента post_type
при запросе продуктов, — это не 'Product'
или 'Products'
а 'product'
:
1
2
3
|
$args = array(
‘post_type’ => ‘product’
);
|
Вложения
По умолчанию, если вы попытаетесь выполнить запрос для вложений, он не будет работать, так как WordPress устанавливает post_status
вложений для inherit
а WP_Query
умолчанию имеет значение 'post_status' => 'publish'
если не указано иное. Поэтому, если вы хотите запросить вложения, вы должны включить аргумент post_status
:
1
2
3
4
|
$args = array(
‘post_type’ => ‘attachment’,
‘post_status’ => ‘inherit’
);
|
Обратите внимание, что вы также можете использовать any
вместо inherit
.
Резюме
WP_Query
использую WP_Query
для создания пользовательских запросов к сообщениям и типам сообщений. Как вы видели из приведенных здесь примеров, существует множество возможностей:
- Используйте его для запроса страниц верхнего уровня на вашем сайте.
- Используйте его для запроса сообщений определенного типа.
- Используйте его для запроса всех сообщений, кроме указанных вами.
- Используйте его для запроса всех дочерних элементов текущей страницы.
Есть много других возможностей с использованием аргументов, описанных здесь, но это должно дать вам дегустатор.