Eine häufige Aufgabe für Entwickler ist es, ein Element (z. B. einen Werbebanner) nur dann anzuzeigen, wenn der Beitrag zu einer bestimmten Kategorie oder Taxonomie gehört (z. B. ‘Filmgenre: Komödie’).
In WordPress haben wir dafür zwei Hauptfunktionen, die oft verwechselt werden: is_tax() und has_term(). Der Unterschied zwischen ihnen ist entscheidend für die Logik Ihres Themes.
1. is_tax() vs has_term() – Wo liegt der Unterschied?
is_tax() – Seiten-Kontext (Archiv)
Verwenden Sie dies, um zu prüfen, welche Seite der Benutzer gerade ansieht.
- Befindet sich der Benutzer gerade im Archiv der Kategorie “Horror”?
if ( is_tax( 'genre', 'horror' ) ) {
echo 'Sie befinden sich auf der Horror-Liste!';
}
Diese Funktion gibt false zurück, wenn Sie sich auf der Seite eines einzelnen Beitrags (Single Post) befinden, selbst wenn dieser Beitrag ein Horrorfilm ist!
has_term() – Beitrags-Kontext (Single)
Verwenden Sie dies, um zu prüfen, was einem bestimmten Beitrag zugewiesen ist.
- Ist dieser spezielle Film ein “Horrorfilm”?
if ( has_term( 'horror', 'genre' ) ) {
echo 'Dieser Beitrag ist ein Horrorfilm.';
}
Diese Funktion wird meistens innerhalb des The Loop oder in der Datei single.php verwendet.
2. Das Hierarchie-Problem (Eltern und Kinder)
Die größte Herausforderung ist, dass has_term() nur exakt den Term prüft, den Sie angeben.
Nehmen wir folgende Struktur an:
- Filme (Taxonomie:
movie_genre)- Komödien (ID: 10)
- Romantische (ID: 11)
- Schwarze Komödien (ID: 12)
- Komödien (ID: 10)
Wenn ein Beitrag NUR “Romantische” zugewiesen ist, wird die Prüfung:
has_term( 'komoedien', 'movie_genre' )
FALSE zurückgeben. Warum? Weil der Beitrag technisch gesehen nicht das Häkchen bei “Komödien” hat, sondern nur bei “Romantische”.
Lösung: Hilfsfunktion für Nachfahren
Um zu prüfen, ob ein Beitrag zur Kategorie “Komödien” ODER einer ihrer Unterkategorien gehört, müssen wir eine eigene Hilfsfunktion schreiben.
/**
* Prüft, ob ein Beitrag zu einem Term oder dessen Kindern gehört.
*/
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. Direkte Zuweisung prüfen (am schnellsten)
if ( has_term( $term->term_id, $taxonomy, $post_id ) ) {
return true;
}
// 2. Alle Kinder des Terms abrufen
$children = get_term_children( $term->term_id, $taxonomy );
if ( is_wp_error( $children ) || empty( $children ) ) {
return false;
}
// 3. Prüfen, ob der Beitrag eines der Kinder hat
return has_term( $children, $taxonomy, $post_id );
}
Verwendung:
// In single.php
if ( wppoland_in_term_tree( 'komoedien', 'movie_genre' ) ) {
get_template_part( 'partials/banner-comedy' );
}
3. Performance-Optimierung
Die Funktion get_term_children() führt eine Datenbankabfrage durch. Verwenden Sie sie in einem Loop mit 50 Beiträgen, machen Sie 50 zusätzliche SQL-Abfragen.
Eine wichtige Optimierung ist die Übergabe der ID anstelle des Slugs. WordPress muss den Slug ohnehin in eine ID umwandeln, also spart die direkte Angabe der ID (z. B. 10) eine Abfrage.
// Schneller (ID)
has_term( 10, 'movie_genre' );
// Langsamer (Slug -> erfordert Lookup)
has_term( 'komoedien', 'movie_genre' );
Zusammenfassung
- Verwenden Sie
is_tax()nur, um zu prüfen, ob Sie sich auf einer Archivseite befinden. - Verwenden Sie
has_term()für die logische Prüfung einzelner Beiträge. - Denken Sie daran, dass
has_termnicht vererbt – wenn Sie “Kategorie und Kinder” brauchen, nutzen Sie eine Custom Helper Function.


