Skip to content

Alt om WordPress, webutvikling — og mer til

🛠 Eksklusive taksonomier i WordPress: slik erstatter du avmerkingsbokser med radioknapper

🛠 Eksklusive taksonomier i WordPress: slik erstatter du avmerkingsbokser med radioknapper

Som standard lar WordPress deg tilordne så mange termer fra en enkelt taksonomi til et innlegg som du vil. Avkrysningsbokser i sidepanelet, så er du i gang. Men hva om kunden trenger at redaktøren velger nøyaktig ett alternativ? For eksempel «Prosjekttype»: case study, landingsside eller nettbutikk. Tre alternativer, og det gir ingen mening å ha to av dem samtidig.

Det finnes ingen innebygd bryter for «gjør taksonomi eksklusiv» i WordPress. En sak i Trac har ligget der siden 2010 uten fremdrift. Men oppgaven kan løses med kode, uten utvidelser eller ekstra avhengigheter.

Når du er ferdig med denne artikkelen, vil du forvandle standard metaboksen med avkrysningsbokser til et panel med radioknapper: nøyaktig én term per innlegg, færre redaktørfeil.

💡 Hurtigoversikt:

  • Registrer en taksonomi med parameteren meta_box_cb slik at standard metaboks ikke vises.
  • På kroken add_meta_boxes oppretter du din egen blokk med radioknapper.
  • Bruk save_post til å skrive den valgte termen til databasen.
  • Den komplette koden kan kopieres inn i barnetemaets functions.php og fungerer umiddelbart.

Hva taksonomier er og hvorfor eksklusivitet er viktig

En taksonomi i WordPress er en mekanisme for å gruppere innlegg. Standard «Kategorier» og «Stikkord» er også taksonomier. En egendefinert taksonomi opprettes for en spesifikk oppgave: «Prosjekttype» for en portefølje, «Region» for en avdelingsoversikt, «Tjenestetype» for en prisliste.

Innebygde kategorier fungerer som en eksklusiv taksonomi: et innlegg tilhører nøyaktig én kategori, med mindre du bruker utvidelsesplugins. Hierarkiet «overordnet → underordnet» antyder valglogikken for redaktøren.

Imidlertid er enhver egendefinert taksonomi registrert gjennom register_taxonomy() ikke-eksklusiv som standard. Grensesnittet består av avkrysningsbokser eller et felt med autofullføring. For stikkord og produktattributter er dette riktig. Men når hvert innlegg må ha nøyaktig én term, blir avkrysningsbokser en kilde til feil.

Løsningen: skjul standard metaboks og tegn din egen, med radioknapper og streng kontroll. Dette er ikke en omvei, men et dokumentert WordPress API, bare spredt over flere trinn.

Trinn 1: registrer en egendefinert taksonomi

Grunnlaget er funksjonen register_taxonomy(). Koden legges til i barnetemaets functions.php eller via utvidelsen Code Snippets. La oss opprette en project_type-taksonomi for standard innlegg:

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' );

Nøkkelparametere:

  • hierarchical => true aktiverer en trestruktur, som kategorier. Termer organiseres hierarkisk: «Design → Landingsside», «Utvikling → Nettbutikk».
  • show_in_rest => true gjør taksonomien tilgjengelig i REST API-et og blokkredigereren. Uten dette vil ikke Gutenberg se metaboksen.
  • meta_box_cb => false og show_in_quick_edit => false fjerner standardgrensesnittet for termvalg fullstendig.

Etter at koden er lagret, dukket project_type-taksonomien opp i «Innlegg»-menyen. Termer legges til via «Innlegg → Prosjekttype» med et standardgrensesnitt, som for kategorier.

Trinn 2: skjul standard metaboks

Dette trinnet er faktisk allerede utført med parameterne meta_box_cb og show_in_quick_edit i trinn 1. For å oppsummere:

  • meta_box_cb => false fjerner metaboksen fra innleggsredigeringssiden.
  • show_in_quick_edit => false skjuler taksonomien fra hurtig- og masseredigeringspanelene.

Uten dem legger WordPress til et standardgrensesnitt: for hierarkiske taksonomier, kategori-avkrysningsbokser; for ikke-hierarkiske, et stikkordfelt med autofullføring.

meta_box_cb og show_in_quick_edit-parametere i register_taxonomy

Termer fylles ut via en egen administrasjonsside:

Administrasjonsside for egendefinerte taksonomibegreper i WordPress

Trinn 3: opprett en egendefinert metaboks med radioknapper

Registrer din egen metaboks via kroken add_meta_boxes. Legg til i 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}

Parametere for add_meta_box():

  • project_type_box: intern ID (vilkårlig, men unik).
  • 'Project Type': tittel i adminpanelet.
  • sd_render_project_type_meta_box: renderingsfunksjon.
  • 'post': innleggstype; kan være en array for flere CPT-er.
  • 'side': sidepanel. Alternativer: 'normal', 'advanced'.

Funksjonen som tegner radioknappene:

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}

Hva som er viktig her:

  • get_terms() med hide_empty => false returnerer alle termer, inkludert ubrukte.
  • get_the_terms() returnerer en array; vi tar det første elementet [0] siden logikken garanterer ikke mer enn én term.
  • checked() er en innebygd WordPress-funksjon som sender ut checked="checked" når det er samsvar.
  • esc_attr() og esc_html() er obligatorisk escaping.

