Care este diferența dintre term_id și term_taxonomy_id
Titlul spune totul. În prezent, în taxonomiile mele personalizate, obțin termenii folosind ID-ul termenului și numele taxonomiei.
M-am gândit că această întrebare ar fi fost pusă înainte, dar nu o pot găsi nicăieri! Așa că m-am gândit să întreb și să văd dacă cineva are vreun răspuns.

Dacă aruncați o privire în documentația WordPress, veți găsi Taxonomiile WordPress
- term_id este ID-ul unui termen din tabela de termeni
- term_taxonomy_id este un ID unic pentru perechea termen + taxonomie.

deci manipularea și extragerea termenilor bazată doar pe term_id nu ar provoca duplicate atunci?

de fapt tocmai am răspuns la ultima întrebare. Am verificat tabela wp_terms și da, folosirea doar a term_id este sigură. Mulțumesc pentru răspuns, @Juan

Doar o notă că în WordPress 4.2 toți termenii au fost separați, ceea ce înseamnă că fiecare term_id
va apărea acum doar o singură dată în tabela term_taxonomy
(înainte coloana nu era unică și termenii puteau fi partajați între taxonomii). Acest lucru poate continua să evolueze în viitor, bazat pe planul de taxonomie. O parte din acesta este combinarea tabelelor term și term taxonomy.

Codex spune:
- term_id este ID-ul unui termen din tabelul terms
- term_taxonomy_id este un ID unic pentru perechea termen+taxonomie
Ce înseamnă asta?
Un termen este un cuvânt. Acesta poate aparține unei taxonomii, cum ar fi etichete, categorii sau o taxonomie personalizată. Ideea este: pot exista mai multe taxonomii care conțin același termen.
Să presupunem că ai un termen numit "îngrășare". Acest cuvânt are un număr de identificare. Acesta este term_id. Nu depinde de modul în care este folosit acest cuvânt, adică în ce taxonomii apare termenul.
Acum, cuvântul "îngrășare" ca etichetă de articol are și el un număr. Acesta este term_taxonomy_id. Acesta corespunde "etichetei de articol 'îngrășare'".
Poate ai și o categorie numită "îngrășare". În timp ce term_id este același, term_taxonomy_id pentru "categoria 'îngrășare'" este diferit.

Deoarece aceasta face parte dintr-o înțelegere mai amplă a design-ului, o voi descrie în întregime... :)
În WordPress 4.5.3 există încă toate aceste tabele (voi vorbi despre ele fără prefix):
- posts
- term_relationships
- term_taxonomy
- terms
Calea pentru a obține numele lizibile ale termenilor unui post trece prin toate acestea.
posts
identificatorul principal aici este ID
- un ID al unui post (de orice tip)
term_relationships
stochează perechi de:
object_id
- poate fi posts.ID
(dar nu trebuie să fie)
term_taxonomy_id
- acesta NU este ID-ul unui termen (categorie) ci un ID al RELATIEI dintre un termen (categorie) și o taxonomie ("tip de categorie")
term_taxonomy
identificatorul principal aici este term_taxonomy_id
descris mai sus ^^
alte coloane importante:
term_id
- un ID al unui termen (categorie)
taxonomy
- stochează taxonomia termenului ("tip de categorie")
Aceasta poate părea amuzantă, dar intenția inițială a fost de a adăuga posibilitatea ca termenii să aibă mai multe taxonomii (ceea ce în anumite cazuri poate avea sens).
terms
identificatorul principal aici este term_id
- un ID al unei categorii
alte coloane importante aici sunt:
name
- numele lizibil al categoriei, de ex. "Genuri muzicale"
slug
- slug-ul termenului, utilizabil de ex. în URL
Deci, un exemplu brutal de SQL pentru a
obține toate postările publicate și toate categoriile lor cu numele categoriilor
ar putea arăta astfel (adăugați prefixe la tabele când testați pe propria bază de date WP):
SELECT * FROM
posts #obține postările
LEFT JOIN
term_relationships #obține relațiile postărilor cu term_taxonomies
ON(posts.ID=term_relationships.object_id)
LEFT JOIN
term_taxonomy #obține term_ids
ON(term_relationships.term_taxonomy_id=term_taxonomy.term_taxonomy_id)
LEFT JOIN
terms #în final, obține numele termenilor
ON(term_taxonomy.term_id=terms.term_id)
WHERE (
(posts.post_status='publish')
#opțional, puteți filtra după un anumit post_type:
#AND
#(posts.post_type='some_post_type')
)
ORDER BY posts.ID ASC

Un termen nu este o categorie sau un tag în sine. Acesta trebuie să primească context prin intermediul tabelului term_taxonomy.
Tabelul term_taxonomy plasează un termen într-o taxonomie. Aceasta este ceea ce face ca un termen să fie o categorie, un tag sau parte a unei taxonomii personalizate (sau într-o combinație de taxonomii).
term_id
este ID-ul unui termen din tabelul terms.
term_taxonomy_id
este un ID unic pentru perechea termen+taxonomie.
Codul term_id
este întotdeauna unic, la fel ca și term_taxonomy_id
.
Ambele au un Auto Increment
în structura tabelului.
Tabelul wp_term_taxonomy
se asigură, de exemplu, că o categorie este creată, astfel încât WordPress să poată interacționa cu ea. De exemplu, WooCommerce utilizează: product_tag
, product_type
, product_cat
, toate acestea fiind așa-numitele taxonomii personalizate.
Acest tabel stabilește și structura părinte/copil prin coloana sa parent
.
Tabelul final, term_relationships, leagă obiecte precum postări sau link-uri de un term_taxonomy_id din tabelul term_taxonomy.
Dacă luăm din nou WooCommerce ca exemplu, acest tabel leagă tipul de postare products
de taxonomia lor product_cat
, care conține un nume, de exemplu "Computere", care este desigur preluat din tabelul wp_terms
. Acest tabel conține term_id
, name
, slug
și term_group
. (personal, nu am folosit niciodată term_group)
Sper că cele de mai sus au clarificat puțin diferențele și modul în care WordPress utilizează aceste tabele.

Articolul "Înțelegerea și lucrul cu taxonomii și termeni în WordPress" explică motivul pentru utilizarea a două tabele separate - wp_term
și wp_term_taxonomy
:
În multe instalări WordPress, va exista o singură înregistrare în tabelul
wp_term_taxonomy
pentru fiecare termen din tabelulwp_terms
, dar în unele cazuri veți avea mai multe înregistrări pentru același termen. Acest lucru se întâmplă atunci când creați doi termeni cu același nume și slug în taxonomii diferite și înseamnă că puteți crea o interogare pentru a afișa articolele care conțin acel termen în mai multe taxonomii.Aceasta înseamnă că relația dintre aceste două tabele este de tipul unu-la-multe: o înregistrare din tabelul
wp_terms
poate fi legată de mai multe înregistrări din tabelulwp_term_taxonomy
, dar fiecare înregistrare dinwp_term_taxonomy
este legată de o singură înregistrare dinwp_terms
.
