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

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

Вспоминаем, как работают аргументы в WP_Query

Когда вы используете WP_Query в темах оформления или плагинах, приходится включать в программный код четыре основных элемента:

  • Аргументы для запроса, в которых используются настройки;
  • Сам запрос;
  • Цикл;
  • Завершающий этап: сброс данных записи.

На практике это выглядит следующим образом:

<?php$args = array( // Аргументы для запроса);// Произвольный запрос$query = new WP_Query( $args);// Проверка наличия результатов запросаif( $query->have_posts()) { // начало цикла обработки данных из результатов запроса while( $query->have_posts()) { $query->the_post(); // содержимое опрашиваемой записи }}// восстановление исходных данных записиwp_reset_postdata();?>

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

$args = array( // Аргументы для запроса);

Как видно, аргументы заключены в массив.

Создаем код для аргументов

Есть специальный формат установки аргументов в массиве:

$args = array(    'parameter1' => 'value',    'parameter2' => 'value',    'parameter3' => 'value');

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

Настройки таксономии

Установка настроек для терминов таксономии сложнее, поскольку здесь необходимо использовать tax_query. При помощи следующих настроек прописывается вложенный массив аргументов для указания таксономии и термина:

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

Благодаря параметре operator, вам не необходимо выбирать один из доступных аргументов, чтобы определить включены или исключены термины(как это делается при работе с тегами и рубриками). Вместо этого необходимо использовать tax_query для всего, что связано с таксономиями.

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

Запрос к одному термину таксономии

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

$args = array(    'tax_query' => array(        array(            'taxonomy' => 'my-taxonomy',            'field' => 'slug',            'terms' => 'my-term-slug',)  ));

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

$args = array(    'tax_query' => array(        array(            'taxonomy' => 'my-taxonomy',            'terms' => '11'        )    ));

Использование ID в будущем может усложнить процесс идентификации того, что должен искать запрос, но сможет избежать проблем, если никто из посетителей и редакторов не будет изменять короткие имена терминов.

Делаем запрос к нескольким терминам в одной таксономии

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

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

$args = array(    'tax_query' => array(        array(            'taxonomy' => 'my-taxonomy',            'terms' => array(                '11',                '12'            )        )    ));

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

$args = array(    'tax_query' => array(        array(            'taxonomy' => 'my-taxonomy',            'terms' => array(                '11',                '12'            ),            'operator' => 'AND'        )    ));

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

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

$args = array(    'tax_query' => array(        array(            'taxonomy' => 'my-taxonomy',            'terms' => array(                '11',                '12'            ),            'operator' => 'NOT IN'        )    ));

Здесь мы заменили оператор AND на NOT IN , а это значит, что WordPress найдет записи, которые не содержат термины, указанные в массиве.

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

$args = array(    'tax_query' => array(        array(            'taxonomy' => 'my-taxonomy',            'field' => 'slug',            'terms' => array(                'my-slug',                'your-slug'            ),            'operator' => 'NOT IN'        )    ));

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

$args = array(    'tax_query' => array(        array(            'taxonomy' => 'my-taxonomy',            'terms' => array(                '11',                '-12'            )        )    ));

Этот код осуществляет запрос записей с термином 11, но без термина 12.

Запрашиваем термины из нескольких таксономий

Для работы с несколькими таксономиями необходимо создать больше массивов. Пример, в котором осуществляется запрос записей с одним термином из taxonomy1 и иным из taxonomy2 :

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

Это работает следующим образом:

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

Такой код обычно используется, когда необходимо найти записи с любым из двух slug :

$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' )        )    ));

Вы также можете без труда осуществить поиск записей с более чем одним термином в заданной таксономии, просто добавив их в массив:

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

$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

Вам, наверное, интересно, почему я не использовала аргумент {tax} , и вместо этого использую код:

$args = array(    'taxonomy1' => 'slug-one');

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

В завершение

Создавать запросы для таксономий сложнее, чем к рубрикам и тегам из-за использования аргумента tax_query .

Но это достаточно мощный аргумент, который обладает большой гибкостью.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *