Cum se utilizează butoanele radio cu taxonomii

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.


Pasul 1 Eliminați metaboxul taxonomic implicit

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.

  1. ID-ul: acest atribut id dat elementului div care conține metabox. De obicei, aceasta ar fi "mytaxonomydiv" pentru taxonomii ierarhice, sau "tagsdiv-mytaxonomy" pentru cele non-ierarhice.
  2. Tip post: tipul de postare apare pentru metabox (de exemplu, "post" sau "pagină" etc). Dacă metaboxul dvs. apare pentru mai multe tipuri diferite de posturi, va trebui să apelați funcția remove_meta_box pentru fiecare dintre ele.
  3. Context: Normal, avansat sau lateral.
 add_action ('admin_menu', 'myprefix_remove_meta_box'); funcția myprefix_remove_meta_box () remove_meta_box ('mytaxonomydiv', 'post', 'normal'); 

Pasul 2 Adăugați propriul metabox

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:

  1. ID-ul: La fel ca cele de mai sus, dați-i ceva unic.
  2. Titlu: Titlul metaboxului.
  3. Suna inapoi: Numele funcției care va produce ingeradele metaboxului nostru.
  4. Tip post: La fel ca cele de mai sus. Din nou, va trebui să apelați această funcție pentru fiecare tip de post separat.
  5. Context: La fel ca cele de mai sus.
  6. Prioritate: Prioritatea în contextul în care ar trebui afișate casetele.
 // 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.


Pasul 3 Producerea butoanelor radio

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:

  
  • -toate "tabindex =" 3 ">labels-> ALL_ITEMS; ?>
  • -pop "tabindex =" 3 ">

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 "
  • ";>>

Pasul 4 Funcția completă de retur

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ăm radiotax.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.

Cod