Poate o categorie copil să aibă mai mulți părinți?

15 aug. 2014, 22:18:50
Vizualizări: 15.5K
Voturi: 5

Mă uit la funcția get_categories() din codex-ul WordPress pentru a vedea cum pot returna toți copiii fiecărui "părinte rădăcină" (categorii care nu au părinți). De exemplu, dacă sunt interesat de copiii pentru mai mulți "părinți rădăcină", aș vrea să știu dacă va exista mai mult de o apariție a aceluiași copil sub un alt "părinte rădăcină".

Așadar, asta mă face să întreb:

Pot categoriile copil în WordPress să aibă mai mulți părinți diferiți?

0
Toate răspunsurile la întrebare 2
11

Nu, un termen poate avea mai mulți copii, dar doar un singur părinte. Câmpul părinte din baza de date poate stoca doar o singură valoare.

Este o relație ierarhică de tipul unu la mulți, nu o relație de tipul mulți la mulți.

Același lucru este valabil și pentru articole. Un articol poate avea doar 1 părinte, dar mai mulți copii. Pentru a depăși această limitare, ai putea folosi taxonomii.

O observație despre wp_term_taxonomy și dovezi clare

S-a sugerat că același termen ar putea avea mai multe intrări în această tabelă, permițându-i să aibă mai mulți părinți și să fie partajat între mai mulți termeni părinte.

Iată schema bazei de date:

schema bazei de date

După cum poți vedea, dacă același termen și aceeași taxonomie ar fi referențiate de mai multe ori, dar cu un părinte diferit, poate un termen ar putea avea mai mulți părinți?

Nu, term_id și taxonomy_id sunt ambele unice, așa ceva nu ar fi posibil de creat în acea tabelă fără a-i modifica schema. Pentru a demonstra acest lucru, am deschis Sequel Pro.

Aici avem un termen în copia locală a blogului meu:

exemplu termen în baza de date

Are un părinte cu ID-ul 4, să încercăm să-i dăm un al doilea părinte cu ID-ul 5:

INSERT INTO `tjn2_term_taxonomy` (`term_taxonomy_id`, `term_id`, `taxonomy`, `description`, `parent`, `count`)
VALUES
    (13, 13, 'category', '', 5, 0);

Când rulez această interogare, primesc următoarea eroare:

eroare la inserare în baza de date

Deci nu, un termen nu poate avea mai mult de un părinte. Dar chiar dacă ar putea, nu ar exista niciun mecanism în API-uri pentru a afla acest lucru în afară de interogări SQL directe, așa că un astfel de termen ar fi inutil și nefolosibil în interfețele frontend și backend

15 aug. 2014 23:32:41
Comentarii

Există o subtilitate la care trebuie să fim atenți aici. Trebuie să specificați elementul copil după ID-ul taxonomiei, deoarece același termen poate apărea în mai multe locuri într-o taxonomie ierarhică. Cu alte cuvinte, un termen considerat ca șir poate avea mai mulți părinți, dar acel termen nu este de fapt un singur element de taxonomie, ci corespunde mai multor elemente de taxonomie cu aceeași valoare de șir.

User User
16 aug. 2014 00:11:48

Vrei să spui dacă o etichetă și o categorie au același slug? Sigur, înțeleg asta, deși dacă sunteți toți în cadrul aceleiași taxonomii în scenariul OP, nu ar trebui să fie o problemă. Punctul tău se aplică și tipurilor de postări!

Tom J Nowell Tom J Nowell
16 aug. 2014 00:18:57

Într-o taxonomie ierarhică, același termen poate apărea în mai multe locuri. Luați în considerare ierarhia mașinilor cu primul nivel - GM, Ford, Chrysler. La al doilea nivel, fiecare ar putea avea subcategoria sedan, camion, adică GM->sedan și Ford->sedan, unde "sedan" ar fi același termen, dar nu același termen de taxonomie. Dacă vă uitați la structura bazelor de date WordPress, există o tabelă wp_terms și o tabelă wp_term_taxonomy pentru a permite partajarea termenilor. Postările sunt structurate diferit. Utilizează un singur tabel cu un câmp post_parent. De asemenea, partajarea este în aceeași taxonomie.

User User
16 aug. 2014 00:36:02

Cu alte cuvinte, există un motiv pentru care există un term_id și un term_taxonomy_id. Rețineți că tabelul wp_posts are doar o coloană ID, așa că este structurat diferit.

User User
16 aug. 2014 00:43:59

Nu, nu există nicio modalitate de a configura acest lucru în interfața utilizatorului sau în API, iar acele câmpuri sunt unice în schema bazei de date, încercați SQL-ul și va eșua

Tom J Nowell Tom J Nowell
16 aug. 2014 01:39:53

Consultați editarile mele pentru a înțelege de ce nu este posibil

Tom J Nowell Tom J Nowell
16 aug. 2014 01:45:37

Desigur, term_taxonomy_ids sunt unice, dar două term_taxonomy_ids diferite pot împărtăși același term_id. Încearcă să schimbi primul 13 din insertul tău într-un term_taxonomy_id inexistent, lăsând al doilea 13 la fel și schimbă și părintele într-un alt părinte existent.

User User
16 aug. 2014 01:58:04

Încă dă eroare "Duplicate entry '13-category' for key 'term_id_taxonomy'" - nu este posibil, dacă nu ești de acord, te provoc să demonstrezi contrariul. Dar chiar dacă ar fi posibil, nu este util și complet irelevant pentru întrebarea originală.

Tom J Nowell Tom J Nowell
16 aug. 2014 09:55:45

Pot să văd declarația ta actuală de INSERT?

User User
16 aug. 2014 10:20:43

Ai dreptate și eu am greșit total. Dar, acum chiar nu înțeleg de ce trebuie să existe un term_id și un term_taxonomy id. Oricum, îmi pare sincer rău că ți-am cauzat acestă problemă.

User User
16 aug. 2014 10:34:23

Într-adevăr este o configurare ciudată, iar echipa de dezvoltare analizează schimbarea ei în viitor, acest articol scris de Andrew Nacin detaliază planul pentru meta termeni și tabelele de taxonomie http://make.wordpress.org/core/2013/07/28/potential-roadmap-for-taxonomy-meta-and-post-relationships/

Tom J Nowell Tom J Nowell
16 aug. 2014 11:32:39
Arată celelalte 6 comentarii
0

Încearcă să structurezi categoriile folosind clasa tax-meta-class http://en.bainternet.info/wordpress-taxonomies-extra-fields-the-easy-way/.

Vei putea adăuga câmpuri meta la taxonomiile tale (categorii, etichete, taxonomii personalizate).

15 aug. 2014 22:36:38