Resultatet er en ryddig blokk med radioknapper:

Egendefinert metaboks med radioknapper for å velge ett enkelt taksonomibegrep

Ingen avkrysningsbokser, ingen måte å velge to alternativer på.

Trinn 4: lagre termen når innlegget lagres

Uten dette trinnet er metaboksen rent dekorativ. Vi bruker kroken 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}

Detaljer:

  • DOING_AUTOSAVE: vi hopper over autolagringer. Uten denne sjekken blir termen overskrevet i bakgrunnen hvert 60. sekund.
  • current_user_can( 'edit_post', $post_id ): grunnleggende tillatelseskontroll.
  • absint() konverterer verdien til et positivt heltall, sikrere enn (int) sanitize_text_field().
  • wp_set_object_terms() med en enkelt ID (ikke en array) skriver nøyaktig én term, og fjerner tidligere tilknytninger.

Ferdig. Lagre innlegget, og radioknappvalget låses. Når du åpner det igjen, er den valgte termen uthevet.

Komplett kode for kopiering

Alle fire trinn i én snutt. Legg til i barnetemaets functions.php eller via Code Snippets:

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}

⚠️ Ta en full sikkerhetskopi av nettstedet før du limer inn. Koden er testet på gjeldende versjon av WordPress med klassisk redigerer. I Gutenberg vises den egendefinerte metaboksen i sidepanelet uten endringer.

I praksis rullet vi ut denne snutten på tre prosjekter, og den fungerte overalt uten modifikasjoner. Hvis du har en hierarkisk innleggstype eller flere redaktørroller, erstatt 'post' med din slug og verifiser tillatelser i save_post.


WordPress Trac har hatt sak #14877 åpen siden 2010 for innebygd støtte for eksklusiv taksonomi. Når en parameter 'exclusive' => true dukker opp i kjernen, vil hele denne konstruksjonen krympe til én enkelt linje. Inntil saken får bevegelse, forblir radioknapptilnærmingen den primære løsningen.

Og nedenfor, en kort video om emnet slik at du kan se prosessen i aksjon:

⁉️🤔 Ofte stilte spørsmål

Fungerer dette i Gutenberg?

Ja. Parameteren show_in_rest => true ved registrering av taksonomien muliggjør kompatibilitet med blokkredigereren. Den egendefinerte metaboksen vises i dokumentsidepanelet, og radioknapper vises og lagres korrekt.

Kan denne tilnærmingen brukes på egendefinerte innleggstyper?

Ja. Erstatt 'post' i register_taxonomy() og add_meta_box() med din CPT-slug. Resten av koden (taksonominavn, etikett, parametere) forblir den samme. Tilnærmingen fungerer med enhver registrert innleggstype, inkludert de som er opprettet via ACF eller Custom Post Type UI.

Hva skjer hvis redaktøren ikke velger noen term?

Innlegget lagres uten en tilordnet term; save_post vil ganske enkelt ikke kalle wp_set_object_terms(). Hvis obligatorisk valg er kritisk, legg til JavaScript-validering i admin eller en sjekk via kroken pre_post_update.

Hvorfor ikke bruke utvidelsen Radio Buttons for Taxonomies?

Du kan det. Utvidelsen løser oppgaven uten kode og har 100 000+ aktive installasjoner. Ulempen er en ekstra avhengighet. For ett eller to nettsteder er utvidelsen forsvarlig. For byråer og multisites gir kode i temaet full kontroll uten ekstra oppdateringer og konflikter.

Hvordan legger jeg til hierarkisk valg (overordnet → underordnet)?

Hierarkiske taksonomier (hierarchical => true) får en overordnet-underordnet-struktur automatisk. For å vise hierarkiet i den egendefinerte metaboksen, erstatt get_terms() med wp_dropdown_categories() ved å bruke parameteren 'taxonomy' => 'project_type'; funksjonen vil sende ut en nedtrekksliste med innrykk.

Oppsummeringen: når det er verdt innsatsen å skrive kode

En eksklusiv taksonomi er ikke nødvendig for hvert prosjekt. Hvis redaktører forstår nettstedets logikk og ikke gjør feil ved valg, er standard avkrysningsbokser nok. Men når kostnaden ved feil er høy (en landingsside i porteføljen feilaktig merket som både «nettbutikk» og «case study»), lønner en halvtimes koding seg med innholdsryddighet.

  • Hvis du har ett nettsted og ingen utvikler, installer Radio Buttons for Taxonomies. Det fungerer uten kode.
  • Hvis du er et byrå eller driver en multisite, kopier koden ovenfor inn i ditt basistema. Færre utvidelser, færre feilpunkter under oppdateringer.
  • Hvis nettstedet ditt kjører på ren Gutenberg, vurder om du i det hele tatt trenger en taksonomi. Kanskje et ACF-felt med radioknapper er nok: færre entiteter, raskere admin.

Start med et testnettsted. Registrer taksonomien, legg til tre termer og opprett et innlegg; grensesnittet vil fungere umiddelbart. Skriv i kommentarfeltet hvilken oppgave du brukte en eksklusiv taksonomi til.