Skip to content

Kõik WordPressist, veebiarendusest — ja mitte ainult

🛠 Eksklusiivsed taksonoomiad WordPressis: kuidas asendada märkeruudud raadionuppudega

🛠 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:

1function 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}
15add_action( 'init', 'sd_register_project_type_taxonomy' );

Peamised parameetrid:

  • hierarchical => true võimaldab puustruktuuri, nagu kategooriatel. Terminid on hierarhiliselt organiseeritud: „Disain → Maandumisleht", „Arendus → Veebipood".
  • show_in_rest => true muudab taksonoomia kättesaadavaks REST API-s ja plokiredaktoris. Ilma selleta Gutenberg metakasti ei näe.
  • meta_box_cb => false ja show_in_quick_edit => false eemaldavad 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 => false eemaldab metakasti postituse redigeerimislehelt.
  • show_in_quick_edit => false peidab 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.

meta_box_cb ja show_in_quick_edit parameetrid funktsioonis register_taxonomy

Terminid täidetakse eraldi halduslehe kaudu:

Kohandatud taksonoomia terminite haldusleht WordPressi administraatoris

3. Samm: loo kohandatud metakast raadionuppudega

Registreeri oma metakast konksu add_meta_boxes kaudu. Lisa faili functions.php:

1add_action( 'add_meta_boxes', 'sd_add_project_type_meta_box' );
2
3function 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:

1function 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() parameetriga hide_empty => false tagastab 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äljastab checked="checked", kui on vaste.
  • esc_attr() ja esc_html() on kohustuslikud põgenemisfunktsioonid.

Tulemuseks on puhas plokk raadionuppudega:

Kohandatud metakast raadionuppudega ühe taksonoomia termini valimiseks

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:

1add_action( 'save_post', 'sd_save_project_type_term' );
2
3function 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 */
5function 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}
19add_action( 'init', 'sd_register_project_type_taxonomy' );
20
21add_action( 'add_meta_boxes', 'sd_add_project_type_meta_box' );
22
23function 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
34function 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
61add_action( 'save_post', 'sd_save_project_type_term' );
62
63function 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 => true taksonoomia 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' funktsioonides register_taxonomy() ja add_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_post lihtsalt ei kutsu funktsiooni wp_set_object_terms(). Kui kohustuslik valik on kriitiline, lisa administraatoris JavaScripti valideerimine või kontroll konksu pre_post_update kaudu.

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 asenda get_terms() funktsiooniga wp_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.