
🛠 Eksklusiivsed taksonoomiad WordPressis: kuidas asendada märkeruudud raadionuppudega
Vaikimisi lubab WordPress määrata postitusele ühest taksonoomiast nii palju termineid, kui soovid. Märgid külgribal ja ongi valmis. Aga mis siis, kui klient vajab, et toimetaja valiks täpselt ühe variandi? Näiteks „Projekti tüüp": juhtumiuuring, maandumisleht või veebipood. Kolm varianti ja kahe koos valimine ei oma mõtet.
WordPressis pole sisseehitatud lülitit „muuda taksonoomia eksklusiivseks". Tracis on alates 2010. aastast üks pilet seisnud ilma edasiliikumiseta. Kuid ülesannet saab lahendada koodiga, ilma pluginateta või lisasõltuvusteta.
Selle artikli lõpuks muudad sa standardse märkeruutudega metakasti raadionuppudega paneeliks: täpselt üks termin postituse kohta, vähem toimetaja vigu.
💡 Kiirülevaade:
- Registreeri taksonoomia parameetriga meta_box_cb, et standardset metakasti ei kuvataks.
- add_meta_boxes konksu juures loo oma plokk raadionuppudega.
- Kasuta save_post, et kirjutada valitud termin andmebaasi.
- Tervikliku koodi saab kopeerida alamteema faili functions.php ja see töötab kohe.
Mis on taksonoomiad ja miks eksklusiivsus on oluline
Taksonoomia WordPressis on mehhanism postituste rühmitamiseks. Standardsed „Kategooriad" ja „Sildid" on samuti taksonoomiad. Kohandatud taksonoomia luuakse konkreetseks ülesandeks: „Projekti tüüp" portfoolio jaoks, „Piirkond" filiaalide kataloogi jaoks, „Teenuse tüüp" hinnakirja jaoks.
Sisseehitatud kategooriad töötavad eksklusiivse taksonoomiana: postitus kuulub täpselt ühte kategooriasse, kui sa just laienduspluginaid ei kasuta. Hierarhia „vanem → laps" suunab toimetaja valikuloogikat.
Kuid iga kohandatud taksonoomia, mis on registreeritud funktsiooniga register_taxonomy(), on vaikimisi mitte-eksklusiivne. Liides koosneb märkeruutudest või automaatse lõpetamisega väljast. Siltide ja toote atribuutide puhul on see õige. Aga kui igal postitusel peab olema täpselt üks termin, muutuvad märkeruudud vigade allikaks.
Lahendus: peida standardne metakast ja renderda oma, raadionuppude ja range kontrolliga. See ei ole möödahiilimine, vaid dokumenteeritud WordPress API, lihtsalt mitme sammu peale laiali jaotatud.
1. Samm: registreeri kohandatud taksonoomia
Aluseks on funktsioon register_taxonomy(). Kood lisatakse alamteema faili functions.php või Code Snippets pluginaga. Loome taksonoomia project_type tavalistele postitustele:
1 function sd_register_project_type_taxonomy() { 2 register_taxonomy( 3 'project_type', 4 'post', 5 array( 6 'label' => __( 'Project Type', 'textdomain' ), 7 'public' => true, 8 'show_in_rest' => true, 9 'hierarchical' => true, 10 'show_in_quick_edit' => false, 11 'meta_box_cb' => false, 12 ) 13 ); 14 } 15 add_action( 'init', 'sd_register_project_type_taxonomy' );
Peamised parameetrid:
hierarchical => truevõimaldab puustruktuuri, nagu kategooriatel. Terminid on hierarhiliselt organiseeritud: „Disain → Maandumisleht", „Arendus → Veebipood".show_in_rest => truemuudab taksonoomia kättesaadavaks REST API-s ja plokiredaktoris. Ilma selleta Gutenberg metakasti ei näe.meta_box_cb => falsejashow_in_quick_edit => falseeemaldavad täielikult standardse terminivaliku liidese.
Pärast koodi salvestamist ilmus taksonoomia project_type menüüsse „Postitused". Termineid lisatakse jaotise „Postitused → Projekti tüüp" kaudu standardse liidesega, nagu kategooriate puhul.
2. Samm: peida standardne metakast
See samm on tegelikult juba tehtud parameetritega meta_box_cb ja show_in_quick_edit 1. sammus. Kokkuvõtteks:
meta_box_cb => falseeemaldab metakasti postituse redigeerimislehelt.show_in_quick_edit => falsepeidab taksonoomia kiir- ja hulgiredigeerimise paneelidest.
Ilma nendeta lisab WordPress vaikimisi liidese: hierarhiliste taksonoomiate puhul kategooriate märkeruudud; mitte-hierarhiliste puhul siltide väli automaatse lõpetamisega.

