Таксономии WordPress со стороны БД

  • 03.06.15
  • 19:05
  • 1819
  • 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;
    • parentterm_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. Т. е. после вызова

аргументы из $args можно найти в $wp_taxonomies['taxonomy'].

Замечание 2: в версии 4.4 была добавлена функция wp_term_is_shared($term_id), возвращающая true, если терм $term_id состоит сразу в нескольких таксономиях.

Замечание 3: на момент последней редакции этой заметки текущей версией WordPress была 4.4.2.

Комментарии
Dedicated servers
12.05.2017
16:08:25

Дело в том, что в WordPress предусмотрена возможность создания своей собственной таксономии, которой можно дать какой угодно название. Я создал такую таксономию и дал ей название genre, которое и записалось в таблицу wp_term_taxonomy.

Индикатор
Готтфрид
12.05.2017
20:41:05

В таблицу wp_term_taxonomy записалась информация об отношении некоего терма к этой таксономии. Её название здесь находится в поле taxonomy.

Но её данные, заданные в аргументах $object_type и $args вызова register_taxonomy(), остаются на стороне PHP — таксономии хранятся в глобальном массиве $wp_taxonomies в виде экземпляров класса WP_Taxonomy.

Индикатор
Оставить комментарий

Добавить комментарий