Статьи

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

До сих пор в этой серии вы узнали, как структурирован WP_Query и каковы его свойства и методы. Теперь мы рассмотрим различные аргументы, которые вы можете использовать с WP_Query и то, как вы их WP_Query .

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

В этом уроке я рассмотрю аргументы для запроса терминов таксономии.

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

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

  • taxonomy ( строка ): Таксономия.
  • field ( строка ): выберите термин таксономии ( 'term_id (по умолчанию), 'name' или 'slug' ).
  • terms ( int / string / array ): термин (ы) таксономии.
  • include_children ( логическое значение ): включение или отключение дочерних элементов для иерархических таксономий. По умолчанию true.
  • operator ( строка ): оператор для проверки. Возможные значения: 'IN' (по умолчанию), 'NOT IN' , 'AND' .

Тот факт, что у вас есть параметр operator означает, что вам не нужно выбирать один из диапазона доступных аргументов, чтобы определить, включаете ли вы или исключаете термины (как вы делаете для тегов и категорий), но используйте tax_query для tax_query таксономии вместо

Если вы хотите запросить несколько таксономий, вы можете также использовать параметр relation перед всеми вашими массивами (по одному для каждой таксономии) с помощью AND или OR чтобы указать, хотите ли вы найти сообщения со всеми терминами или с любым из них.

Это легче всего объяснить на некоторых примерах.

Это самый простой сценарий, включающий использование только одного вложенного массива:

1
2
3
4
5
6
7
8
9
$args = array(
    ‘tax_query’ => array(
        array(
            ‘taxonomy’ => ‘my-taxonomy’,
            ‘field’ => ‘slug’,
            ‘terms’ => ‘my-term-slug’,
        )
    )
);

Приведенные выше запросы для сообщений с my-term-slug в my-taxonomy taxonomy. Обратите внимание, что вам также необходимо использовать параметр field чтобы определить, какое поле вы используете для определения термина, если только вы не используете идентификатор термина, который используется по умолчанию. Если бы вы хотели использовать термин ID, вы бы использовали что-то вроде этого:

1
2
3
4
5
6
7
8
$args = array(
    ‘tax_query’ => array(
        array(
            ‘taxonomy’ => ‘my-taxonomy’,
            ‘terms’ => ’11’
        )
    )
);

Использование идентификатора затрудняет вам определение того, что ваш запрос ищет позднее, но избегает возможных проблем, если вы думаете, что ваши пользователи могут редактировать термин «слагы».

Если вы хотите идентифицировать посты с одним или несколькими массивами терминов в одной и той же таксономии, вы все равно пишете один вложенный массив, но добавляете массив терминов.

Например, чтобы запросить сообщения с любым из списка идентификаторов терминов из вашей таксономии, вы используете:

01
02
03
04
05
06
07
08
09
10
11
$args = array(
    ‘tax_query’ => array(
        array(
            ‘taxonomy’ => ‘my-taxonomy’,
            ‘terms’ => array(
                ’11’,
                ’12’
            )
        )
    )
);

Но что, если вы хотите запросить сообщения со всеми этими терминами? Вам нужно будет использовать параметр operator внутри вашего вложенного массива:

01
02
03
04
05
06
07
08
09
10
11
12
$args = array(
    ‘tax_query’ => array(
        array(
            ‘taxonomy’ => ‘my-taxonomy’,
            ‘terms’ => array(
                ’11’,
                ’12’
            ),
            ‘operator’ => ‘AND’
        )
    )
);

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

Другой сценарий, если вы хотите запросить посты, которые не имеют какого-либо массива терминов в одной таксономии, что вы делаете следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
$args = array(
    ‘tax_query’ => array(
        array(
            ‘taxonomy’ => ‘my-taxonomy’,
            ‘terms’ => array(
                ’11’,
                ’12’
            ),
            ‘operator’ => ‘NOT IN’
        )
    )
);

Здесь я заменил оператор AND на NOT IN , что означает, что WordPress будет искать сообщения без каких-либо терминов в массиве.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
$args = array(
    ‘tax_query’ => array(
        array(
            ‘taxonomy’ => ‘my-taxonomy’,
            ‘field’ => ‘slug’,
            ‘terms’ => array(
                ‘my-slug’,
                ‘your-slug’
            ),
            ‘operator’ => ‘NOT IN’
        )
    )
);

Другой сценарий, если вы хотите запросить сообщения, которые имеют один термин, но не другой. При этом используется оператор IN (который вам не нужно включать, поскольку он используется по умолчанию), со знаком минус перед идентификатором любых терминов, которые вы хотите исключить:

01
02
03
04
05
06
07
08
09
10
11
$args = array(
    ‘tax_query’ => array(
        array(
            ‘taxonomy’ => ‘my-taxonomy’,
            ‘terms’ => array(
                ’11’,
                ‘-12’
            )
        )
    )
);

Это запрашивает сообщения с термином 11, но не с термином 12.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
$args = array(
    ‘tax_query’ => array(
        ‘relation’ => ‘AND’,
        array(
            ‘taxonomy’ => ‘taxonomy1’,
            ‘field’ => ‘slug’,
            ‘terms’ => array( ‘slug-one’ )
        ),
        array(
            ‘taxonomy’ => ‘taxonomy2’,
            ‘field’ => ‘slug’,
            ‘terms’ => array( ‘slug-two’ )
        )
    )
);

Здесь я написал два вложенных массива: по одному для каждой таксономии, используя те же аргументы, что и для примеров, использующих только одну таксономию. Я предшествовал этому с аргументом relation . Вам нужно включить аргумент relation чтобы сообщить WordPress, ищет ли он все или некоторые записи, выводимые каждым массивом. Это работает следующим образом:

  • Если вы используете 'relation' => 'AND' , WordPress будет извлекать сообщения, указанные в первом и втором массивах. Таким образом, в приведенном выше примере будут запрашиваться только сообщения с slug-one в taxonomy1 и slug-two в taxonomy2 .
  • Если вы используете 'relation' => 'OR' , WordPress будет извлекать сообщения, выводимые первым или вторым массивом. Таким образом, в этом случае вы будете получать сообщения либо с slug-one либо slug-two (или обоими).

Этот код вы бы использовали, если искали посты с одним из двух слагов:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
$args = array(
    ‘tax_query’ => array(
        ‘relation’ => ‘OR’,
        array(
            ‘taxonomy’ => ‘taxonomy1’,
            ‘field’ => ‘slug’,
            ‘terms’ => array( ‘slug-one’ )
        ),
        array(
            ‘taxonomy’ => ‘taxonomy2’,
            ‘field’ => ‘slug’,
            ‘terms’ => array( ‘slug-two’ )
        )
    )
);

Вы также можете найти более одного термина в данной таксономии, добавив его в массив:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
$args = array(
    ‘tax_query’ => array(
        ‘relation’ => ‘OR’,
        array(
            ‘taxonomy’ => ‘taxonomy1’,
            ‘field’ => ‘slug’,
            ‘terms’ => array( ‘slug-one’ )
        ),
        array(
            ‘taxonomy’ => ‘taxonomy2’,
            ‘field’ => ‘slug’,
            ‘terms’ => array(
                ‘slug-two’,
                ‘slug-three’
            )
        )
    )
);

Комбинируя аргумент relation с вложенными запросами, также используя аргумент operator , вы можете создавать довольно сложные запросы. Приведенные ниже аргументы будут запрашивать сообщения с термином из одной таксономии, но без термина из другой таксономии:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
$args = array(
    ‘tax_query’ => array(
        ‘relation’ => ‘AND’,
        array(
            ‘taxonomy’ => ‘taxonomy1’,
            ‘field’ => ‘slug’,
            ‘terms’ => array( ‘slug-one’ ),
            ‘operator’ => ‘NOT IN’
        ),
        array(
            ‘taxonomy’ => ‘taxonomy2’,
            ‘field’ => ‘slug’,
            ‘terms’ => array( ‘slug-two’ )
        )
    )
);

Обратите внимание, что здесь я использовал 'relation' => 'AND' : если бы я использовал OR , он запрашивал сообщения с slug-two и сообщения без slug-one , а не с сообщениями, которые имеют slug-two но не slug-one , это то, что я ищу.

Можно было бы пойти дальше и запросить термины таксономий так, как вы хотели: используя аргумент operator в обоих вложенных запросах или добавив дополнительный вложенный запрос для запроса терминов в другой таксономии.

Вы можете быть удивлены, почему я не включил аргумент {tax} , где вы просто пишете свой аргумент следующим образом:

1
2
3
$args = array(
    ‘taxonomy1’ => ‘slug-one’
);

Возможно, вы знакомы с этим способом запроса таксономий, если вы делали это в прошлом, но сейчас он устарел и вам не следует его использовать. Так что придерживайтесь 'tax_query' ! Использование tax_query дает вам гораздо больше гибкости в любом случае.

Запрашивать таксономии немного сложнее, чем категории и теги, так как вам нужно разобраться с аргументом tax_query .

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