15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen
21.10.2024

Was ist eine Tax Query in WordPress? Ein vollständiger Leitfaden für Entwickler

Eine Tax Query in WordPress ist ein strukturierter Filter, der an WP_Query übergeben wird und Beiträge abruft, die bestimmten Taxonomie-Begriffen entsprechen. Anstatt jeden Beitrag aus der Datenbank zu laden, schränkt eine Tax Query die Ergebnismenge auf nur jene Datensätze ein, deren Begriffsbeziehungen Ihren definierten Bedingungen entsprechen – sei es ein einzelner Kategorie-Slug, eine Kombination aus benutzerdefinierten Taxonomie-Begriffen oder ein komplexes Multi-Taxonomie-Ausschlussmuster.

In der Praxis: Wenn Sie nur Beiträge anzeigen möchten, die mit „web-development” getaggt sind und gleichzeitig zu einer benutzerdefinierten Taxonomie namens „project-type” mit dem Begriff „client-work” gehören, ist eine Tax Query das richtige, leistungsfähige Werkzeug dafür. Sie arbeitet auf SQL-Ebene über die WP_Tax_Query-Klasse von WordPress und erzeugt optimierte JOIN– und WHERE-Klauseln gegen die wp_term_relationships– und wp_term_taxonomy-Tabellen.

Wie WordPress-Taxonomien und -Begriffe strukturiert sind

Bevor Sie eine einzige Zeile Query-Code schreiben, benötigen Sie ein klares mentales Modell der zugrundeliegenden Datenarchitektur.

Taxonomien sind Klassifizierungssysteme. WordPress wird mit zwei globalen Taxonomien geliefert – category und post_tag – aber die Funktion register_taxonomy() ermöglicht es Ihnen, unbegrenzt eigene zu definieren. Eine Taxonomie ist im Wesentlichen ein benannter Gruppierungsmechanismus.

Begriffe sind die einzelnen Bezeichnungen innerhalb einer Taxonomie. Innerhalb der category-Taxonomie sind „Technology”, „Lifestyle” und „Business” Begriffe. Jeder Begriff hat drei adressierbare Bezeichner:

  • term_id — der ganzzahlige Primärschlüssel in wp_terms
  • slug — der URL-sichere String-Bezeichner (z. B. web-development)
  • name — die für Menschen lesbare Anzeigebezeichnung

Begriffsbeziehungen sind die Pivot-Datensätze in wp_term_relationships, die die Objekt-ID eines Beitrags mit einer Begriff-Taxonomie-ID verknüpfen. Jede Tax Query wird letztendlich zu einer Suche in dieser Tabelle aufgelöst.

Das Verständnis dieser dreischichtigen Struktur – Taxonomie > Begriff > Begriffsbeziehung – ist entscheidend für das Schreiben effizienter Queries und die Diagnose unerwarteter Ergebnismengen.

Kernargumente des tax_query-Parameters

Der tax_query-Schlüssel akzeptiert ein Array aus einem oder mehreren Query-Klausel-Arrays sowie einen optionalen relation-Schlüssel auf oberster Ebene. Jede Klausel unterstützt die folgenden Argumente:

ArgumentTypBeschreibungHäufige Werte
`taxonomy`stringDie abzufragende Taxonomie`category`, `post_tag`, benutzerdefinierter Slug
`field`stringWelches Begriff-Feld abgeglichen werden soll`slug`, `name`, `term_id`, `term_taxonomy_id`
`terms`string / int / arrayDer/die abzugleichende(n) Begriff(e)`'technology'`, `[4, 7]`, `'web-dev'`
`operator`stringWie der Begriffsabgleich angewendet werden soll`IN`, `NOT IN`, `AND`, `EXISTS`, `NOT EXISTS`
`include_children`boolOb untergeordnete Begriffe einbezogen werden sollen (nur hierarchische Taxonomien)`true` (Standard), `false`
`relation`stringLogischer Verbinder auf oberster Ebene zwischen mehreren Klauseln`AND`, `OR`

