Що таке таксономії / користувальницькі таксономії WordPress?

По суті таксономії — це спосіб групування інформації.

WordPress використовує власні вбудовані таксономії категорій і тегів, щоб забезпечити групування типів контенту і за замовчуванням застосовує їх до типу вмісту posts. Ці таксономії складаються з одного або декількох термінів, чиї назви, як правило, використовуються для групування елементів.

Іноді вам цілком достатньо стандартних класифікацій, в той час як іноді можуть знадобитися додаткові способи групування контенту, що викликано вашими потребами. Саме в таких випадках користувальницькі таксономії можуть виявитися винятково корисними.

Користувальницькі таксономії дозволяють задавати власні імена і структуру для організації записів. Ви можете створити нову таксономію під назвою grade_ranking, яка буде обробляти ранжування записів за шкалою з такими значеннями, як pass, credit, distinction і high distinction.

Стандартна інформація для таксономій

При визначенні таксономії вам потрібно вказати, чи буде це таксономія hierarchical або non-hierarchial. Це визначає те, як буде збиратися інформація у вашій таксономії.

hierarchical (ієрархічні) таксономії працюють подібно категоріями, що дозволяє створювати терміни різних рівнів (можна призначати батьківські і дочірні терміни).

non-hierarchial (не ієрархічні) таксономії діють як теги, де всі терміни належать до одного рівня.

Користувальницькі таксономії дозволяють вводити наступну інформацію для кожного з термінів:

  • Ім’я: визначає ім’я, використовуване для терміна, воно показується кінцевому користувачеві. Застосовується і до категорій, і до тегам;
  • Slug: визначає URL-адреса, що використовується для терміну (як правило, складається з символів нижнього регістру, розділених тире). Застосовується і до категорій, і до тегам;
  • Батьківський елемент: дозволяє визначити, чи є термін батьківським елементом верхнього рівня або це дочірній термін. Відноситься тільки до ієрархічним таксономиям, таким як категорії;
  • Опис: короткий опис того, що містить цей термін. Показується на сторінці списку термінів (коли ви клацаєте по посиланню, щоб переглянути сам термін).

Це все, що надає WordPress щодо ваших термінів.

Розширення класифікацій

Хоча інформації за замовчуванням вам може виявитися достатньо, ви також можете зберегти додаткову інформацію, яку можна використовувати в іншому місці на своєму сайті.

WordPress надає ряд звернень (hooks), які можна використовувати для зміни панелі адміністрування таксономії, і які допомагають у процесі збереження додаткової інформації.

У цій статті ми будемо розширювати таксономію за замовчуванням category. Ви можете легко розширити і вбудовані таксономії, і таксономії, які ви створили самі, але для простоти ми будемо змінювати існуючу таксономію.

З чого почнемо?

WordPress надає два основних способи, з допомогою яких можна створити терміни класифікацій:

  • Створення через панель адміністрування класифікацій;
  • «На льоту» при редагуванні типу запису, який пов’язаний з таксономією.

Наприклад, ви можете створити термін таксономії категорії, такий як featured або sponsored, або в меню адміністрування категорії (визначивши ім’я, slug, опис тощо), або шляхом їх створення безпосередньо з панелі редагування запису або сторінки (з допомогою мета-боксу категорії, додавши нову категорію динамічно).

Оскільки ми хочемо зберегти додаткову інформацію про наших термінах, ми будемо використовувати панель адміністрування таксономії, так як таким способом додавати, редагувати і видаляти терміни правильніше.

Що потрібно змінити?

При роботі з таксономією ви будете працювати і з панеллю редагування, і з панеллю додавання термінів. Відповідно ці панелі призначені для додавання нового терміна і редагування існуючого. WordPress надає ряд звернень, які призначені для того, щоб допомогти вам підключити певний функціонал, а також дати вам можливість просто змінити базовий функціонал.

Так як ми будемо зберігати додаткову інформацію, нам потрібно буде змінити обидві панелі, щоб ми могли докласти, зібрати і взаємодіяти з нашої збереженою інформацією.

У цій статті ми будемо додавати додаткові елементи форми, щоб ви могли зібрати більше інформації про категоріях. Ми налаштуємо захоплення інформації з допомогою наступних елементів:

  • текст;
  • текстове поле;
  • вибір елементів;
  • чекбокс.

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

Зміна панелі додати категорії

Перше, що нам потрібно буде змінити, це панель додати категорії. Через це меню ви, як правило, будете додавати всі ваші категорії, і через нього потрібно буде зберігати додаткову інформацію.

Ми повинні використовувати звернення category_add_form_fields.

Звернення category_add_form_fields використовується для додавання додаткової інформації в панель адміністрування категорії.

Це звернення приймає один аргумент, яким є ім’я самої таксономії. Воно дозволяє додати додаткову інформацію в панель адміністрування категорії, тому спочатку нам потрібно буде визначити функцію, яка виводить для нас кілька полів.

Наступний код повинен бути доданий до файлу functions.php вашої теми (або інший файл, який ви використовуєте для свого коду):

function add_extra_fields_to_category($taxonomy_name){
?>
Текстове поле

This is a text field

Текстове поле

Це текстове поле

Поле для вибору значень
Значення один
Значення два

Це поле для вибору значень

Опція перемикача один
Опція два перемикача

Це поле перемикання опцій

Тепер, коли наша функція визначена, все що нам потрібно зробити, це підключити її до обігу category_add_form_fields, і воно буде активувати функцію при виведенні панелі додати категорії. Ми будемо робити це через виклик функції:

add_action().
add_action(‘category_add_form_fields’,’add_extra_fields_to_category’);

Після цього в вашій панелі адміністрування категорії повинні з’явитися додаткові поля, які ми визначили в нашій функції. Вона повинна виглядати наступним чином:

В якості додаткового ради: коли ви визначаєте поля, які повинні бути додані в панель, ви, як правило, обертываете їх у клас form-field, це гарантує, що містяться елементи вводу будуть виводитися на всю ширину панелі.

Як ви можете бачити у нашому прикладі, я залишив цей клас підключеним для всіх елементів, крім перемикача опцій. Ми не хочемо, щоб чекбокс розтягувався на всю ширину панелі.

Крім того, якщо ви додасте клас form-required, це забезпечить те, що дане поле стане обов’язковим для заповнення. Новий термін неможливо буде додати, поки воно не заповнено.

Збереження нової інформації про категорії

Тепер, коли ми змінили панель додавання категорії, ми повинні зберегти додаткову інформацію, щоб пізніше використовувати її.

Нам потрібно буде підключити функцію до іншого зверненням, щоб викликати дія збереження. Це звернення create_category. Функція, яку ми створимо, буде обробляти збереження інформації нашого терміна.

При зборі інформації, яка буде безпосередньо записуватися в базу даних WordPress, завжди потрібно перевіряти безпеку даних. Ми можемо використовувати ‘sanitize_text_field($string)’, щоб перевірити безпеку рядків, прибрати всі теги видалити розриви рядків, відступи і перетворити значущі символи, такі, наприклад, як :

function save_extra_taxonomy_fields($term_id){
//збір всіх даних, пов’язаних з цією нової таксономії
$term_item = get_term($term_id,’category’);
$term_slug = $term_item->slug;
//збір даних з полів
$term_category_text = sanitize_text_field($_POST[‘category-text’]);
$term_category_textarea = sanitize_text_field($_POST[‘category-textarea’]);
$term_category_select = sanitize_text_field($_POST[‘category-select’]);
$term_category_radio = sanitize_text_field($_POST[‘category-radio’]);
//збереження інформації з користувацьких полів в таблиці wp-options
update_option(‘term_category_text_’ . $term_slug, $term_category_text);
update_option(‘term_category_textarea_’ . $term_slug, $term_category_textarea);
update_option(‘term_category_select_’ . $term_slug, $term_category_select);
update_option(‘term_category_radio_’ . $term_slug, $term_category_radio);
}

sanitize_text_field відмінно підходить для забезпечення безпеки цих значень. Тим не менш, тут ви можете знайти додаткові функції для обробки різних типів даних.

Дана функція приймає один параметр, ID нового зберігається терміна.

Маючи цей ID, ми можемо викликати функцію get_term($term_id,$taxonomy_name).

Ця функція приймає два параметри, ID самого терміна і ім’я таксономії. Так як ми знаємо ідентифікатор самого терміна, а також те, що ми маємо справу з таксономією category, тепер ми можемо отримати доступ до об’єкта терміна.

Ми збираємо значення slug з терміна об’єкта і зберігаємо його. Після цього ми збираємо всі чотири значення нових полів об’єкта $_POST. Нарешті ми викликаємо іншу функцію update_option($назва_параметра,$option_value).

Ця функція дозволяє створювати нову запис в таблиці опцій WordPress, щоб з її допомогою ми могли зберегти наше значення. Все, що потрібно цій функції, це назва нової опції та її значення. Ми викликаємо дану функцію чотири рази, по одному разу для кожного з нових полів.

Наприклад, якщо ми створюємо нову категорію під назвою test, коли ми зберігаємо інформацію з текстового поля, опції буде term_category_textarea_test, коли зберігаємо дані з поля вибору варіантів, ім’я буде — text_category_select_test і т. д. Ми додаємо для цих полів slug в кінці імені, щоб забезпечити унікальність значень (так як всі значення slug є унікальними).

Тепер нам потрібно підключити цю функцію до обігу create_category:

add_action(‘create_category’,’save_extra_taxonomy_fields’);

Зміна панелі редагування категорії

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

Для відображення наших додаткових полів нам потрібно буде підключитися до обігу category_edit_form_fields.

Звернення category_edit_form_fields використовується для виведення додаткових полів в панелі редагування категорій. Це звернення приймає одне значення — сам об’єкт терміна. Так як це звернення буде мати доступ до самого об’єкту терміна, нам буде дуже просто зібрати інформацію.

Ми повинні створити функцію, яка буде виводити додаткові поля і попередньо заповнити їх збереженою раніше інформацією. Оскільки у нас тепер є доступ до об’єкта терміна, це буде легко:

function edit_extra_fields_for_category($term){
//збір slug термінів
$term_slug = $term->slug;
//збір інформації, збереженої з нових полів
$term_category_text = get_option(‘term_category_text_’ . $term_slug);
$term_category_textarea = get_option(‘term_category_textarea_’ . $term_slug);
$term_category_select = get_option(‘term_category_select_’ . $term_slug);
$term_category_radio = get_option(‘term_category_radio_’ . $term_slug);
//виведення додаткових полів?>

Текстове поле

Це текстове поле

Поле текстової області

Це поле текстової області

Поле вибору варіантів

Опція два перемикача

Це полі перемикача опцій

Ця функція використовує свій попередній об’єкт term для доступу до slug самого терміна. За допомогою цього slug, вона шукає чотири збережених значення користувальницьких полів, використовуючи функцію get_option($назва_параметра).

Ця функція шукає опції з вказаним іменем і присвоює їм значення. У нашому випадку ми шукаємо чотири значення полів і присвоюємо їх змінним.

Велика частина цієї функції виводить елементи нашої HTML-форми, вони будуть додані як табличні елементи. Для кожного з наших полів ми відображаємо мітки і елементи текстового поля, текстової області, поля вибору варіантів або поля перемикання опцій.

Спосіб, за допомогою якого ми попередньо заповнюємо наші користувальницькі поля, відрізняється для кожного типу полів.
Ось що ми робимо:

  • Текстове поле — для текстового поля ми призначаємо значення його атрибуту value, який буде попередньо заповнюватися сам собою;
  • Поле текстової області — для текстової області ми виводимо її значення між тегами і , внаслідок чого значення виводиться в елементі текстової області;
  • Поле вибору варіантів для вибору варіантів ми спочатку створюємо елемент вибору варіантів і всі пов’язані з ним параметри. Ми додаємо елемент вибору варіантів атрибут, який називається value, і заповнюємо його нашим збереженим значенням (це дуже схоже на те, як ми розібралися з текстовим полем). Навіть з урахуванням того, що ми виводимо всі можливі значення списком, нам все одно потрібно визначити, який варіант у даний момент призначений. Тому ми перебираємо кожен з можливих варіантів вибору в елементі і визначаємо, чи збігається його значення, з тим значенням, яке ми зібрали раніше. Якщо так, то в даний момент він є обраним варіантом. Ми використовуємо оператор IF, і, якщо він визначає збіг значення опції атрибут selected, то цей варіант використовується браузером, як варіант за замовчуванням;
  • Полі перемикача опцій — для цього поля ми виводимо опції безпосередньо на сторінку і визначаємо, чи відповідає їх значення значенням, що зберігається у базі даних. Якщо це так ми використовуємо оператор IF для виведення у поле атрибут checked. Цей атрибут вказує браузеру прийняти цю опцію як значення за замовчуванням (багато в чому це схоже на обробку виведення поля вибору варіантів, так як ми повинні вказати браузеру, яку опцію виводити).

Забезпечення коректності попереднього заповнення цих значень є критично важливим, щоб користувач зробив правильний вибір при оновленні терміна таксономії. Інакше дані можуть бути несумісні.

Все, що тепер нам залишилося зробити, це підключити нашу нову функцію до обігу category_edit_form_fields, і тоді вона буде виконуватися, коли ми викликаємо панель редагування термінів:

add_action(‘category_edit_form_fields’,’edit_extra_fields_for_category’);

Після підключення цієї функції ваш екран редагування категорії повинен оновитися, і в ньому з’являться додаткові поля та значення. Тепер він виглядає наступним чином:

Розширення класифікацій WordPress

Збереження оновленої інформації про категорії

Коли ми оновлюємо нашу інформацію про категорії, ми повинні використовувати функцію, яка буде зберігати наші нові значення полів.

На щастя, у нас вже є така функція. Раніше ми створили функцію save_extra_taxonomy_fields($term_id), яку ми використовували при додаванні нового терміна в категорію.

Ми можемо викликати цю функцію при оновленні категорії, підключивши її до іншого поводження. Ми підключаємо нашу функцію save_extra_taxonomy_fields($term_id) до звернення edit_category, і коли ми оновлюємо категорію, ця функція буде зберігати інформацію:

add_action(‘edit_category’,’save_extra_taxonomy_fields’);

Розширення користувацьких таксономій

Користувальницькі таксономії можуть бути розширені тим же чином, що і вбудовані (категорії та теги).

Єдине, що потрібно буде змінити, це імена використовуваних звернень.

Для категорій ви повинні використовувати наступні звернення:

  • category_add_form_fields – додавання полів у панель додавання нової категорії;
  • category_edit_form_fields – додавання полів у панель редагування категорій;
  • create_category – використовується, коли ви хочете зберегти нові терміни категорії;
  • edit_category – використовується, коли ви хочете оновити терміни категорії.

Ці звернення з’єднують вас з областями, які необхідно відредагувати, що дозволяє зберігати і отримувати додаткову інформацію.

Для користувача таксономії вони будуть дуже схожі, звернення, які ви повинні використовувати, динамічні, і засновані на імені вашої таксономії. Це можуть бути:

  • $TAXONOMY_NAME_add_form_fields;
  • $TAXONOMY_NAME_edit_form_fields;
  • create_$TAXONOMY_NAME;
  • edit_$TAXONOMY_NAME.

Наприклад, якщо ви зареєстрували власну таксономію під назвою members, ваші звернення будуть називатися:

  • members_add_form_fields;
  • members_edit_form_fields;
  • create_members;
  • edit_members.

Ви повинні слідувати цій загальній схемі і застосовувати її до ваших користувальницьким таксономиям. Тоді у вас буде можливість редагувати ці панелі і зберегти інформацію, як вам треба.

На закінчення всього цього

Тепер, коли ви знаєте, як зберігати додаткову інформацію ваших таксономій / термінів, ви можете розширити функціонал WordPress, щоб він більше підходив під ваші задачі.

Ви можете отримати доступ до конкретних термінів з допомогою get_term($term_name,$taxonomy_name), а потім звідти ви можете використовувати slug, так як ви вже отримали доступ до додаткової інформації, яка вилучається з таблиці опцій WordPress.

Ви можете редагувати файли своїх дочірніх тем та інші ресурси, щоб скористатися цією новою інформацією. Я б почав з редагування файлу category.php або tag.phpякщо ви змінили ці таксономії, щоб підтягнути нову інформацію.

Практично не існує обмежень того, наскільки складні зміни ви можете вносити свої таксономії, так як ви можете зберігати будь-яку інформацію, яка вам потрібна, і виводити її по мірі необхідності.

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