Caracteristicile personalizate ale taxonomiei "WordPress" sunt fantastice, permițându-vă să vă organizați posturile în diverse taxonomii, cu toată munca grea pentru dvs. Cu toate acestea, aceasta poate fi, de asemenea, un pic constrângere. Când editați postările dvs., termenii dvs. de taxonomie au metabox propriu și apar ca o listă de casete (pentru taxonomii ierarhice) sau ca un nor de etichete (pentru taxonomii non-ierarhice). Acestea sunt cele două alegeri ale tale.
Acest lucru poate prezenta o problemă atunci când doriți să vă asigurați că un singur termen poate fi selectat pentru fiecare post. Bineînțeles, ai putea să intri în save_post
cârlig și elimina orice termeni "în exces", dar acest lucru nu este deosebit de ușor de utilizat și cu siguranță nu oferă o interfață de utilizator mare. Uneori, ar fi mai de dorit din punct de vedere estetic să vă prezentați taxonomiile într-un mod diferit. Acest articol vă va arăta cum să faceți acest lucru și tot codul despre care vorbim ar trebui adăugat la functions.php
fișier în tema dvs. Vom concentra asupra butoanelor radio, dar puteți utiliza orice altă metodă de introducere, de exemplu un meniu drop-down.
WordPress produce automat metaboxul taxonomic, astfel încât primul nostru loc de muncă este să-l scoatem astfel încât să putem produce propriile noastre în locul său. Voi presupune că numele nostru de taxonomie este "mytaxonomy" (dacă doriți să modificați etichetele sau categoriile metabox ale WordPress, ați înlocui această categorie cu "category" sau "post_tag").
Pentru a elimina metaboxul pe care îl vom folosi remove_meta_box
, care ar trebui să fie chemat din interiorul unei funcții legate de admin_menu
. remove_meta_box
acceptă trei argumente.
add_action ('admin_menu', 'myprefix_remove_meta_box'); funcția myprefix_remove_meta_box () remove_meta_box ('mytaxonomydiv', 'post', 'normal');
Aici ne agățăm pe numele potrivit add_meta_boxes
cârlig cu o funcție care va adăuga metaboxul nostru. Pentru a face acest lucru funcția va apela add_meta_box
care ia câteva argumente, printre care:
// Adăugați o nouă casetă de metode taxonomie add_action ('add_meta_boxes', 'myprefix_add_meta_box'); funcția myprefix_add_meta_box () add_meta_box ('mytaxonomy_id', 'My Radio Taxonomy', 'myprefix_mytaxonomy_metabox', 'post', 'side', 'core'); funcția myprefix_mytaxonomy_metabox ($ post) echo 'Aceasta este metaboxul meu de taxonomie';
Împreună, cele de mai sus ar trebui să elimine metaboxul implicit și să îl înlocuiți cu propriul dvs., care în prezent nu face altceva decât să afișeze mesajul "Acesta este metaboxul meu de taxonomie". Următorul pas este să modificați funcția de apel invers pentru a afișa ceea ce vrem.
Vrem ca metaboxul nostru să arate și să se comporte la fel de mult ca și metaboxele implicite. Încercând în fișierele de bază WordPress, veți găsi locul în care sunt produse interioarele metabox, aici. Funcția personalizată de mai jos va imita funcția de bază, dar cu unele modificări ale modului în care sunt afișați termenii noștri.
Să trecem puțin câte puțin prin funcția noastră. Primul bit stabilește unele dintre variabile. Trebuie doar să schimbi $ taxonomie
pentru a se potrivi cu numele dvs. de taxonomie. Rețineți, de asemenea, numele $
variabil. Oferim câmpurilor de intrare numele tax_input [mytaxonomy]
. Acesta este numele pentru intrarea din metaboxul implicit. Procedând astfel, WordPress se va ocupa automat de actualizarea termenului de taxonomie al postului.
// Configurați obiectul taxonomie și obțineți termenii $ taxonomy = 'mytaxonomy'; $ tax = get_taxonomy (taxonomie $); // Acesta este obiectul taxonomie // Numele formularului $ name = 'tax_input ['. taxonomie $. ']'; // Obțineți toți termenii pentru această taxonomie $ terms = get_terms (taxonomie $, array ('hide_empty' => 0));
Vom dori id-ul termenului curent al postului (așteptăm doar unul).
$ postterms = get_the_terms ($ post-> ID, taxonomie $); $ curent = ($ postterms? array_pop ($ postterms): false); $ curent = ($ curent? $ curent-> termen_id: 0);
Dacă luați o privire la metaboxul categoriei WordPress, veți observa o filă care va afișa termenii "cei mai folosiți". Pentru a reproduce că vom avea nevoie de cele mai populare 10 termeni. Noi folosim get_terms
funcția din nou, dar de această dată selectând cel mult 10 termeni și ordonate după număr (numărul de postări care au această taxonomie).
$ popular = get_terms (taxonomie $, array ('orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
Apoi dorim să afișăm filele "Toate categoriile" și "Cele mai utilizate" (este cea mai bună practică de a utiliza etichetele de taxonomie ori de câte ori este posibil). Dacă nu doriți tab-uri, puteți elimina pur și simplu acest bit:
Apoi, dorim să setăm ce să afișăm când suntem pe fila "toate categoriile":
term_id; ecou "";>>
Aceasta este de fapt doar afișarea unei liste în interiorul unui element div, iar fiecare element de listă este o opțiune radio. Desigur, puteți înlocui această listă cu un meniu drop-down sau cu orice altceva doriți.
Acum facem același lucru pentru fila "cele mai utilizate":
term_id; ecou "";>>
Așezați-o împreună și funcția noastră completă este
// Callback pentru a configura funcția metabox myprefix_mytaxonomy_metabox ($ post) // Obține taxonomia și termenii $ taxonomy = 'mytaxonomy'; // Configurați obiectul taxonomie și obțineți termenii $ tax = get_taxonomy (taxonomie $); $ terms = get_terms (taxonomie $, array ('hide_empty' => 0)); // Numele formularului $ name = 'tax_input ['. taxonomie $. ']'; // Obțineți termeni actuali și populați $ popular = get_terms (taxonomie $, array ('orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false)) ; $ postterms = get_the_terms ($ post-> ID, taxonomie $); $ curent = ($ postterms? array_pop ($ postterms): false); $ curent = ($ curent? $ curent-> termen_id: 0); ?>
- -toate "tabindex =" 3 ">labels-> ALL_ITEMS; ?>
- -pop "tabindex =" 3 ">
term_id; ecou "";>>
term_id; ecou "";>>
Pasul 5 Un mic JavaScript ...
Am fost atent în numele meu de ID-uri și butoane radio în funcția de apel invers. Dacă încercați toate cele de mai sus acum, veți găsi că WordPress gestionează automat actualizarea termenilor post. În plus, javascriptul WordPress se ocupă automat de navigarea tab-urilor. Există un mic sughiț. Butoanele radio "toate categoriile" nu sunt sincronizate cu cele mai utilizate. Dacă v-ați decis să renunțați la fila "cele mai utilizate", atunci puteți ignora această secțiune. În caz contrar, trebuie doar să adăugăm un pic de javascript pentru a rezolva această problemă.
Vrem să adăugăm un pic de javascript pe pagină, deci în interiorul funcției de apel invers vom folosi un cârlig care se declanșează atunci când javascript este adăugat în admin. Aceasta este
admin_enqueue_scripts
cârlig. Deoarece adăugăm funcția noastră pe acest cârlig în cadrul funcției noastre de apel invers, este încărcată doar când este necesar. Doar adăugați această linie în partea de sus a funcției noastre de apel invers mai sus:ADD_ACTION ( 'admin_enqueue_scripts', 'myprefix_radiotax_javascript');Când javascript-urile sunt încărcate în pagina de administrare, acest lucru ne va declanșa funcția. Această funcție nu face altceva decât să vă înregistrați și să enquege javascript-ul nostru, pe care dorim să-l încărcăm în subsol:
funcția myprefix_radiotax_javascript () wp_register_script ('radiotax', get_template_directory_uri ()) '/js/radiotax.js', array ('jquery'), null, true); // Specificăm aici adevărat pentru a spune WordPress că acest script trebuie încărcat în subsolul wp_enqueue_script ('radiotax');Acum, pentru javascriptul de care avem nevoie, creați un fișier în tema proprie
js
pliant. O să-l sunămradiotax.js
, și aici este codul de pus în interiorul:jQuery (document) .ready (functie ($) var taxonomy = 'mytaxonomy'; $ (' click ', functie () var t = $ (aceasta), c = t.is (': verificat '), id = '+ taxonomia +' - 'popup: radio') prop ('checked', false) - '+ id) .prop (' verificat ', c);););Deci, ce fac aceste câteva linii? Ori de câte ori bifați un buton radio, se deblochează toate celelalte (pe ambele file) și apoi se verifică butoanele radio care corespund acelui termen.
Concluzie
Și cu asta am terminat. WordPress se ocupă de toate celelalte pentru noi. Există loc pentru îmbunătățiri ... dar despre adăugarea de noi termeni? Am renunțat la asta din metaboxul nostru, pentru că este de fapt incredibil de dificil de făcut. Aceasta ar implica mult mai mult javascript și o acțiune deasemenea pe partea de server.
Actualizați:
După cum a solicitat Roberto, aici este o legătură cu codul în întregime pe GitHub. Este o implementare de clasă a codului folosit în acest tutorial, așa că, pentru a începe, trebuie doar să modificați variabilele statice ale clasei în partea de sus.