En vanlig oppgave for en utvikler er å vise et element (f.eks. et reklamebanner) kun hvis innlegget tilhører en bestemt kategori eller taksonomi (f.eks. ‘Filmsjanger: Komedie’).
I WordPress har vi to hovedfunksjoner for dette som ofte forveksles: is_tax() og has_term(). Forskjellen mellom dem er avgjørende for logikken i temaet ditt.
1. Is_tax() vs has_term() – Hva er forskjellen?
Is_tax() – Sidekontekst (arkiv)
Bruk denne for å sjekke hvilken side brukeren ser på.
- Er brukeren inne på arkivsiden for kategorien “Skrekk”?
if ( is_tax( 'sjanger', 'skrekk' ) ) {
echo 'Du er på skrekkfilmlisten!';
}
Denne funksjonen returnerer false hvis du er inne på et enkeltinnlegg (Single Post), selv om det innlegget faktisk er en skrekkfilm!
Has_term() – Innleggskontekst (single)
Bruk denne for å sjekke hva som er tilordnet et spesifikt innlegg.
- Er denne spesifikke filmen en “Skrekkfilm”?
if ( has_term( 'skrekk', 'sjanger' ) ) {
echo 'Dette innlegget er en skrekkfilm.';
}
Denne funksjonen brukes oftest inni The Loop eller i filen single.php.
2. Hierarkiproblemet (foreldre og barn)
Den største utfordringen er at has_term() kun sjekker nøyaktig den termen du angir.
Anta denne strukturen:
- Filmer (Taksonomi:
movie_genre)- Komedie (ID: 10)
- Romantisk (ID: 11)
- Mørk komedie (ID: 12)
- Komedie (ID: 10)
Hvis du har et innlegg som KUN er tilordnet “Romantisk”, vil sjekken:
has_term( 'komedie', 'movie_genre' )
returnere FALSE. Hvorfor? Fordi innlegget teknisk sett ikke har avkrysningsboksen “Komedie” valgt, bare “Romantisk”.
Løsning: Hjelpefunksjon for etterkommere
For å sjekke om et innlegg tilhører kategorien “Komedie” ELLER noen av dens underkategorier, må vi skrive en egen hjelpefunksjon.
/**
* Sjekker om et innlegg tilhører et term eller dets barn.
*/
function wppoland_in_term_tree( $term_id_or_slug, $taxonomy, $post_id = null ) {
$post_id = $post_id ? $post_id : get_the_ID();
$term = get_term_by( is_numeric($term_id_or_slug) ? 'id' : 'slug', $term_id_or_slug, $taxonomy );
if ( ! $term ) {
return false;
}
// 1. Sjekk direkte tilordning (raskest)
if ( has_term( $term->term_id, $taxonomy, $post_id ) ) {
return true;
}
// 2. Hent alle barn av termen
$children = get_term_children( $term->term_id, $taxonomy );
if ( is_wp_error( $children ) || empty( $children ) ) {
return false;
}
// 3. Sjekk om innlegget har noen av barna
return has_term( $children, $taxonomy, $post_id );
}
Bruk:
// I single.php
if ( wppoland_in_term_tree( 'komedie', 'movie_genre' ) ) {
get_template_part( 'partials/banner-comedy' );
}
3. Ytelsesoptimalisering
Funksjonen get_term_children() utfører en databasespørring. Hvis du bruker dette i en løkke som viser 50 innlegg, gjør du 50 ekstra SQL-spørringer.
En viktig optimalisering er å sende ID i stedet for Slug. WordPress må slå opp ID-en fra Slug-en uansett, så ved å oppgi ID-en (f.eks. 10) sparer du en spørring.
// Raskere (ID)
has_term( 10, 'movie_genre' );
// Tregere (Slug -> krever oppslag)
has_term( 'komedie', 'movie_genre' );
Oppsummering
- Bruk
is_tax()kun for å sjekke om du er på en arkivside. - Bruk
has_term()for logisk sjekk av enkeltinnlegg. - Husk at
has_termikke arver – hvis du trenger “kategori og barn”-logikk, bruk en egendefinert hjelpefunksjon.

