Таксономії (терміни) у WordPress

Що таке таксономії у WordPress? Хто не знає, і тим, хто думає, що знає про таксономії все, буде корисно прочитати цю статтю. Я докладно розберу, що ховається під цим дивним словом, що воно означає в WordPress і як влаштовані таксономії. Думаю, у цьому розборі щось корисне знайде кожен.

Читайте також:


Про таксономії

Слово «Taxonomy» прийшло до нас, як завжди, з грецької: taxis – розташування, nomos – закон, принцип. Тобто. Таксономія – це принцип розташування чогось. Для WordPress – це принцип розташування записів .

Таксономії можна порівняти з папками на комп’ютері: куди складаються файли. Заходимо до папки, бачимо список файлів. У WordPress аналогічно: заходимо в таксономію (рубрику), бачимо список записів у ній.

Структура контенту в WordPress дуже проста: контент складається із записів та таксономій, які пов’язують ці записи – по суті, це все! До контенту також відносяться коментарі та файли, але й те й інше є частиною запису… Є ще користувачі, але це як би і не контент, а окрема сутність. Ось і виходить, що таксономії пов’язують лише записи.

Варто звернути увагу, що WordPress «Таксономія» – це лише назва, тобто. таксономії як такої немає – є лише запис про її існування. А щось реальне у таксономії – це її елементи. Наприклад, візьмемо таксономію «Рубрики» ( category) – це лише назва – запис у змінній PHP, а реальні дані таксономії – це створені рубрики – її елементи. Наприклад, якщо не створювати жодної рубрики, то умовно можна сказати, що таксономії немає (вона порожня) – у базі даних вона ніде не записана, а існує лише в змінних PHP, де вказано назву таксономії та її властивості (опції), причому створюється така змінна нальоту під час створення сторінки. Записи прив’язуються саме до елементів таксономії, а чи не до самої таксономії. Оскільки записи пов’язані ні з таксономією, і з її елементами, те й наступна робота з таксономією – це з її элементами.

Елементи таксономії називаються terms . Для стислості так і називатимемо їх – терміни.


Типи таксономій

Вище я казав, що під час створення таксономії їй задаються властивості. Одна з найважливіших властивостей – це тип таксономії. Так, таксономії поділяються на два типи:

  1. Деревоподібні – наприклад рубрики

  2. Лінійні (плоські) – наприклад, мітки

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

Схематично це виглядає якось так:


Базові таксономії WordPress

За промовчанням у WordPress існує п’ять таксономій:

  • category – рубрики

  • post_tag – мітки

  • post_format – прихована таксономія. Терміни цієї таксономії – це формати записів.

  • nav_menu – прихована таксономія. Терміни таксономії – це створені меню навігації, до них прикріплюються записи (посилання меню). Якщо меню створюється довільне посилання, її дані поміщаються в таблицю записів (wp_posts) з типом запису nav_menu_item , а запис прикріплюється до терміну. Усі опції посилання (URL, анкор тощо) зберігаються у метаполях запису. Те саме відбувається, якщо в цю таксономію міститься елемент іншої таксономії, наприклад рубрика – також створюється запис у таблиці записів, а дані містяться в метаполі запису. Система незграбна і не дуже практична, зате незалежна, добре розширюється, а головне проста – в стилі WordPress.

  • link_category – розділи для посилань, які відключені в останніх версіях. Докладніше про включення посилань .


Створення своїх таксономій

Створюється таксономія за допомогою функції register_taxonomy() або відповідного плагіна, наприклад, Custom Post Type UI. При цьому, як я вже говорив, до бази даних нічого не додається, а створюється тільки опис таксономії та її властивостей у глобальній змінній PHP та правилах ЧПУ. Як тільки було створено хоч один елемент таксономії, у БД з’являється запис про новий термін, а до нього вже можна прикріпити запис.

