У попередніх статтях цієї серії ми встигли познайомитися зі структурою класу WP_Query, а також його параметрами і методами. Тепер настав час навчитися використовувати різні аргументи. Сьогодні ми познайомимо вас з аргументами, необхідними для запитів до термінів таксономії.

Згадуємо, як працюють аргументи в WP_Query

Коли ви використовуєте WP_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.

Але це досить потужний аргумент, який володіє великою гнучкістю.

Переклад статті «WP_Query Arguments: Taxonomies» був підготовлений дружною командою проекту Сайтостроение від А до Я.