В чем разница между term_id и term_taxonomy_id
Заголовок говорит сам за себя. В настоящее время в моих пользовательских таксономиях я получаю термины, используя идентификатор термина (term id) и имя таксономии.
Думал, что этот вопрос уже должен был быть задан ранее, но нигде не могу найти ответ! Поэтому решил спросить и посмотреть, есть ли у кого-нибудь ответы.
Если вы посмотрите документацию WordPress, то найдете информацию о таксономиях WordPress
- term_id — это ID термина в таблице terms
- term_taxonomy_id — это уникальный ID для связки термин + таксономия.
так манипулирование и выборка терминов только по term_id не приведёт к дубликатам?
Daithí
фактически только что ответил на последний вопрос. Посмотрел таблицу wp_terms и да, использование только term_id безопасно. Спасибо за ответ, @Juan
Daithí
Просто заметка: в WordPress 4.2 все термины были разделены, что означает, что каждый term_id теперь встречается только один раз в таблице term_taxonomy (раньше этот столбец не был уникальным, и термины могли использоваться в нескольких таксономиях). Это может продолжать развиваться в будущем, согласно дорожной карте таксономий. Одна из частей этого плана — объединение таблиц term и term taxonomy.
J.D.
Кодекс говорит:
- 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.