Das operator-Argument im Detail

Hier machen die meisten Entwickler Fehler. Die Operatoren verhalten sich wie folgt:

  • IN (Standard) — gibt Beiträge zurück, die *einem* der angegebenen Begriffe zugeordnet sind. Dies ist ein ODER-Abgleich innerhalb einer einzelnen Klausel.
  • NOT IN — schließt Beiträge aus, die einem der angegebenen Begriffe zugeordnet sind.
  • AND — gibt Beiträge zurück, die *allen* angegebenen Begriffen gleichzeitig zugeordnet sind. Verwenden Sie dies, wenn ein Beitrag mehrere Tags gleichzeitig tragen muss.
  • EXISTS — gibt Beiträge zurück, die *irgendeinen* Begriff in der angegebenen Taxonomie haben, unabhängig davon, welchen. Das terms-Argument wird ignoriert.
  • NOT EXISTS — gibt Beiträge ohne Begriffszuordnung in der angegebenen Taxonomie zurück. Nützlich zum Auffinden von nicht kategorisierten oder nicht getaggten Inhalten.

Eine wichtige Nuance: operator => 'AND' innerhalb einer einzelnen Klausel prüft, ob ein Beitrag jedem Begriff im terms-Array zugeordnet ist. Dies unterscheidet sich von der Verwendung von relation => 'AND' auf oberster Ebene, das separate Klauseln kombiniert. Diese beiden zu verwechseln ist einer der häufigsten Tax-Query-Fehler in produktivem WordPress-Code.

Einfache Tax Query: Einzelner Taxonomie-Filter

Der einfachste Anwendungsfall – alle Beiträge in der Kategorie „Technology” abrufen:

$args = array(
    'post_type'  => 'post',
    'tax_query'  => array(
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => 'technology',
        ),
    ),
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // Render post content here
    }
    wp_reset_postdata();
}

Rufen Sie nach einer benutzerdefinierten WP_Query-Schleife immer wp_reset_postdata() auf. Andernfalls wird das globale $post-Objekt beschädigt, was Template-Tags wie the_title() und get_the_ID() für alle nachfolgenden Queries auf derselben Seite unterbricht.

Mehrere Tax Queries mit relation kombinieren

Der relation-Schlüssel auf oberster Ebene des tax_query-Arrays steuert, wie mehrere Klauseln verknüpft werden:

$args = array(
    'post_type'  => 'post',
    'tax_query'  => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => 'technology',
        ),
        array(
            'taxonomy' => 'post_tag',
            'field'    => 'slug',
            'terms'    => 'web-development',
        ),
    ),
);

Dies gibt nur Beiträge zurück, die *gleichzeitig* in der Kategorie „Technology” sind und mit „web-development” getaggt sind. Wechseln Sie relation zu 'OR' und Sie erhalten Beiträge, die einer der beiden Bedingungen entsprechen.

Verschachtelte Tax Queries (WordPress 4.1+)

Für erweiterte Filterlogik unterstützt WordPress verschachtelte tax_query-Arrays, mit denen Sie zusammengesetzte boolesche Ausdrücke erstellen können:

$args = array(
    'post_type'  => 'product',
    'tax_query'  => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'slug',
            'terms'    => array( 'laptops', 'desktops' ),
            'operator' => 'IN',
        ),
        array(
            'relation' => 'OR',
            array(
                'taxonomy' => 'product_tag',
                'field'    => 'slug',
                'terms'    => 'sale',
            ),
            array(
                'taxonomy' => 'availability',
                'field'    => 'slug',
                'terms'    => 'in-stock',
            ),
        ),
    ),
);

Dies ruft Produkte in „Laptops” oder „Desktops” ab, die *auch* entweder im Angebot oder auf Lager sind. Diese Art von verschachtelter Logik lässt sich mit einem flachen relation-Schlüssel nicht sauber replizieren – verschachtelte Arrays sind der einzig richtige Ansatz.

Benutzerdefinierte Beitragstypen und benutzerdefinierte Taxonomien

Tax Queries werden besonders leistungsfähig, wenn sie mit benutzerdefinierten Beitragstypen kombiniert werden, die über register_post_type() registriert wurden, und benutzerdefinierten Taxonomien über register_taxonomy(). Betrachten Sie eine Portfolio-Website, auf der Sie einen portfolio-Beitragstyp und eine portfolio_type-Taxonomie registrieren:

// Register custom taxonomy (typically in functions.php or a plugin)
register_taxonomy(
    'portfolio_type',
    'portfolio',
    array(
        'label'        => 'Portfolio Types',
        'hierarchical' => true,
    )
);

// Query portfolio items of type "branding"
$args = array(
    'post_type'  => 'portfolio',
    'tax_query'  => array(
        array(
            'taxonomy' => 'portfolio_type',
            'field'    => 'slug',
            'terms'    => 'branding',
        ),
    ),
);

$query = new WP_Query( $args );

Wenn hierarchical true ist und include_children nicht explizit auf false gesetzt ist, schließt die Query automatisch alle untergeordneten Begriffe von „branding” ein. Dies ist das korrekte Verhalten für kategorieartige Hierarchien, kann jedoch zu unerwarteten Ergebnissen führen, wenn Sie tief verschachtelte Begriffsbäume haben. Setzen Sie 'include_children' => false, wenn Sie nur exakten Begriffsabgleich benötigen.

term_id vs. slug vs. name als field-Wert

FeldwertVerwenden wennVorsicht
`slug`Fest codierte Queries in Theme-/Plugin-CodeSlugs können von Redakteuren im Admin geändert werden
`term_id`Leistungskritische oder programmatische QueriesIDs unterscheiden sich zwischen Umgebungen (Entwicklung vs. Produktion)
`name`Für Menschen lesbare Logik auf AnzeigeebeneGroß-/Kleinschreibung beachten; anfällig, wenn Namen bearbeitet werden
`term_taxonomy_id`Multi-Taxonomie-DisambiguierungSelten benötigt; nur verwenden, wenn Begriff-IDs taxonomieübergreifend kollidieren

Für Produktionscode ist slug im Allgemeinen die sicherste Wahl für die Lesbarkeit. Wenn Sie jedoch Datenbanken zwischen einer Staging- und Live-Umgebung migrieren, beachten Sie, dass term_id-Werte unterschiedlich sein werden. Verwenden Sie immer slug für portablen Code.

Leistungsüberlegungen und häufige Fallstricke

Datenbankauswirkungen

Jede Tax Query erzeugt mindestens einen zusätzlichen JOIN gegen wp_term_relationships. Bei mehreren Klauseln verstärkt sich dies. Auf Websites mit Zehntausenden von Beiträgen sind schlecht konstruierte Tax Queries eine häufige Ursache für langsame Seitenladevorgänge und Datenbank-Timeouts.

Wichtige Optimierungen:

  • Verwenden Sie fields => 'ids', wenn Sie nur Beitrags-IDs benötigen, keine vollständigen Beitragsobjekte. Dies vermeidet das Laden von Beitrags-Meta und serialisierten Daten.
  • Ergebnisse mit der Transients API cachen. Tax Queries auf Archivseiten, die sich selten ändern, sollten mit set_transient() und get_transient() gecacht werden.
  • Vermeiden Sie operator => 'AND' mit großen Begriff-Arrays. Jeder zusätzliche Begriff in einer AND-Klausel fügt eine Unterabfrage hinzu. Führen Sie Benchmarks mit EXPLAIN in MySQL durch, bevor Sie deployen.
  • Setzen Sie no_found_rows => true, wenn Sie keine Paginierung benötigen. Dies überspringt den SQL_CALC_FOUND_ROWS-Overhead.
$args = array(
    'post_type'      => 'post',
    'fields'         => 'ids',
    'no_found_rows'  => true,
    'tax_query'      => array(
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => 'technology',
        ),
    ),
);

Die wp_reset_postdata()-Falle

Wenn Sie eine sekundäre WP_Query innerhalb einer primären Schleife ausführen, ohne die Beitragsdaten zurückzusetzen, zeigt die globale $post-Variable für den Rest des Seitenrenderings auf den falschen Beitrag. Dies verursacht subtile Fehler: falsche Beitragstitel in Breadcrumbs, falsche kanonische URLs und fehlerhafte Open-Graph-Tags. Immer zurücksetzen.

Begriffe abfragen, die nicht existieren

Wenn Sie einen terms-Wert übergeben, der nicht in der Datenbank existiert, gibt WP_Query lautlos null Ergebnisse zurück. Es gibt keine Fehlermeldung oder Warnung. Validieren Sie immer die Existenz von Begriffen mit term_exists(), bevor Sie dynamische Tax Queries basierend auf Benutzereingaben oder externen Daten erstellen.

$term = term_exists( 'technology', 'category' );
if ( $term !== 0 && $term !== null ) {
    // Safe to build the tax query
}

Praxisnahe Anwendungsfälle

Benutzerdefinierte Archivseiten

Überschreiben Sie archive.php oder verwenden Sie pre_get_posts, um eine Tax Query in die Hauptabfrage einzufügen und ein Archiv zu filtern, sodass nur bestimmte Begriffe angezeigt werden, ohne ein separates Query-Objekt zu erstellen:

add_action( 'pre_get_posts', function( $query ) {
    if ( ! is_admin() && $query->is_main_query() && is_post_type_archive( 'portfolio' ) ) {
        $query->set( 'tax_query', array(
            array(
                'taxonomy' => 'portfolio_type',
                'field'    => 'slug',
                'terms'    => array( 'branding', 'web-design' ),
                'operator' => 'IN',
            ),
        ) );
    }
} );

Die Verwendung von pre_get_posts ist effizienter als das Instanziieren einer sekundären WP_Query, da es die Hauptabfrage modifiziert, bevor sie die Datenbank trifft.

E-Commerce-Produktfilterung

WooCommerce registriert product_cat und product_tag als Standard-WordPress-Taxonomien sowie Attribut-Taxonomien wie pa_color und pa_size. Tax Queries steuern die Layered-Navigation-Filterseitenleiste. Ein benutzerdefinierter Filter für „rote Laptops einer bestimmten Marke” würde drei separate Taxonomie-Klauseln mit relation => 'AND' kombinieren.

Inhalte redaktionell ausschließen

Verwenden Sie operator => 'NOT IN', um gesponserte oder Werbeinhalte aus redaktionellen Feeds zu unterdrücken:

$args = array(
    'post_type'  => 'post',
    'tax_query'  => array(
        array(
            'taxonomy' => 'post_tag',
            'field'    => 'slug',
            'terms'    => array( 'sponsored', 'promoted' ),
            'operator' => 'NOT IN',
        ),
    ),
);

Nicht klassifizierte Inhalte finden

Verwenden Sie operator => 'NOT EXISTS', um Ihre Inhaltsbibliothek auf Beiträge zu prüfen, denen erforderliche Taxonomie-Zuordnungen fehlen:

$args = array(
    'post_type'  => 'post',
    'tax_query'  => array(
        array(
            'taxonomy' => 'category',
            'operator' => 'NOT EXISTS',
        ),
    ),
);

Dies ist unschätzbar wertvoll für Inhaltsaudits auf großen redaktionellen Websites, auf denen Beiträge möglicherweise ohne ordnungsgemäße Taxonomie-Zuordnung importiert wurden.

Tax Query vs. Meta Query: Das richtige Werkzeug wählen

Eine häufige architektonische Entscheidung in der WordPress-Entwicklung ist, ob Filterdaten als Taxonomie-Begriff oder als Beitrags-Meta gespeichert werden sollen. Diese Wahl hat erhebliche Auswirkungen auf die Leistung.

KriteriumTax Query (`tax_query`)Meta Query (`meta_query`)
Datenbanktabelle`wp_term_relationships` (indiziert)`wp_postmeta` (weniger optimiert für Filterung)
Query-LeistungSchnell — für mengenbasierte Suchen konzipiertLangsamer bei großem Umfang — EAV-Struktur
Facettierte FilterungNativ, effizientErfordert Workarounds
DatentypKontrolliertes Vokabular (Begriffe)Beliebige Schlüssel-Wert-Paare
AnwendungsfallKategorisierung, KlassifizierungAttribute, Messungen, Flags
IndizierungAutomatisch über Begriff-Taxonomie-IDsErfordert manuelle Index-Optimierung

Faustregel: Wenn die Daten für Filterung oder Navigation verwendet werden (Farbe, Kategorie, Typ, Status), verwenden Sie eine Taxonomie. Wenn es sich um ein einzigartiges Attribut pro Beitrag handelt (Preis, Gewicht, Veröffentlichungszeitstempel), verwenden Sie Beitrags-Meta. Diese zu verwechseln ist eine der häufigsten Ursachen für langsame WordPress-Websites in großem Maßstab.

Hosting-Überlegungen für WordPress-Websites mit komplexen Queries

Tax Queries mit mehreren Klauseln, verschachtelter Logik oder großen Begriff-Mengen erzeugen komplexes SQL. Die Leistung dieser Queries hängt stark von Ihrer Serverumgebung ab.

Bei einem VPS Hosting-Plan haben Sie direkte Kontrolle über die MySQL-Konfiguration – Sie können innodb_buffer_pool_size optimieren, den Query-Cache aktivieren (MySQL 5.7 und früher) und bei Bedarf benutzerdefinierte Indizes zu wp_term_relationships hinzufügen. Shared-Umgebungen erlauben in der Regel nicht dieses Maß an Datenbankoptimierung.

Wenn Sie einen stark frequentierten WooCommerce-Shop mit Layered Navigation betreiben, die von Tax Queries gesteuert wird, bietet ein Dedicated Server isolierte Datenbank-I/O, was das Noisy-Neighbor-Problem eliminiert, das Query-Antwortzeiten in gemeinsam genutzter Infrastruktur verschlechtert.

Für Entwickler, die den Komfort eines Control Panels wünschen und gleichzeitig serverseitigen Zugriff für die Datenbankoptimierung behalten möchten, bietet ein VPS mit cPanel eine praktische Mitte – vollständiger MySQL-Zugriff über phpMyAdmin neben einer vertrauten Verwaltungsoberfläche.

Websites, die stark auf WordPress REST API-Endpunkte angewiesen sind, die von Tax Queries unterstützt werden, sollten auch Object-Caching (Redis oder Memcached) auf Serverebene in Betracht ziehen, das auf VPS Control Panels konfigurierbar ist, die benutzerdefinierte PHP- und serverseitige Caching-Schichten unterstützen.

Entscheidungsmatrix und technische Checkliste

Bevor Sie eine Tax Query in der Produktion einsetzen, überprüfen Sie Folgendes:

  • Begriffsexistenz validiert — verwenden Sie term_exists() für alle dynamisch konstruierten Begriff-Werte
  • wp_reset_postdata() aufgerufen — nach jeder benutzerdefinierten WP_Query-Schleife, ohne Ausnahme
  • include_children explizit gesetzt — verlassen Sie sich nicht auf den Standard für hierarchische Taxonomien, es sei denn, die Einbeziehung von untergeordneten Begriffen ist beabsichtigt
  • fields => 'ids' verwendet — wo keine vollständigen Beitragsobjekte benötigt werden
  • no_found_rows => true gesetzt — bei jeder Query, die keine Paginierung erfordert
  • Ergebnisse gecacht — verwenden Sie die Transients API für Queries auf stark frequentierten Archiv- oder Landingpages
  • pre_get_posts bevorzugt — gegenüber sekundären WP_Query-Instanzen für Hauptabfrage-Modifikationen
  • operator-Wahl bestätigt — unterscheiden Sie zwischen IN (beliebiger Begriff), AND (alle Begriffe) und NOT IN (Ausschluss), bevor Sie die Klausel schreiben
  • relation vs. operator-Unterschied klarrelation verbindet Klauseln; operator steuert den Abgleich innerhalb einer Klausel
  • Verschachtelte Arrays für zusammengesetzte Logik verwendet — versuchen Sie nicht, AND/OR-Kombinationen allein mit einem flachen relation-Schlüssel auszudrücken
  • Datenbankabfrage protokolliert und überprüft — verwenden Sie das Query Monitor-Plugin oder SAVEQUERIES, um das generierte SQL vor dem Launch zu prüfen

FAQ

Was ist der Unterschied zwischen relation => 'AND' und operator => 'AND' in einer Tax Query?

relation ist ein Schlüssel auf oberster Ebene, der mehrere Tax-Query-Klauseln miteinander verbindet – er bestimmt, ob ein Beitrag alle Klauseln (AND) oder mindestens eine (OR) erfüllen muss. operator ist ein klauselspezifischer Schlüssel, der bestimmt, wie das terms-Array innerhalb einer einzelnen Klausel abgeglichen wird – AND erfordert, dass dem Beitrag jeder aufgeführte Begriff gleichzeitig zugeordnet ist.

Warum gibt meine Tax Query keine Ergebnisse zurück, obwohl die Beiträge und Begriffe existieren?

Die häufigsten Ursachen sind: Übergabe eines terms-Werts, der nicht dem angegebenen field-Typ entspricht (z. B. Übergabe eines Namens, wenn field auf slug gesetzt ist), Abfrage einer Taxonomie, die nicht für den Beitragstyp registriert ist, oder Verwendung von operator => 'AND' mit Begriffen, die kein einzelner Beitrag gleichzeitig besitzt. Aktivieren Sie SAVEQUERIES und prüfen Sie das rohe SQL zur Diagnose.

Kann ich eine Tax Query innerhalb der WordPress REST API verwenden?

Ja. Der WP_REST_Posts_Controller der REST API akzeptiert tax_query indirekt über registrierte Query-Parameter. Für benutzerdefinierte Taxonomien müssen Sie 'show_in_rest' => true bei der Registrierung der Taxonomie setzen. Für komplexe Multi-Klausel-Queries verwenden Sie einen benutzerdefinierten REST-Endpunkt, der die WP_Query-Argumente serverseitig konstruiert.

Beeinflusst include_children => true die Leistung?

Ja. Wenn include_children aktiviert ist (der Standard für hierarchische Taxonomien), führt WordPress eine zusätzliche Abfrage aus, um alle untergeordneten Begriff-IDs abzurufen, bevor die Hauptabfrage erstellt wird. Bei Taxonomien mit tiefen Hierarchien und vielen Begriffen fügt diese Vorabfrage messbaren Overhead hinzu. Setzen Sie 'include_children' => false, wenn Sie exakten Begriffsabgleich benötigen und keine Vererbung untergeordneter Begriffe erforderlich ist.

Gibt es eine Begrenzung für die Anzahl der Klauseln in einer Tax Query?

Es gibt keine fest codierte Begrenzung im WordPress-Kern, aber praktische Grenzen werden durch MySQLs maximale Join-Tiefe und Query-Komplexitätsschwellenwerte auferlegt. Mehr als vier oder fünf Klauseln in einer einzelnen Tax Query ist ein Signal, dass das Datenmodell möglicherweise überdacht werden muss – entweder durch Denormalisierung, einen dedizierten Suchindex (Elasticsearch, Typesense) oder Umstrukturierung der Taxonomiehierarchie zur Reduzierung der Klauselanzahl.

15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen