- 03.06.15
- 19:05
- 3855
- 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.