Terminid täidetakse eraldi halduslehe kaudu:

3. Samm: loo kohandatud metakast raadionuppudega
Registreeri oma metakast konksu add_meta_boxes kaudu. Lisa faili functions.php:
1 add_action( 'add_meta_boxes', 'sd_add_project_type_meta_box' ); 2 3 function sd_add_project_type_meta_box() { 4 add_meta_box( 5 'project_type_box', 6 __( 'Project Type', 'textdomain' ), 7 'sd_render_project_type_meta_box', 8 'post', 9 'side', 10 'default' 11 ); 12 }
Funktsiooni add_meta_box() parameetrid:
project_type_box: sisemine ID (suvaline, kuid unikaalne).'Project Type': pealkiri administraatori paneelis.sd_render_project_type_meta_box: renderdamise funktsioon.'post': postituse tüüp; võib olla massiiv mitme CPT jaoks.'side': külgriba. Alternatiivid:'normal','advanced'.
Funktsioon, mis renderdab raadionupud:
1 function sd_render_project_type_meta_box( $post ) { 2 $terms = get_terms( array( 3 'taxonomy' => 'project_type', 4 'hide_empty' => false, 5 ) ); 6 7 if ( empty( $terms ) || is_wp_error( $terms ) ) { 8 echo '<p>First, add terms on the “Project Type” page.</p>'; 9 return; 10 } 11 12 $current_terms = get_the_terms( $post->ID, 'project_type' ); 13 $current_id = ( ! empty( $current_terms ) && ! is_wp_error( $current_terms ) ) 14 ? $current_terms[0]->term_id 15 : 0; 16 17 foreach ( $terms as $term ) : ?> 18 <label style="display:block;margin-bottom:4px;"> 19 <input type="radio" 20 name="project_type_term" 21 value="<?php echo esc_attr( $term->term_id ); ?>" 22 <?php checked( $current_id, $term->term_id ); ?>> 23 <?php echo esc_html( $term->name ); ?> 24 </label> 25 <?php endforeach; 26 }
Mis siin on oluline:
get_terms()parameetrigahide_empty => falsetagastab kõik terminid, kaasa arvatud kasutamata.get_the_terms()tagastab massiivi; võtame esimese elemendi[0], kuna loogika tagab, et ei ole rohkem kui üks termin.checked()on sisseehitatud WordPressi funktsioon, mis väljastabchecked="checked", kui on vaste.esc_attr()jaesc_html()on kohustuslikud põgenemisfunktsioonid.
Tulemuseks on puhas plokk raadionuppudega:

Ei mingeid märkeruute, pole võimalust valida kahte varianti.
4. Samm: salvesta termin postituse salvestamisel
Ilma selle sammuta on metakast puhtalt dekoratiivne. Kasutame konksu save_post:
1 add_action( 'save_post', 'sd_save_project_type_term' ); 2 3 function sd_save_project_type_term( $post_id ) { 4 if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { 5 return; 6 } 7 8 if ( ! current_user_can( 'edit_post', $post_id ) ) { 9 return; 10 } 11 12 if ( isset( $_POST['project_type_term'] ) ) { 13 $term_id = absint( $_POST['project_type_term'] ); 14 wp_set_object_terms( $post_id, $term_id, 'project_type' ); 15 } 16 }
Üksikasjad:
DOING_AUTOSAVE: jätame automaatsalvestused vahele. Ilma selle kontrollita kirjutatakse termin taustal iga 60 sekundi järel üle.current_user_can( 'edit_post', $post_id ): elementaarne õiguste kontroll.absint()teisendab väärtuse positiivseks täisarvuks, ohutum kui(int) sanitize_text_field().wp_set_object_terms()ühe ID-ga (mitte massiiviga) kirjutab täpselt ühe termini, eemaldades eelnevad seosed.
Valmis. Salvesta postitus ja raadionupu valik lukustatakse. Kui selle uuesti avad, on valitud termin esile tõstetud.
Terviklik kood kopeerimiseks
Kõik neli sammu ühes koodijupis. Lisa oma alamteema faili functions.php või Code Snippets kaudu:
1 /** 2 * Exclusive taxonomy "Project Type" — one term per post. 3 * Add to child theme's functions.php. 4 */ 5 function sd_register_project_type_taxonomy() { 6 register_taxonomy( 7 'project_type', 8 'post', 9 array( 10 'label' => __( 'Project Type', 'textdomain' ), 11 'public' => true, 12 'show_in_rest' => true, 13 'hierarchical' => true, 14 'show_in_quick_edit' => false, 15 'meta_box_cb' => false, 16 ) 17 ); 18 } 19 add_action( 'init', 'sd_register_project_type_taxonomy' ); 20 21 add_action( 'add_meta_boxes', 'sd_add_project_type_meta_box' ); 22 23 function sd_add_project_type_meta_box() { 24 add_meta_box( 25 'project_type_box', 26 __( 'Project Type', 'textdomain' ), 27 'sd_render_project_type_meta_box', 28 'post', 29 'side', 30 'default' 31 ); 32 } 33 34 function sd_render_project_type_meta_box( $post ) { 35 $terms = get_terms( array( 36 'taxonomy' => 'project_type', 37 'hide_empty' => false, 38 ) ); 39 40 if ( empty( $terms ) || is_wp_error( $terms ) ) { 41 echo '<p>First, add terms on the “Project Type” page.</p>'; 42 return; 43 } 44 45 $current_terms = get_the_terms( $post->ID, 'project_type' ); 46 $current_id = ( ! empty( $current_terms ) && ! is_wp_error( $current_terms ) ) 47 ? $current_terms[0]->term_id 48 : 0; 49 50 foreach ( $terms as $term ) : ?> 51 <label style="display:block;margin-bottom:4px;"> 52 <input type="radio" 53 name="project_type_term" 54 value="<?php echo esc_attr( $term->term_id ); ?>" 55 <?php checked( $current_id, $term->term_id ); ?>> 56 <?php echo esc_html( $term->name ); ?> 57 </label> 58 <?php endforeach; 59 } 60 61 add_action( 'save_post', 'sd_save_project_type_term' ); 62 63 function sd_save_project_type_term( $post_id ) { 64 if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { 65 return; 66 } 67 68 if ( ! current_user_can( 'edit_post', $post_id ) ) { 69 return; 70 } 71 72 if ( isset( $_POST['project_type_term'] ) ) { 73 $term_id = absint( $_POST['project_type_term'] ); 74 wp_set_object_terms( $post_id, $term_id, 'project_type' ); 75 } 76 }
⚠️ Enne kleepimist tee saidist täielik varukoopia. Koodi on testitud WordPressi praeguse versiooni ja klassikalise redaktoriga. Gutenbergis kuvatakse kohandatud metakast külgribal muudatusteta.
Praktikas rakendasime seda koodijuppi kolmel projektis ja see töötas kõikjal ilma muudatusteta. Kui sul on hierarhiline postituse tüüp või mitu toimetaja rolli, asenda 'post' oma nimetusega ja kontrolli õigusi funktsioonis save_post.
WordPressi Tracis on alates 2010. aastast avatud pilet #14877 natiivse eksklusiivse taksonoomia toe jaoks. Kui parameeter 'exclusive' => true kunagi tuumikusse ilmub, kahandub kogu see konstruktsioon ühele reale. Kuni piletiga midagi ei liigu, jääb raadionuppude lähenemine peamiseks lahenduseks.
Ja allpool on lühike video sellel teemal, et näeksid protsessi töös:
⁉️🤔 Korduma kippuvad küsimused
Kas see töötab Gutenbergis?
Jah. Parameeter
show_in_rest => truetaksonoomia registreerimisel tagab ühilduvuse plokiredaktoriga. Kohandatud metakast ilmub dokumendi külgribale ja raadionupud kuvatakse ning salvestatakse korrektselt.
Kas seda lähenemist saab rakendada kohandatud postituse tüüpidele?
Jah. Asenda
'post'funktsioonidesregister_taxonomy()jaadd_meta_box()oma CPT nimetusega. Ülejäänud kood (taksonoomia nimi, silt, parameetrid) jääb samaks. Lähenemine töötab iga registreeritud postituse tüübiga, kaasa arvatud need, mis on loodud ACF-i või Custom Post Type UI kaudu.
Mis juhtub, kui toimetaja ei vali ühtegi terminit?
Postitus salvestatakse ilma määratud terminita;
save_postlihtsalt ei kutsu funktsiooniwp_set_object_terms(). Kui kohustuslik valik on kriitiline, lisa administraatoris JavaScripti valideerimine või kontroll konksupre_post_updatekaudu.
Miks mitte kasutada Radio Buttons for Taxonomies pluginat?
Võid kasutada. Plugin lahendab ülesande ilma koodita ja sellel on 100 000+ aktiivset installatsiooni. Miinuseks on veel üks sõltuvus. Ühe või kahe saidi puhul on plugin õigustatud. Agentuuride ja multisaidi puhul annab kood teemas täieliku kontrolli ilma täiendavate uuenduste ja konfliktideta.
Kuidas lisada hierarhilist valikut (vanem → laps)?
Hierarhilised taksonoomiad (
hierarchical => true) saavad automaatselt vanem-laps struktuuri. Hierarhia kuvamiseks kohandatud metakastis asendaget_terms()funktsioonigawp_dropdown_categories(), kasutades parameetrit'taxonomy' => 'project_type'; funktsioon väljastab valikuloendi taandega.
Kokkuvõte: millal tasub koodi kirjutamisega vaeva näha
Eksklusiivset taksonoomiat pole igas projektis vaja. Kui toimetajad mõistavad saidi loogikat ega tee valikul vigu, piisab standardsetest märkeruutudest. Aga kui vigade hind on kõrge (portfoolios olev maandumisleht on ekslikult märgitud nii „veebipoeks" kui ka „juhtumiuuringuks"), tasub pool tundi kodeerimist end ära sisu puhtusega.
- Kui sul on üks sait ja pole arendajat, paigalda Radio Buttons for Taxonomies. See töötab ilma koodita.
- Kui oled agentuur või haldad multisaidi, kopeeri ülaltoodud kood oma baasteemasse. Vähem pluginaid, vähem tõrkekohti uuenduste ajal.
- Kui su sait töötab puhtas Gutenbergis, kaalu, kas sul üldse on taksonoomiat vaja. Võib-olla piisab ACF väljast raadionuppudega: vähem olemusi, kiirem administraator.
Alusta testsaidiga. Registreeri taksonoomia, lisa kolm terminit ja loo postitus; liides töötab kohe. Kirjuta kommentaaridesse, millise ülesande jaoks sa eksklusiivset taksonoomiat kasutasid.