При створенні таксономії, їй можна вказати різні властивості (опції), наприклад:

  • тип : деревоподібна або плоска.

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

  • як виглядатиме посилання на елемент таксономії. Ця «хрень» називається ЧПУ (людина-зрозуміла УРЛ).

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

  • інші параметри … Повний список див. у описі функції register_taxonomy() .

Чому потрібно створювати довільні таксономії?

Якщо скрізь використовувати Рубрики, досить швидко ваш код перетворитися на кашу. В результаті розширювати функціонал сайту буде все складніше, а швидкість роботи буде повільнішою.

Припустимо, у нас є сайт з нерухомості з типом записів houses – вдома. Нам потрібно розподілити будинки за місцем, ціновою категорією, кількістю кімнат тощо. Все це можна реалізувати за допомогою стандартних рубрик і це дуже просто: створюємо рубрики: дешеві будинки, будинки у Воронежі, будинки з 3 кімнатами і т.д. Зі збільшенням кількості будинків та рубрик для них, шукати потрібні рубрики буде складніше, а зі збільшенням функцій сайту все складніше керуватиме всім цим – у результаті буде плутанина та банальні помилки у заповненні та в коді.

У цьому випадку нові таксономії в рази все спростять. Якщо у нас будуть окремі таксономії для кожної групи властивостей, наприклад sale_price , number_of_bedrooms , location , то у нас з’являться окремі блоки при редагуванні будинку, в яких зручніше зорієнтуватися і вибрати куди що розмістити, а також можна буде створювати окремі запити по кожному типу властивості. Все це матиме окремі назви, що спростить написання, розуміння та швидкість запитів.

Так може виглядати запит, коли потрібно отримати дешеві будинки у Воронежі:

$ Houses = get_posts (array (
	 'posts_per_page' => 8,
	 'orderby' => 'rand',
	 'post_type' => 'houses',
	 'sale_price' => 'cheap',
	 'location' => 'voronej'
)));

А якщо теж зробити з рубриками, то код вийде більше, буде менш зрозумілий і швидкий.

Створювати нові такси – це часто зручно та вигідно, зрештою.


Структура: таблиці таксономій у БД

У базі даних WordPress за таксономії відповідають, багато чимало, чотири таблиці. Розберемо кожну.


wp_term_relationships

Містить зв’язки термінів із записами. Таблиця показує, який запис якому терміну належить. Тільки ID терміна тут зв’язується через поле term_taxonomy_id , чому саме такий незрозумілий зв’язок описано в таблиці wp_term_taxonomy .

Ця таблиця містить лише три поля:

object_id
Містить ID запису (значення поля ID з таблиці
wp_posts ). Якщо
включена підтримка посилань , також буде містити ID посилання з таблиці
wp_links .
term_taxonomy_id
Містить значення того ж поля з таблиці
wp_term_taxonomy .
term_order

Містить порядок, у якому були зазначені терміни, при прикріпленні їх до запису. Наприклад, при редагуванні запису ми вказали їй 2 рубрики і 3 мітки, ось у якому порядку ми їх бачимо (вони передалися в запиті POST), такі значення сюди будуть записані: 1, 2 для рубрик, і 1, 2, 3 для міток.

За замовчуванням цю функцію вимкнено для всіх вбудованих таксономій (поле містить 0). Щоб її увімкнути, потрібно вказати параметр sort під час реєстрації таксономії, див. register_taxonomy() .


wp_term_taxonomy

Містить додаткові дані про елемент таксономії, зокрема важливі з них – це якої таксономії відноситься термін (поле taxonomy) і ID зв’язку з об’єктом (поле term_taxonomy_id).

term_taxonomy_id
ID рядка в цій таблиці зв’язується з полем
term_taxonomy_id з
wp_term_relationships .
term_id
ID термін. Зв’язується з полем
term_id з
wp_terms .
taxonomy
Назва таксономії, до якої належать термін.
description
Опис терміна.
parent
Містить ID батьківського терміна (для деревоподібних такс.).
count
Містить кількість записів у терміні.

