- 03.06.15
- 19:05
- 2700
- 2
В БД хранятся только термы и их метаданные. Информация о таксономиях находится на стороне PHP-кода.
Каждый терм имеет идентификатор, ярлык, имя и группу, а также связан со своей таксономией. Эта связь — «терм-таксономия» — обладает собственным идентификатором и привязывается к постам в качестве терма. К ней же относится его описание. Сам терм непосредственной связи с постами не имеет.
Идентификатор терма уникален в масштабе сайта, а его ярлык — только в рамках таксономии (начиная с версии WordPress 4.1; до того был уникальным полностью). Уникальность ярлыка контролируется функцией wp_unique_term_slug()
(см. wp-includes/taxonomy.php
).
В БД вся система термов размещена в четырёх таблицах (префикс стандартный — 'wp_'
):
wp_terms
— таблица термов, содержит:term_id
— идентификатор терма, уникален;name
,slug
— соотв. имя и ярлык терма, не уникальны;term_group
— группа терма — объединяет термы-псевдонимы;
Объединение в группы происходит по аргументу'alias_of'
функцийwp_insert_term
иwp_update_term
, содержащему ярлык терма-оригинала. Ручная установка группы — аргумент'term_group'
функцииwp_update_term
.
Таблица
wp_terms
только определяет термы, но не связывает их с таксономиями или постами.wp_term_taxonomy
— таблица отношения термов к таксономиям, содержит:term_taxonomy_id
— идентификатор отношения «терм-таксономия», уникален;
Может считаться более дееспособным идентификатором терма, нежелиterm_id
, потому что используется при привязке терма к посту.term_id
— идентификатор терма, здесь не уникален;taxonomy
— имя таксономии;description
— описание термаterm_id
в таксономииtaxonomy
;parent
—term_id
родительского терма;
В неиерархичных таксономиях и у термов без родителей равен 0.count
— количество постов, обладающих данным термом.
wp_term_relationships
— таблица связи постов с термами, содержит:object_id
— идентификатор объекта (поста любого типа — записи, вложения и т. п.);term_taxonomy_id
— идентификатор отношения «терм-таксономия»;term_order
— порядок следования термов;
Предназначается для таксономий, запоминающих последовательность прикреплённых к посту термов. Запоминание устанавливается аргументом'sort'
при регистрации таксономии.
wp_termmeta
— таблица метаданных термов, добавлена в WordPress 4.4. Полностью аналогична таблицам метаданных постов, пользователей и комментариев. Содержит поля:meta_id
— идентификатор поля метаданных,term_id
— идентификатор терма в wp_terms,meta_key
— ключ поля метаданных,meta_value
— сериализованное значение поля метаданных.
Из таблицы wp_term_relationships
видно отсутствие прямой связи между термами и постами. Из неуникальности term_id
в wp_term_taxonomy
можно сделать вывод, что один и тот же терм может принадлежать разным таксономиям и использоваться как разные термы. Но на практике такой ситуации не возникает: штатная функция создания термов wp_insert_term()
сразу же привязывает новый терм к заданной таксономии, а функция изменения терма wp_update_term()
проверяет единственность его term_id
в таблице wp_term_taxonomy
. Если вхождений term_id
оказывается несколько, терм дублируется для каждого дополнительного term_taxonomy_id
(см. функцию _split_shared_term()
в wp-includes/taxonomy.php
). В итоге, если работа ведётся штатными функциями, термы в таблице wp_term_taxonomy
оказываются уникальными.
Замечание 1: данные самих таксономий остаются на стороне выполняющихся PHP-скриптов: таксономии регистрируются при каждом запуске WordPress, и их параметры помещаются в глобальный хеш $wp_taxonomies
. Т. е. после вызова
1 |
register_taxonomy('taxonomy', 'post_type', $args); |
аргументы из $args
можно найти в $wp_taxonomies['taxonomy']
.
Замечание 2: в версии 4.4 была добавлена функция wp_term_is_shared($term_id)
, возвращающая true
, если терм $term_id
состоит сразу в нескольких таксономиях.
Замечание 3: на момент последней редакции этой заметки текущей версией WordPress была 4.4.2.
Дело в том, что в WordPress предусмотрена возможность создания своей собственной таксономии, которой можно дать какой угодно название. Я создал такую таксономию и дал ей название
genre
, которое и записалось в таблицуwp_term_taxonomy
.В таблицу
wp_term_taxonomy
записалась информация об отношении некоего терма к этой таксономии. Её название здесь находится в полеtaxonomy
.Но её данные, заданные в аргументах
$object_type
и$args
вызоваregister_taxonomy()
, остаются на стороне PHP — таксономии хранятся в глобальном массиве$wp_taxonomies
в виде экземпляров классаWP_Taxonomy
.