В чем разница между term_id и term_taxonomy_id
Заголовок говорит сам за себя. В настоящее время в моих пользовательских таксономиях я получаю термины, используя идентификатор термина (term id) и имя таксономии.
Думал, что этот вопрос уже должен был быть задан ранее, но нигде не могу найти ответ! Поэтому решил спросить и посмотреть, есть ли у кого-нибудь ответы.

Если вы посмотрите документацию WordPress, то найдете информацию о таксономиях WordPress
- term_id — это ID термина в таблице terms
- term_taxonomy_id — это уникальный ID для связки термин + таксономия.

так манипулирование и выборка терминов только по term_id не приведёт к дубликатам?

фактически только что ответил на последний вопрос. Посмотрел таблицу wp_terms и да, использование только term_id безопасно. Спасибо за ответ, @Juan

Просто заметка: в WordPress 4.2 все термины были разделены, что означает, что каждый term_id
теперь встречается только один раз в таблице term_taxonomy
(раньше этот столбец не был уникальным, и термины могли использоваться в нескольких таксономиях). Это может продолжать развиваться в будущем, согласно дорожной карте таксономий. Одна из частей этого плана — объединение таблиц term и term taxonomy.

Кодекс говорит:
- term_id — это ID термина в таблице terms
- term_taxonomy_id — уникальный ID для пары термин+таксономия
Что это означает?
Термин (term) — это слово. Оно может принадлежать к таксономии, такой как метки, категории или пользовательская таксономия. Суть в том, что может быть несколько таксономий, содержащих один и тот же термин.
Допустим, у вас есть термин "жирный". Это слово имеет идентификационный номер. Это term_id. Он не зависит от того, как это слово используется, то есть в каких таксономиях встречается термин.
Теперь слово "жирный" как метка записи также имеет номер. Это term_taxonomy_id. Он соответствует "метке записи 'жирный'".
Возможно, у вас также есть категория с названием "жирный". Хотя term_id остаётся тем же, term_taxonomy_id для "категории 'жирный'" будет другим.

Поскольку это часть более глубокого понимания структуры, я опишу её целиком... :)
В WordPress 4.5.3 по-прежнему присутствуют все эти таблицы (я буду говорить о них без префиксов):
- posts
- term_relationships
- term_taxonomy
- terms
Путь для получения читаемых названий терминов поста проходит через все эти таблицы.
posts
Главный идентификатор здесь — ID
— идентификатор поста (любого типа).
term_relationships
Хранит пары:
object_id
— может быть posts.ID
(но не обязан им быть)
term_taxonomy_id
— это НЕ идентификатор термина (категории), а идентификатор СВЯЗИ между термином (категорией) и таксономией ("типом категории").
term_taxonomy
Главный идентификатор здесь — term_taxonomy_id
, описанный выше ^^
Другие важные столбцы:
term_id
— идентификатор термина (категории)
taxonomy
— хранит таксономию термина ("тип категории")
Это может показаться забавным, но изначальная идея заключалась в добавлении возможности для терминов иметь несколько таксономий (что в некоторых случаях может иметь смысл).
terms
Главный идентификатор здесь — term_id
— идентификатор категории.
Другие важные столбцы:
name
— читаемое название категории, например, "Музыкальные жанры"
slug
— ЧПУ-ссылка термина, которую можно использовать, например, в URL.
Таким образом, прямолинейный демонстрационный SQL-запрос для
получения всех опубликованных постов и всех их категорий с читаемыми названиями
может выглядеть так (добавьте префиксы к таблицам при тестировании в своей базе данных WordPress):
SELECT * FROM
posts #получаем посты
LEFT JOIN
term_relationships #получаем связи постов с term_taxonomy
ON(posts.ID=term_relationships.object_id)
LEFT JOIN
term_taxonomy #получаем term_id
ON(term_relationships.term_taxonomy_id=term_taxonomy.term_taxonomy_id)
LEFT JOIN
terms #наконец, получаем названия терминов
ON(term_taxonomy.term_id=terms.term_id)
WHERE (
(posts.post_status='publish')
#дополнительно можно отфильтровать по определенному типу поста:
#AND
#(posts.post_type='some_post_type')
)
ORDER BY posts.ID ASC

Термин сам по себе не является категорией или меткой. Он должен получить контекст через таблицу term_taxonomy.
Таблица term_taxonomy определяет термин в рамках таксономии. Именно это делает термин категорией, меткой или частью произвольной таксономии (или комбинации таксономий).
term_id
- это ID термина в таблице terms.
term_taxonomy_id
- это уникальный ID для пары термин+таксономия.
term_id
всегда уникален, как и term_taxonomy_id
.
Оба имеют Auto Increment
в структуре таблицы.
Таблица wp_term_taxonomy
обеспечивает, например, создание категории, чтобы WordPress мог работать с ней. Например, WooCommerce использует: product_tag
, product_type
, product_cat
, все они являются так называемыми произвольными таксономиями.
Эта таблица также связывает структуру родитель/потомок через свой столбец parent
.
Последняя таблица, term_relationships, связывает объекты, такие как записи или ссылки, с term_taxonomy_id из таблицы term_taxonomy.
Если снова взять WooCommerce в качестве примера, эта таблица связывает тип записи products
с их таксономией product_cat
, которая содержит имя, например Computers, которое, конечно, извлекается из таблицы wp_terms
. Эта таблица содержит term_id
, name
, slug
и term_group
. (term_group я лично никогда не использовал)
Надеюсь, вышеизложенное немного проясняет различия и то, как WordPress использует эти таблицы.

Статья "Понимание и работа с таксономиями и терминами в WordPress" объясняет причину использования двух отдельных таблиц - wp_term
и wp_term_taxonomy
:
Во многих установках WordPress будет одна запись в таблице
wp_term_taxonomy
для каждого термина в таблицеwp_terms
, но в некоторых случаях у вас может быть более одной записи для каждого термина. Это происходит, когда вы создаете два термина с одинаковым именем и ярлыком (slug) в разных таксономиях, что позволяет создавать запросы для вывода записей с этим термином в нескольких таксономиях.Это означает, что связь между этими двумя таблицами является отношением "один ко многим": одна запись в таблице
wp_terms
может быть связана с несколькими записями в таблицеwp_term_taxonomy
, но каждая запись вwp_term_taxonomy
связана только с одной записью вwp_terms
.
