Datenmodell: Post Types, Taxonomien, Meta und WP_Query
Begriffe vorab
- Post Type: Inhaltstyp, etwa Beitrag, Seite oder ein eigener Typ.
- Taxonomie: Ordnungssystem für Inhalte, z. B. Kategorien oder Schlagwörter.
- Term: ein einzelner Eintrag einer Taxonomie.
- Meta: zusätzliche Felder zu einem Beitrag.
Inhalte in WordPress sind Posts eines bestimmten Post Types. Beiträge, Seiten und Anhänge sind eingebaut, eigene Typen ergänzt du mit register_post_type().
Custom Post Types
add_action( 'init', 'meinpraefix_register_book' );
function meinpraefix_register_book() {
register_post_type( 'book', array(
'labels' => array( 'name' => __( 'Bücher', 'mein-plugin' ) ),
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'supports' => array( 'title', 'editor', 'thumbnail', 'custom-fields' ),
) );
}
Die Registrierung erfolgt auf init. Der Slug darf höchstens 20 Zeichen lang sein – eine feste Grenze durch die Spalte post_type in der Tabelle wp_posts, die als VARCHAR(20) angelegt ist; eine Überschreitung bricht die Registrierung mit einem Fehler ab. show_in_rest ist nötig, damit der Typ im Block-Editor und in der REST API verfügbar ist. Permalinks aktualisierst du nur einmalig bei Aktivierung mit flush_rewrite_rules(), nicht bei jedem Seitenaufruf.
Taxonomien
Mit register_taxonomy() ordnest du Inhalte. Hierarchische Taxonomien verhalten sich wie Kategorien, nicht hierarchische wie Schlagwörter.
Post Meta
update_post_meta( $post_id, 'isbn', sanitize_text_field( $isbn ) );
$isbn = get_post_meta( $post_id, 'isbn', true );
Der dritte Parameter true liefert einen einzelnen Wert statt eines Arrays. Mit register_post_meta() und show_in_rest machst du Meta-Felder für Block-Editor und REST API sichtbar.
WP_Query
$query = new WP_Query( array(
'post_type' => 'book',
'posts_per_page' => 6,
'meta_key' => 'isbn',
'orderby' => 'date',
'no_found_rows' => true,
) );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
the_title();
}
wp_reset_postdata();
}
- Nie
query_posts()verwenden, es überschreibt die Main Query. - Die Main Query änderst du mit dem Hook
pre_get_posts, wobei$query->is_main_query()geprüft wird. no_found_rows => truespart die Zählabfrage, wenn keine Paginierung nötig ist.
Für Abfragen mit vielen Meta-Bedingungen lohnt sich oft eine Taxonomie, da diese deutlich besser indexiert wird.
Ein durchgängiges Beispiel
Für ein Rezeptportal legst du den Post Type recipe an, dazu eine hierarchische Taxonomie „Gericht“ (Vorspeise, Hauptgericht …) und Meta-Felder wie Kochzeit. Eine Abfrage mit WP_Query holt dann zum Beispiel alle Hauptgerichte unter 30 Minuten. Die Datenstruktur bleibt dabei sauber getrennt von der Darstellung im Theme.
Wann Meta, wann Taxonomie?
Meta eignet sich für einzelne Werte pro Beitrag (Preis, Kochzeit). Eine Taxonomie lohnt sich, wenn Inhalte nach einem Merkmal gruppiert, gefiltert und aufgelistet werden sollen. Taxonomien sind dafür besser indexiert; Abfragen über viele Meta-Felder werden bei großen Datenmengen langsam.
Gute Praxis bei Abfragen
- Die Hauptabfrage über
pre_get_postsändern, nicht mitquery_posts(). - Nur benötigte Felder und Mengen laden.
- Ergebnisse, die selten wechseln, zwischenspeichern.
Prüfstatus: Belegt (Stand 1. Oktober 2026): Jahreszahlen, Zahlen, Namen und Quellenangaben dieser Lektion, soweit die Quellenliste sie nennt, wurden gegen Primärquellen geprüft. Nicht einzeln belegt: erklärende Darstellung nach Lehrbuchstand und Quellen, die in der Liste als „allgemeine Referenz“ markiert sind. Codebeispiele sind nur auf Syntax geprüft, nicht in WordPress ausgeführt.
Quellen
- WordPress Developer Resources – Funktionsreferenz zu register_post_type() (Longenscheidung des 20-Zeichen-Limits durch die Spalte post_type in wp_posts) (allgemeine Referenz, nicht Zeile für Zeile geprüft)
- WordPress Developer Resources – Klassenreferenz zu WP_Query und der Hook pre_get_posts (allgemeine Referenz, nicht Zeile für Zeile geprüft)