Якщо встановлюється WP 4.2 або вище, то в БД буде один запис wp_term_taxonomy для кожного терміну wp_terms . Це означає, що значення полів term_taxonomy_id та term_id завжди будуть однакові.

До версії WP 4.4 може бути кілька записів одного терміна. Таке відбувалося, коли створювався термін, але в іншій таксономії вже був термін з такою самою назвою та ярликом. У цьому випадку новий термін у wp_terms не створювався, а натомість створювався новий запис у wp_term_taxonomy , який означав, що той термін належить до ще однієї таксономії. Саме для таких «мульти-термінів» потрібні були додаткові поля: description , parent та count , щоб вони відрізнялися для одного терміну та його різних таксономій.

З версії WP 4.2, всі “об’єднані” терміни були розділені і тепер кожен термін має свій унікальний ID, і навіть при збігу назви та ярлика термінів з різних таксах, створюються однакові записи в таблиці wp_terms . Такий підхід у рази зрозуміліший і простіший, єдиний мінус це можливе дублювання імен. Відразу так не здогадалися, а шкода.

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

Технічно таблиця wp_term_taxonomy не потрібна з версії 4.2, тому що логіка зберігання даних змінилася і за новою логікою поля taxonomy , description , parent і count можна помістити в таблицю wp_terms і переписати весь пов’язаний код движка і всіх плагінів. Але це не просто з огляду на повну зворотну сумісність WordPress (привіт тим, хто не любить оновлюватися). Тому поки що насолоджуватися новою логікою повною мірою неможливо.

При оновленні до версії WP 4.2 здвоєні терміни були розділені і тепер дані про поділ знаходяться в опції get_option(‘_split_terms’) , детальніше про це читайте в описі функції wp_get_split_terms() .

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

Якщо у вас стара структура і хочете її актуалізувати, то використовуйте такий код . Його я написав для цього сайту, щоб привести структуру таксономій у відповідність до нової логіки – щоб все було term_id = term_taxonomy_id.


wp_terms

Містить елементи таксономії (терміни) та базову інформацію про них. Це основна таблиця елементів таксономії. Залежить від таблиці wp_term_taxonomy – вони завжди йдуть у зв’язці.

term_id
Унікальний ID термін (ID рядка таблиці).
name
Назва терміна, пр: “Авторські функції”.
slug
Ярлик (склад) терміну, пр: «avtorskie-funkcii».
term_group
Застаріле поле більше не використовується.


wp_termmeta

Містить метадані термінів. Ця таблиця доповнює таблицю wp_terms .

У wp_termmeta прийнято зберігати будь-які додаткові дані терміна, наприклад це можуть бути СЕО поля: заголовок, опис і будь-що.

Структуру таблиця має таку ж, як і інші таблиці метаданих: wp_postmeta , wp_commentmeta , wp_usermeta . Логіка зберігання, кешування та отримання метаданих WP єдина всім типів метаданих: пости, такси, коментарі, користувачі (про це написав окрему статтю ).

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

meta_id
ID метаполя. Зазвичай ніде не використовується…
term_id
ID терміна з таблиці
wp_terms .
meta_key
Ключ метаполя.
meta_value
Значення метаполя. Завжди рядок, тобто. числа зберігаються як рядки, а масиви у серіалізованому вигляді.

До версії 4.4 терміни не мали метаполів і їх записували в опції, моторошний був час… Для тих часів я робив так .


Зв’язок усіх таблиць

Для створення своїх SQL запитів, коли базові функції не справляються чи справляються не оскільки хотілося б, потрібно знати як таблиці зв’язуються.

повну
схему таблиць БД

Давайте подивимося SQL запит, який зв’яже всі таблиці за допомогою JOIN. Запит нижче поверне всі записи типу post і дані до якого терміну прикріплено кожен запис:

SELECT t.name, t.term_id, tt.taxonomy, p.ID, p.post_title, p.post_date
FROM wp_terms t
	INNER JOIN wp_term_taxonomy tt ON (t.term_id = tt.term_id)
	INNER JOIN wp_term_relationships tr ON (tt.term_taxonomy_id = tr.term_taxonomy_id)
	INNER JOIN wp_posts p ON (tr.object_id = p.ID)
WHERE p.post_type = 'post'

Отримаємо:

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


Функції таксономії WordPress

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

edit_term_link()Отримує або виводить посилання (html тег A) на редагування зазначеного елемента таксономії (терміну).
get_edit_term_link()Отримує URL-адресу для редагування зазначеного елемента таксономії.
get_taxonomies()Отримує список зареєстрованих таксономій. Ви можете обмежити список за потрібними параметрами.
get_taxonomy()Отримує об’єкт, який містить налаштування (дані) про вказану таксономію.
get_term()Отримує дані про елемент таксономії (термін) за переданим ID.
get_term_by()Отримує зазначений термін (елемент таксономії) за: ім’ям (назвою), ярликом (слагою) або за ID терміном.
get_term_children()Отримує всі дочірні елементи вказаного елемента таксономії (категорії) як масиву.
get_term_field()Отримує поле терміна. Поле очищається функцією sanitize_term_field().
get_term_link()Отримує УРЛ на сторінку архіву терміна (елемента таксономії). Теж саме посилання на розділ рубрики.
get_terms()Отримує елементи (терміни) таксономії за вказаними параметрами.
is_taxonomy_hierarchical()Перевіряє чи деревоподібна зазначена таксономія. Умовний тег.
register_taxonomy()Створює нову довільну таксономію WordPress. Дозволяє змінити існуючу таксономію.
register_taxonomy_for_object_type()Прив’язує (додає) вказану таксономію до зазначеного типу запису (поста).
sanitize_term()Очищає всі поля елемента таксономії за допомогою sanitize_term_field() .
sanitize_term_field()Підготовляє (очищає) значення поля терміна (рубрик) для його використання в тексті або десь ще (залежить від контексту очищення).
single_term_title()Виводить на екран або отримує заголовок поточної таксономії (категорії, мітки тощо). Призначений для сторінок архівів.
taxonomy_exists()Перевіряє чи існує таксономія.
term_description()Отримує опис терміну (елемента таксономії: мітки, категорії тощо), який вказується на сторінці створення/редагування терміну.
term_exists()Перевіряє, чи існує вказаний елемент таксономії (розділ). Якщо є, повертає ID або масив даних цього елемента.
term_is_ancestor_of()Перевіряє, чи другий термін є дочірнім до першого (перевіряються всі рівні вкладеності). Умовний тег.
the_terms()Виводить список посилань на терміни (елементи таксономії), що належать до зазначеної посади.
unregister_taxonomy()Скасує реєстрацію зазначеної таксономії (видаляє таксономію).
unregister_taxonomy_for_object_type()Відкріплює таксономію від зазначеного типу запису (чи іншого об’єкта).
wp_count_terms()Вважає скільки в таксономії елементів (термінів), із записами чи без записів.
wp_delete_term()Видаляє термін (категорію, мітку) із Бази Даних.
wp_get_term_taxonomy_parent_id()Отримує ID батьківського елемента таксономії (терміну) до вказаного.
wp_insert_term()Додає новий елемент таксономії (термін, рубрику) до бази даних.
wp_update_term()Оновлює термін (елемент таксономії), використовуючи вказані дані.
get_term_meta()Отримує значення зазначеного мета поля елемента таксономії (рубрики, мітки тощо). Можна отримати всі значення як масиву.
add_term_meta()Додає мета поле (додаткове поле) для елемента вказаної таксономії (рубрики, мітки…).
update_term_meta()Оновлює метадані елемента таксономії (категорії, мітки…).
delete_term_meta()Видаляє цільове поле вказаного елемента таксономії.
has_term_meta()Отримує всі метадані зазначеного елемента таксономії (терміну).
register_term_meta()Реєструє метапол для зазначеної таксономії.

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

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

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *