Slik bruker du radio knapper med taxonomier

WordPress 'tilpassede taksonomiske funksjoner er fantastiske, slik at du kan organisere innleggene dine i ulike taksonomier, med alt det harde arbeidet som er gjort for deg. Det kan imidlertid også være litt begrensende. Når du har redigert innleggene dine, har dine taksonomiske termer sin egen metaboks, og de vises enten som en avkrysningsboksliste (for hierarkiske taksonomier) eller som en tagsky (for ikke-hierarkiske taksonomier). Det er dine to valg.

Dette kan presentere et problem når du vil sikre at bare ett begrep kan velges for hvert innlegg. Selvfølgelig kan du koble inn i lagre post krok og fjern eventuelle "overskytende" vilkår, men dette er ikke spesielt brukervennlig og gir absolutt ikke et flott brukergrensesnitt. Noen ganger vil det bare være mer æstetisk ønskelig å presentere taksonomiene på en annen måte. Denne artikkelen viser deg hvordan du gjør nettopp det, og hele koden vi snakker om, skal legges til functions.php fil i temaet ditt. Vi vil fokusere på radioknapper, men du kan bruke en hvilken som helst annen inngangsmetode, for eksempel en rullegardinmeny.


Trinn 1 Fjern Standard Taxonomy Metabox

WordPress produserer automatisk taksonomi metabox, så vår første jobb er å fjerne den, slik at vi kan produsere vår egen i sin plass. Jeg antar at vårt taksonomi navn er "mytaxonomy" (hvis du vil endre WordPress 'koder eller kategorier metabox, vil du erstatte dette med' kategori 'eller' post_tag ').

For å fjerne metaboxet vil vi bruke remove_meta_box, som skal kalles fra innsiden av en funksjon hekta på admin_menu. De remove_meta_box aksepterer tre argumenter.

  1. ID: dette id-attributtet gitt til div-elementet som inneholder metaboxen. Vanligvis vil dette være "mytaxonomydiv" for hierarkiske taksonomier, eller "tagsdiv-mytaxonomy" for ikke-hierarkiske.
  2. Posttype: posttypen som metaboxet vises for (for eksempel "post" eller "side" etc). Hvis metaboxet ditt vises for flere forskjellige posttyper, må du ringe funksjonen remove_meta_box for hver enkelt.
  3. Kontekst: Normal, avansert eller side.
 add_action ('admin_menu', 'myprefix_remove_meta_box'); funksjon myprefix_remove_meta_box () remove_meta_box ('mytaxonomydiv', 'post', 'normal'); 

Trinn 2 Legg til din egen metaboks

Her henger vi på den passende navnet add_meta_boxes krok med en funksjon som vil legge til metaboxen vår. For å gjøre det, vil funksjonen ringe add_meta_box som tar ganske mange argumenter, blant annet:

  1. ID: Samme som ovenfor, gi det noe unikt.
  2. Tittel: Tittelen for metaboxen.
  3. Ring tilbake: Navnet på funksjonen som vil produsere metaboxens innards.
  4. Posttype: Samme som ovenfor. Igjen må du ringe denne funksjonen for hver posttype separat.
  5. Kontekst: Samme som ovenfor.
  6. Prioritet: Prioriteten i konteksten der boksene skal vises.
 // Legg til ny taksonomi meta box add_action ('add_meta_boxes', 'myprefix_add_meta_box'); funksjon myprefix_add_meta_box () add_meta_box ('mytaxonomy_id', 'My Radio Taxonomy', 'myprefix_mytaxonomy_metabox', 'post', 'side', 'core');  funksjon myprefix_mytaxonomy_metabox ($ post) echo 'Dette er my taxonomy metabox'; 

Sammen skal ovennevnte fjerne standardmetaboxet og erstatte det med eget, som for øyeblikket ikke gjør noe annet enn å vise meldingen "This is my taxonomy metabox". Det neste trinnet er å endre tilbakeringingsfunksjonen for å vise hva vi vil ha.


Trinn 3 Produksjon av radioknappene

Vi vil at vår metaboks skal se og oppføre seg så mye som standard metaboxene som mulig. Delving inn i WordPress-kjernefilene, finner du stedet der en metaboks innsider er produsert, her. Vår egen funksjon nedenfor vil etterligne kjernefunksjonen, men med noen endringer i hvordan våre vilkår vises.

La oss gå gjennom vår funksjon litt om gangen. Første bit setter opp noen av variablene. Du trenger bare å endre $ taksonomi variabel for å matche taksonomienavnet ditt. Legg også merke til $ name variabel. Vi gir innfelt felt navnet tax_input [mytaxonomy]. Dette navnet på inngangen inne i standard metabox. Ved å gjøre dette, vil WordPress automatisk håndtere oppdateringen av et innleggs taksonomi.

 // Sett opp taksonomiobjektet og få vilkår $ taxonomy = 'mytaxonomy'; $ tax = get_taxonomy ($ taxonomy); // Dette er taksonomiobjektet // Navnet på skjemaet $ name = 'tax_input ['. $ taksonomi. ']'; // Få alle betingelsene for denne taksonomien $ terms = get_terms ($ taxonomy, array ('hide_empty' => 0));

Vi vil ha ID for postens nåværende sikt (vi forventer bare en).

 $ postterms = get_the_terms ($ post-> ID, $ taksonomi); $ current = ($ postterms? array_pop ($ postterms): false); $ current = ($ current? $ current-> term_id: 0);

Hvis du tar en titt på WordPress 'kategori metabox, vil du legge merke til en kategori som vil vise de mest brukte betingelsene. Å reprodusere at vi trenger de 10 mest populære vilkårene. Vi bruker get_terms fungere igjen, men denne gangen velger du 10 ord og bestilles av telle (antall innlegg som har denne taksonomien).

 $ popular = get_terms ($ taksonomi, array ('orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarkisk' => false));

Deretter ønsker vi å vise kategoriene 'Alle kategorier' og 'Mest brukte' (det er best å bruke taksonomimerkene når det er mulig). Hvis du ikke vil ha faner, kan du bare fjerne denne biten:

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

Deretter ønsker vi å angi hva som skal vises når vi er på kategorien "Alle kategorier":

  
    term_id; ekko "
  • ";?>

Dette viser egentlig bare en liste i et div-element, og hvert listeelement er et radioalternativ. Selvfølgelig kan du enkelt erstatte denne listen med en rullegardinmeny eller noe annet du liker.

Nå gjør vi det samme for "mest brukte" fanen:

  
    term_id; ekko "
  • ";?>

Trinn 4 Vår komplette tilbakeringingsfunksjon

Stykke det sammen og vår fullstendige funksjon er

 // Tilbakering for å sette opp metabox-funksjonen myprefix_mytaxonomy_metabox ($ post) // Få taksonomi og vilkår $ taxonomy = 'mytaxonomy'; // Sett opp taksonomiobjektet og få vilkår $ tax = get_taxonomy ($ taxonomy); $ terms = get_terms ($ taksonomi, array ('hide_empty' => 0)); // Navn på skjemaet $ name = 'tax_input ['. $ taksonomi. ']'; // Få nåværende og populære uttrykk $ popular = get_terms ($ taksonomi, array ('orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarkisk' => false)) ; $ postterms = get_the_terms ($ post-> ID, $ taksonomi); $ current = ($ postterms? array_pop ($ postterms): false); $ current = ($ current? $ current-> term_id: 0); ?> 
  • -alle "tabindex =" 3 ">labels-> ALL_ITEMS; ?>
  • -pop "tabindex =" 3 ">
    term_id; ekko "
  • ";?>
    term_id; ekko "
  • ";?>

Trinn 5 En liten JavaScript ...

Jeg var forsiktig med navnet mitt på IDer og radioknapper i tilbakekallingsfunksjonen. Hvis du prøver alt ovenfor, finner du at WordPress automatisk håndterer oppdateringen av innleggsvilkår. Videre håndterer WordPress 'javascript automatisk flippnavigasjonen. Det er en liten hikke. Radio knappene 'Alle kategorier' synkroniseres ikke med 'mest brukte'. Hvis du har bestemt deg for å dispensere med fanen 'mest brukte', kan du ignorere denne delen. Ellers trenger vi bare å legge til litt bit av javascript for å fikse dette problemet.

Vi vil legge til litt javascript på siden, så i vår tilbakeringingsfunksjon bruker vi en krok som brenner når javascript er lagt til i admin. Det er det admin_enqueue_scripts kroken. Siden vi legger til vår funksjon på denne kroken i vår tilbakeringingsfunksjon, lastes den bare inn når den trengs. Bare legg til denne linjen øverst på vår tilbakeringingsfunksjon ovenfor:

 ADD_ACTION ( 'admin_enqueue_scripts', 'myprefix_radiotax_javascript');

Når javascripts lastes på admin siden, vil dette utløse vår funksjon. Denne funksjonen gjør ikke noe annet enn å registrere og legge til på javascript, som vi vil laste inn i footer:

 funksjon myprefix_radiotax_javascript () wp_register_script ('radiotax', get_template_directory_uri (). '/js/radiotax.js', array ('jquery'), null, true); // Vi angir sant her for å fortelle WordPress dette skriptet må lastes i footer wp_enqueue_script ('radiotax'); 

Nå for javascript vi faktisk trenger, lag en fil i temaet ditt js mappe. Vi ringer det radiotax.js, og her er koden å sette inn:

 jQuery (dokument) .ready (funksjon ($) var taxonomy = 'mytaxonomy'; $ ('#' + taksonomi + 'sjekkliste li: radio, #' + taksonomi + 'sjekkliste-pop: radio'). klikk ', funksjon () var t = $ (dette), c = t.is (': merket '), id = t.val (); $ (' # '+ taksonomi +' sjekkliste li: '+ inkl. +' + '-' + id + ', # i-populær-' + taksonomi + ' - '+ id) .prop (' sjekket ', c);););

Så hva gjør disse få linjene? Når du sjekker en radioknapp, fjerner den alle de andre (på begge fanene) og kontrollerer deretter radioknappene som samsvarer med det aktuelle uttrykket.


Konklusjon

Og med det er vi ferdige. WordPress håndterer resten for oss. Det er rom for forbedring skjønt ... hva med å legge til nye vilkår? Jeg har ommitted det fra vår metabox, fordi det faktisk er utrolig vanskelig å gjøre. Det ville innebære mye mer javascript og en litt handling på serverens side.


Oppdater:

Som forespurt av Roberto, her er en kobling til koden i sin helhet på GitHub. Det er en klasseimplementering av koden som brukes i denne opplæringen, så for å komme i gang bør du bare endre klassens statiske variabler øverst.