В предыдущих частях этой серии вы узнали, как структурирован WP_Query
и каковы его свойства и методы. Следующим этапом является понимание различных аргументов, которые вы можете использовать с ним, и как лучше всего это сделать.
WP_Query
имеет большое количество возможных аргументов, что делает его чрезвычайно гибким. Поскольку вы можете использовать его для запроса практически всего, что содержится в вашей таблице wp_posts
, у него есть аргументы для каждой перестановки запроса, который вы, возможно, захотите выполнить для своего контента.
В этом уроке я рассмотрю два типа аргументов:
- категории
- теги
Аргументы для этих двух таксономий схожи, но есть некоторые различия, о которых вам нужно знать, если вы собираетесь использовать их эффективно.
Резюме о том, как аргументы работают в WP_Query
Прежде чем мы начнем, давайте WP_Query
как работают аргументы в WP_Query
. Когда вы WP_Query
в своих темах или плагинах, вам нужно включить четыре основных элемента:
- аргументы для запроса, используя параметры, которые будут рассмотрены в этом руководстве
- сам запрос
- петля
- завершение: сброс данных поста
На практике это будет выглядеть примерно так:
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 может не добавить все ваши аргументы в запрос, или вы можете получить белый экран.
Параметры категории
Начнем с параметров категории. У вас есть следующие варианты:
-
cat
( int ): используйте идентификатор категории. -
category_name
( строка ): использовать слаг категории (НЕ имя). -
category__and
( массив ): использовать идентификатор категории. -
category__in
( массив ): использовать идентификатор категории. -
category__not_in
( массив ): использовать идентификатор категории.
Обратите внимание, что ни для одного из них вы не используете название своей категории. Даже параметр category_name
принимает в качестве значения слаг, а не его имя. Я склонен использовать это вместо идентификатора, так как, когда я возвращаюсь к своему коду позднее, слагов легче идентифицировать, чем идентификаторов. Однако, если вы считаете, что пользователи вашего сайта могут изменить слаг для одной или нескольких категорий, я рекомендую использовать идентификатор, чтобы избежать каких-либо проблем.
Давайте посмотрим, как вы используете каждый из них.
Кот параметр
Параметр cat
прост: просто используйте один идентификатор категории или строку идентификаторов категории.
Запрос для одной категории выглядит так:
1
2
3
|
$args = array(
‘cat’ => ’12’
);
|
Запрос для нескольких категорий выглядит следующим образом:
1
2
3
|
$args = array(
‘cat’ => ’12, 13, 14′
);
|
Выше расскажет WordPress, чтобы получать сообщения, которые находятся в любой из перечисленных категорий. Если вы хотите найти сообщения в каждом из массива категорий, вы используете параметр category_and
, из которых более коротко.
Вы также можете использовать параметр cat, чтобы найти сообщения, относящиеся к одной категории, но не к другой, используя знак минуса перед идентификатором категории следующим образом:
1
2
3
|
$args = array(
‘cat’ => ’12, -13′
);
|
Выше будет запрашивать сообщения в категории 12
но не в категории 13
.
Параметр имя_категории
Параметр category_name
использует слаг категории, а не имя (сбиваю с толку, я знаю!). Опять же, вы можете использовать его с одной категорией или со строкой категорий, чтобы найти сообщения в любой из категорий.
Для запроса сообщений в одной категории вы добавляете:
1
2
3
|
$args = array(
‘category_name’ => ‘my-slug’
);
|
И чтобы найти сообщения в одной или нескольких категориях, используйте это:
1
2
3
|
$args = array(
‘category_name’ => ‘my-slug, your-slug, another-slug’
);
|
Как и в случае с параметром cat, он не найдет сообщения, относящиеся ко всем категориям, но найдет сообщения в любой из категорий.
Категория и параметр
Если вы хотите найти сообщения, которые находятся во всем массиве категорий, это параметр, который вы используете. Он принимает идентификаторы категории в качестве значения. Таким образом, чтобы найти сообщения во всех трех категориях, вы должны использовать:
1
2
3
4
5
6
7
|
$args = array(
‘category__and’ => array(
’12’,
’13’,
’14’
)
);
|
Обратите внимание, что здесь используется массив, а не строка, поэтому вы кодируете его по-другому. Параметр имеет два подчеркивания в названии: используйте только один, и он не будет работать.
Категория __ в параметре
Следующий параметр ищет сообщения в одной или нескольких массивах категорий. На самом деле он работает так же, как параметр cat, а также принимает идентификатор категории в качестве значения.
Таким образом, для запроса сообщений в одной или нескольких массивах категорий вы должны использовать:
1
2
3
4
5
6
7
|
$args = array(
‘category__in’ => array(
’12’,
’13’,
’14’
)
);
|
Выше будут получать сообщения из одной или нескольких из этих категорий.
Параметр category__not_in
Параметр category__not_in
делает то, что вы ожидаете: он запрашивает сообщения, которые не входят в категорию или массив категорий.
Чтобы исключить сообщения из одной категории, вы должны использовать следующее:
1
2
3
|
$args = array(
‘category__not_in’ => ’12’
);
|
И чтобы исключить посты из массива категорий:
1
2
3
4
5
6
7
|
$args = array(
‘category__not_in’ => array(
’12’,
’13’,
’14’
)
);
|
Это исключило бы сообщения из любой из этих категорий.
Параметры тега
У тегов есть немного отличающиеся параметры от категорий: боюсь, вы не можете понять, что они могут быть основаны на ваших знаниях параметров категории!
Параметры тега:
-
tag
( строка ): использовать тег slug. -
tag_id
( int ): использовать идентификатор тега. -
tag__and
( массив ): использовать идентификаторы тегов. -
tag__in
( массив ): использовать идентификаторы тегов. -
tag__not_in
( массив ): использовать идентификаторы тегов. -
tag_slug__and
( array ): использоватьtag_slug__and
. -
tag_slug__in
( массив ): использоватьtag_slug__in
.
Давайте посмотрим на каждый из них.
Тег Параметр
Параметр tag
принимает тег slug за свое значение и может использоваться для поиска сообщений с одним тегом или с любой строкой тегов.
Итак, чтобы найти сообщения с одним тегом, который вы используете:
1
2
3
|
$args = array(
‘tag’ => ‘my-tag’
);
|
И чтобы найти сообщения с тегами из массива тегов:
1
2
3
|
$args = array(
‘tag’ => ‘my-tag, your-tag, another-tag’
);
|
Обратите внимание, что приведенный выше запрос отправляет сообщения с любым из тегов в массиве, а не со всеми.
Параметр tag_id
Параметр tag_id
работает аналогично параметру cat
: он принимает идентификатор тега и может использоваться с одним тегом или несколькими тегами.
Чтобы найти сообщения с одним тегом, вы используете это:
1
2
3
|
$args = array(
‘tag_id’ => ’21’
);
|
Чтобы найти сообщения с одним или несколькими тегами из строки идентификаторов тегов:
1
2
3
|
$args = array(
‘tag_id’ => ’21, 22, 23′
);
|
Вы также можете использовать tag_id
для исключения тегов, когда используете его для одиночных тегов или нескольких тегов.
Таким образом, для запроса постов, кроме тех, которые имеют данный тег, вы должны использовать:
1
2
3
|
$args = array(
‘tag_id’ => ‘-21’
);
|
Хотя для поиска сообщений с одним из двух тегов, но без другого тега, вы должны использовать это:
1
2
3
|
$args = array(
‘tag_id’ => ’21, -22, 23′
);
|
Таким образом, приведенное выше будет запрашивать сообщения с одним или обоими тегами 21
или 23
но без тега 22
.
Тег__in Параметр
Этот параметр позволяет вам находить сообщения с одним или несколькими массивами тегов. Он работает так же, как tag
когда используется с массивом:
1
2
3
4
5
6
7
|
$args = array(
‘tag_in’ => array(
’21’,
’22’,
’23’
)
);
|
Это будет запрашивать сообщения с любым или всеми из перечисленных тегов. Если вы хотите найти сообщения со всеми тегами, вы используете tag__and
, о котором я расскажу tag__and
.
Параметр tag__not_in
Параметр tag__not_in
позволяет запрашивать сообщения, которые не имеют заданного тега или массива тегов.
Используйте это так, чтобы исключить один тег:
1
2
3
|
$args = array(
‘tag__not_in’ => array( ’21’ )
);
|
Обратите внимание, что вам все еще нужно использовать массив, даже если вы используете только один тег. Для большего количества тегов используйте:
1
2
3
4
5
6
7
|
$args = array(
‘tag__not_in’ => array(
’21’,
’22’,
’23’
)
);
|
Это будет запрашивать сообщения, которые не имеют ни одного из указанных выше тегов.
Параметры tag_slug__and и tag_slug__in
Эти два параметра ведут себя точно так же, как параметры tag__and
и tag__in
, за исключением того, что вы используете этот тег slug в своих массивах вместо идентификатора тега.
Так, например, чтобы найти сообщения, которые имеют пару тегов, вы используете tag__slug_in
:
1
2
3
4
5
6
7
|
$args = array(
‘tag_slug__in’ => array(
‘my-tag’,
‘your-tag’,
‘another-tag’
)
);
|
Это находит сообщения с любым из этих тегов. Вы также можете использовать параметр тега со строкой тегов для достижения того же результата.
Чтобы включить сообщения со всем набором тегов, используйте tag_slug__and
:
1
2
3
4
5
6
7
|
$args = array(
‘tag_slug__and’ => array(
‘my-tag’,
‘your-tag’,
‘another-tag’
)
);
|
Вместо того, чтобы запрашивать сообщения с любым из тегов, он запрашивает только те сообщения, которые имеют все теги.
Резюме
Запрос ваших сообщений по категориям и / или тегам — это то, что, скорее всего, у вас есть повод сделать с WP_Query
. Используя приведенные выше аргументы и комбинируя их при необходимости, вы можете создать мощные аргументы для извлечения именно тех данных, которые вам нужны, из базы данных.