¿Cuál es la diferencia entre term_id y term_taxonomy_id?
El título lo dice todo. En este momento, en mis taxonomías personalizadas, estoy obteniendo los términos usando el ID del término y el nombre de la taxonomía.
Pensé que esta pregunta ya habría sido formulada antes, ¡pero no puedo encontrarla en ninguna parte! Así que decidí preguntar y ver si alguien tiene alguna respuesta.

Si revisas la documentación de Wordpress encontrarás Taxonomías de Wordpress
- term_id es el ID de un término en la tabla de términos
- term_taxonomy_id es un ID único para la combinación de término + taxonomía.

¿entonces manipular y obtener términos basándonos solo en el term_id no causaría duplicados?

en realidad acabo de responder esa última pregunta. Eché un vistazo a la tabla wp_terms y sí, usar solo el term_id es seguro. Gracias por tu respuesta @Juan

solo una nota de que en WordPress 4.2 todos los términos se dividieron, lo que significa que cada term_id
ahora aparecerá solo una vez en la tabla term_taxonomy
(antes la columna no era única y los términos podían compartirse entre taxonomías). Esto puede seguir evolucionando en el futuro, según el plan de taxonomías. Una parte de eso es combinar las tablas de términos y taxonomías.

El Codex dice:
- term_id es el ID de un término en la tabla terms
- term_taxonomy_id es un ID único para el par término+taxonomía
¿Qué significa esto?
Un término es una palabra. Puede pertenecer a una taxonomía, como etiquetas, categorías o una taxonomía personalizada. La cuestión es: puede haber varias taxonomías que contengan el mismo término.
Digamos que tienes un término llamado "engordante". Esta palabra tiene un número de identificación. Este es el term_id. No depende de cómo se use esta palabra, es decir, en qué taxonomías aparece el término.
Ahora la palabra "engordante" como etiqueta de entrada también tiene un número. Este es el term_taxonomy_id. Corresponde a "la etiqueta de entrada 'engordante'".
Quizás también tengas una categoría llamada "engordante". Mientras que el term_id es el mismo, el term_taxonomy_id para "la categoría 'engordante'" es diferente.

Como esto es parte de una comprensión más amplia del diseño, lo describiré en su totalidad... :)
En WP 4.5.3 todavía existen todas estas tablas (hablaré de ellas sin prefijo):
- posts
- term_relationships
- term_taxonomy
- terms
El camino para obtener los nombres legibles de los términos de una publicación pasa por todas ellas.
posts
el identificador principal aquí es ID
- un id de una publicación (de cualquier tipo)
term_relationships
almacena pares de:
object_id
- puede ser posts.ID
(pero no tiene que serlo)
term_taxonomy_id
- esto NO es el id de un término (categoría) sino un id de la RELACIÓN entre un término(categoría) y una taxonomía("tipo de categoría")
term_taxonomy
el identificador principal aquí es term_taxonomy_id
descrito arriba ^^
otras columnas importantes:
term_id
- un id de un término (categoría)
taxonomy
- almacena la taxonomía del término ("tipo de categoría")
Esto puede parecer gracioso, pero la intención inicial era añadir la capacidad de que los términos tuvieran más taxonomías (lo que en algunos casos puede tener sentido).
terms
el identificador principal aquí es term_id
- un id de una categoría
otras columnas importantes aquí son:
name
- nombre legible de la categoría, ej. "Géneros Musicales"
slug
- el slug de un término utilizable, ej. en URLs
Así que el SQL bruto para
obtener todas las publicaciones publicadas y todas sus categorías con los nombres de las categorías
podría verse así (añade prefijos a las tablas cuando lo pruebes en tu propia base de datos de WP):
SELECT * FROM
posts #obtiene publicaciones
LEFT JOIN
term_relationships #obtiene relaciones de publicaciones con term_taxonomies
ON(posts.ID=term_relationships.object_id)
LEFT JOIN
term_taxonomy #obtiene term_ids
ON(term_relationships.term_taxonomy_id=term_taxonomy.term_taxonomy_id)
LEFT JOIN
terms #finalmente, obtiene los nombres de los términos
ON(term_taxonomy.term_id=terms.term_id)
WHERE (
(posts.post_status='publish')
#opcionalmente puedes filtrar por un cierto post_type:
#AND
#(posts.post_type='some_post_type')
)
ORDER BY posts.ID ASC

Un término no es una categoría o etiqueta por sí mismo. Debe ser contextualizado a través de la tabla term_taxonomy.
La tabla term_taxonomy asigna un término dentro de una taxonomía. Esto es lo que convierte a un término en una categoría, una etiqueta o parte de una taxonomía personalizada (o en una combinación de taxonomías).
term_id
es el ID de un término en la tabla de términos.
term_taxonomy_id
es un ID único para el par término+taxonomía.
El term_id
siempre es único, al igual que el term_taxonomy_id
.
Ambos tienen un Auto Increment
en la estructura de la tabla.
La tabla wp_term_taxonomy
asegura, por ejemplo, que se cree una categoría para que WordPress pueda interactuar con ella. Por ejemplo, WooCommerce utiliza: product_tag
, product_type
, product_cat
, todos ellos son las llamadas taxonomías personalizadas.
Esta tabla también vincula la estructura padre/hijos con su columna parent
.
La tabla final, term_relationships, relaciona objetos como posts o enlaces con un term_taxonomy_id de la tabla term_taxonomy.
Si tomamos WooCommerce nuevamente como ejemplo, esta tabla vincula el tipo de post products
con su taxonomía product_cat
, que contiene un nombre, por ejemplo "Computadoras", el cual por supuesto se recupera de la tabla wp_terms
. Esta tabla contiene el term_id
, name
, slug
y term_group
. (personalmente nunca he utilizado term_group)
Espero que lo anterior aclare un poco más las diferencias y cómo WordPress utiliza estas tablas.

El artículo "Entendiendo y trabajando con taxonomías y términos en WordPress" explica la razón para usar dos tablas separadas - wp_term
y wp_term_taxonomy
:
En muchas instalaciones de WordPress, habrá un registro en la tabla
wp_term_taxonomy
por cada término en la tablawp_terms
, pero en algunos casos tendrás más de un registro por cada término. Esto ocurre cuando creas dos términos con el mismo nombre y slug en diferentes taxonomías, y significa que podrías crear una consulta para mostrar publicaciones con ese término en múltiples taxonomías.Esto significa que la relación entre estas dos tablas es de uno a muchos: un registro en la tabla
wp_terms
puede estar vinculado a múltiples registros en la tablawp_term_taxonomy
, pero cada registro enwp_term_taxonomy
solo está vinculado a un registro enwp_terms
.
