Статьи

Аргументы WP_Query: категории и теги

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

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

В этом уроке я рассмотрю два типа аргументов:

  • категории
  • теги

Аргументы для этих двух таксономий схожи, но есть некоторые различия, о которых вам нужно знать, если вы собираетесь использовать их эффективно.

Прежде чем мы начнем, давайте 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 делает то, что вы ожидаете: он запрашивает сообщения, которые не входят в категорию или массив категорий.

Чтобы исключить сообщения из одной категории, вы должны использовать следующее:

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 работает аналогично параметру 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 .

Этот параметр позволяет вам находить сообщения с одним или несколькими массивами тегов. Он работает так же, как tag когда используется с массивом:

1
2
3
4
5
6
7
$args = array(
    ‘tag_in’ => array(
        ’21’,
        ’22’,
        ’23’
    )
);

Это будет запрашивать сообщения с любым или всеми из перечисленных тегов. Если вы хотите найти сообщения со всеми тегами, вы используете tag__and , о котором я расскажу tag__and .

Параметр 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__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 . Используя приведенные выше аргументы и комбинируя их при необходимости, вы можете создать мощные аргументы для извлечения именно тех данных, которые вам нужны, из базы данных.