Qual è la differenza tra term_id e term_taxonomy_id
Il titolo dice tutto. Al momento, nelle mie tassonomie personalizzate, sto recuperando i termini utilizzando l'ID del termine e il nome della tassonomia.
Pensavo che questa domanda fosse già stata posta prima, ma non riesco a trovarla da nessuna parte! Quindi ho pensato di chiedere e vedere se qualcuno ha delle risposte.

Se dai un'occhiata alla documentazione di Wordpress troverai Tassonomie di Wordpress
- term_id è l'ID di un termine nella tabella dei termini
- term_taxonomy_id è un ID univoco per la coppia termine + tassonomia.

quindi manipolare e recuperare i termini basandosi solo sul term_id non causerebbe duplicati allora?

in realtà ho appena risposto all'ultima domanda. Ho dato un'occhiata alla tabella wp_terms e sì, usare solo il term_id è sicuro. Grazie per la tua risposta @Juan

Giusto una nota che in WordPress 4.2 tutti i termini sono stati separati, il che significa che ogni term_id
ora apparirà una sola volta nella tabella term_taxonomy
(prima la colonna non era univoca e i termini potevano essere condivisi tra tassonomie). Questo potrebbe continuare a evolversi in futuro, in base alla roadmap delle tassonomie. Una parte di questo è combinare le tabelle dei termini e delle tassonomie.

Il Codex dice:
- term_id è l'ID di un termine nella tabella terms
- term_taxonomy_id è un ID univoco per la coppia termine+tassonomia
Cosa significa?
Un termine è una parola. Può appartenere a una tassonomia, come tag, categorie o una tassonomia personalizzata. Il punto è: possono esserci diverse tassonomie che contengono lo stesso termine.
Supponiamo che tu abbia un termine chiamato "ingrassante". Questa parola ha un numero ID. Questo è il term_id. Non dipende da come questa parola viene utilizzata, cioè in quali tassonomie appare il termine.
Ora la parola "ingrassante" come tag di un post ha anche un numero. Questo è il term_taxonomy_id. Corrisponde a "il tag 'ingrassante'".
Forse hai anche una categoria chiamata "ingrassante". Mentre il term_id è lo stesso, il term_taxonomy_id per "la categoria 'ingrassante'" è diverso.

Poiché questo fa parte di una comprensione più ampia del design, lo descriverò nel suo insieme... :)
In WP 4.5.3 ci sono ancora tutte queste tabelle (ne parlerò senza prefisso):
- posts
- term_relationships
- term_taxonomy
- terms
Il percorso per ottenere i nomi leggibili dei termini dei post passa attraverso tutte queste tabelle.
posts
l'identificatore principale qui è ID
- un id di un post (di qualsiasi tipo)
term_relationships
memorizza coppie di:
object_id
- può essere posts.ID
(ma non deve esserlo necessariamente)
term_taxonomy_id
- questo NON è l'id di un termine (categoria) ma un id della RELAZIONE tra un termine (categoria) e una tassonomia ("tipo di categoria")
term_taxonomy
l'identificatore principale qui è term_taxonomy_id
descritto sopra ^^
altre colonne importanti:
term_id
- un id di un termine (categoria)
taxonomy
- memorizza la tassonomia del termine ("tipo di categoria")
Questo potrebbe sembrare divertente, ma l'intenzione iniziale era aggiungere la capacità per i termini di avere più tassonomie (che in alcuni casi può avere senso).
terms
l'identificatore principale qui è il term_id
- un id di una categoria
altre colonne importanti qui sono:
name
- nome leggibile della categoria, ad esempio "Generi musicali"
slug
- lo slug di un termine utilizzabile ad esempio negli URL
Quindi la brutale dimostrazione SQL per
ottenere tutti i post pubblicati e tutte le loro categorie con i nomi delle categorie
potrebbe essere questa (aggiungi i prefissi alle tabelle quando testi sul tuo database WP):
SELECT * FROM
posts #ottiene i post
LEFT JOIN
term_relationships #ottiene le relazioni dei post con term_taxonomies
ON(posts.ID=term_relationships.object_id)
LEFT JOIN
term_taxonomy #ottiene gli term_ids
ON(term_relationships.term_taxonomy_id=term_taxonomy.term_taxonomy_id)
LEFT JOIN
terms #finalmente, ottiene i nomi dei termini
ON(term_taxonomy.term_id=terms.term_id)
WHERE (
(posts.post_status='publish')
#opzionalmente puoi filtrare per un certo post_type:
#AND
#(posts.post_type='some_post_type')
)
ORDER BY posts.ID ASC

Un termine non è una categoria o un tag di per sé. Deve essere contestualizzato tramite la tabella term_taxonomy.
La tabella term_taxonomy assegna un termine a una tassonomia. Questo è ciò che rende un termine una categoria, un tag o parte di una tassonomia personalizzata (o in una combinazione di tassonomie).
term_id
è l'ID di un termine nella tabella terms.
term_taxonomy_id
è un ID univoco per la coppia termine+tassonomia.
Il term_id
è sempre univoco così come il term_taxonomy_id
.
Entrambi hanno un Auto Increment
nella struttura della tabella.
La tabella wp_term_taxonomy
assicura, ad esempio, che una categoria venga creata, in modo che WordPress possa interagirci. Ad esempio, WooCommerce utilizza: product_tag
, product_type
, product_cat
, tutti loro sono le cosiddette tassonomie personalizzate.
Questa tabella stabilisce anche la struttura genitore/figlio. Con la sua colonna parent
.
L'ultima tabella, term_relationships, collega oggetti come post o link a un term_taxonomy_id dalla tabella term_taxonomy.
Se prendiamo di nuovo WooCommerce come esempio, questa tabella collega il tipo di post products
alla loro tassonomia product_cat
, che contiene un nome, ad esempio Computer, che ovviamente è recuperato dalla tabella wp_terms
. Questa tabella contiene term_id
, name
, slug
e term_group
. (term_group personalmente non l'ho mai usato)
Speriamo che quanto sopra renda le cose un po' più chiare riguardo alle differenze e a come WordPress utilizza queste tabelle.

L'articolo "Comprendere e lavorare con le tassonomie e i termini in WordPress" spiega il motivo per cui vengono utilizzate due tabelle separate - wp_term
e wp_term_taxonomy
:
In molte installazioni WordPress, ci sarà un record nella tabella
wp_term_taxonomy
per ogni termine nella tabellawp_terms
, ma in alcuni casi avrai più di un record per ogni termine. Questo accade quando crei due termini con lo stesso nome e slug in tassonomie diverse, e significa che potresti creare una query per visualizzare post con quel termine in più tassonomie.Ciò significa che la relazione tra queste due tabelle è uno-a-molti: un record nella tabella
wp_terms
può essere collegato a più record nella tabellawp_term_taxonomy
, ma ogni record inwp_term_taxonomy
è collegato a un solo record inwp_terms
.
