- eigene Inhaltstypen und Taxonomien registrieren
- zwischen Inhaltstyp, Taxonomie und Metafeld entscheiden
- Metadaten mit register_post_meta typisiert und abgesichert anlegen
- Metadaten im Block-Editor und in der REST API verfügbar machen
Beiträge und Seiten reichen für einen Blog, aber kaum für eine Unternehmenswebsite. Ein Fahrradladen hat Modelle und Werkstatttermine, eine Zahnarztpraxis Behandlungen und Teammitglieder, ein Hotel Zimmer und Arrangements. Mit eigenen Inhaltstypen bekommen solche Inhalte ihren eigenen Bereich im Backend, eigene Adressen und Vorlagen. Metadaten speichern die zugehörigen Eigenschaften wie Preis, Dauer oder Zimmergröße. In Modul 1 ging es darum, Inhalte zu modellieren – jetzt setzen Sie das Modell in Code um.
1. Inhaltstypen registrieren
Der Name eines Inhaltstyps sollte ein Präfix tragen und darf höchstens 20 Zeichen lang sein. Die wichtigsten Einstellungen bestimmen, ob der Typ öffentlich ist, ob er im Block-Editor und in der REST API erscheint und ob es eine Archivseite gibt. Probieren Sie die Kombinationen aus:
1<?php2register_post_type( 'radwerk_termin', [3 'labels' => [ 'name' => 'Termine', 'singular_name' => 'Termin' ],4 'public' => true,5 'show_in_rest' => true,6 'has_archive' => 'termine',7 'hierarchical' => false,8 'supports' => [ 'title', 'editor', 'thumbnail', 'custom-fields' ],9 'menu_icon' => 'dashicons-calendar-alt',10 'rewrite' => [ 'slug' => 'termin' ],11] );Nach dem Registrieren eines Inhaltstyps mit eigenen Adressen müssen die Permalinks einmal neu erzeugt werden – sonst liefern die neuen Seiten 404-Fehler. Das geschieht mit flush_rewrite_rules() im Aktivierungshook, niemals bei jedem Aufruf, denn das ist sehr langsam.
2. Inhaltstyp, Taxonomie oder Metafeld?
Die häufigste Designfrage bei Plugins ist die Wahl der richtigen Struktur. Eine Taxonomie gruppiert viele Inhalte und erzeugt Archive; ein Metafeld speichert eine einzelne Eigenschaft; ein Inhaltstyp steht für eigenständige Einträge. Üben Sie die Entscheidung:
Fahrradmodelle mit eigener Seite und eigenem Archiv
Kategorie eines Modells: Citybike, E-Bike, Rennrad
Rahmenhöhe eines Modells in Zentimetern
Marken, nach denen Kunden im Shop filtern
Preis eines Modells
Eine Faustregel hilft: Will man nach etwas filtern oder eine Übersichtsseite dafür haben, ist es eine Taxonomie. Taxonomie-Abfragen sind zudem deutlich schneller als Abfragen nach Metawerten, weil sie über eigene, indizierte Tabellen laufen.
3. Metadaten sauber registrieren
Metadaten lassen sich ohne Registrierung speichern, aber registrierte Metadaten haben große Vorteile: Sie sind typisiert, haben einen Standardwert, werden beim Speichern automatisch bereinigt, sind nur mit passenden Rechten änderbar und erscheinen auf Wunsch in der REST API. Nur so können sie im Block-Editor genutzt und über die Block Bindings API direkt in Blöcken angezeigt werden.
1<?php2register_post_meta( 'radwerk_termin', 'dauer_minuten', [3 'type' => 'integer',4 'single' => true,5 'default' => 60,6 'show_in_rest' => true,7 'sanitize_callback' => 'absint',8 'auth_callback' => fn() => current_user_can( 'edit_posts' ),9] );1011$dauer = get_post_meta( $termin_id, 'dauer_minuten', true );12update_post_meta( $termin_id, 'dauer_minuten', 90 );Variablen
Ausgabe
4. Metadaten im Editor bearbeiten
Für die Eingabe gibt es drei Wege. Erstens Blöcke mit Block Bindings, die ein Metafeld direkt anzeigen und bearbeitbar machen. Zweitens eine eigene Seitenleiste im Editor, die mit wenigen Zeilen JavaScript Eingabefelder für registrierte Metafelder bereitstellt. Drittens Feld-Plugins wie Advanced Custom Fields oder Meta Box, die Felder per Oberfläche anlegen – praktisch, aber eine zusätzliche Abhängigkeit. Für wenige, stabile Felder ist eigener Code meist die schlankere Lösung; für Websites, deren Felder sich häufig ändern, kann ein Feld-Plugin sinnvoll sein.
Ein Beispiel
Eine Zahnarztpraxis wollte ihre Behandlungen übersichtlich darstellen: je eine Seite mit Beschreibung, Ablauf, Dauer und Hinweisen zur Kostenübernahme, dazu eine Übersicht nach Bereichen wie Prophylaxe, Zahnerhaltung und Zahnersatz. Umgesetzt wurde das mit einem Inhaltstyp „Behandlung“ mit Archiv, einer Taxonomie „Bereich“ und drei registrierten Metafeldern für Dauer, Anzahl der Termine und einen Hinweis zur Krankenkasse. Die Vorlage single-behandlung.html zeigt die Metafelder über Block Bindings in einem Infokasten an. Das Praxisteam pflegt neue Behandlungen seitdem ohne Hilfe, und weil die Daten strukturiert vorliegen, konnte später ohne Mehraufwand eine Vergleichstabelle und eine Schnittstelle für die Online-Terminbuchung ergänzt werden.
Bemerkenswert ist, was bewusst nicht gebaut wurde: kein Feld für den Preis, weil Kosten individuell sind, und keine eigene Tabelle, weil es nur rund vierzig Behandlungen gibt. Gute Datenmodelle sind so einfach wie möglich und so strukturiert wie nötig.
5. Häufige Fragen
Warum sehe ich nach dem Registrieren nur 404-Fehler? Die Permalink-Regeln wurden nicht neu erzeugt. Einmal unter Einstellungen → Permalinks speichern oder im Aktivierungshook flush_rewrite_rules() aufrufen.
Kann ich einen Inhaltstyp später umbenennen? Nur mit Aufwand, denn der Name steht in jeder Zeile der Datenbank. Wählen Sie ihn daher von Anfang an sorgfältig. Die sichtbare Bezeichnung und die Adresse (rewrite slug) lassen sich dagegen jederzeit ändern.
Was passiert mit den Inhalten, wenn das Plugin deaktiviert wird? Sie bleiben in der Datenbank, sind aber nicht mehr sichtbar. Nach dem erneuten Aktivieren sind sie wieder da – ein weiterer Grund, Inhaltstypen in ein Plugin statt ins Theme zu legen.
6. Übung zum Selbermachen
Registrieren Sie in Ihrem Übungsplugin einen Inhaltstyp „Modell“ mit Archiv unter /fahrraeder/, eine Taxonomie „Kategorie“ und zwei Metafelder: preis (number) und rahmenhoehe (integer). Legen Sie drei Modelle an und rufen Sie /wp-json/wp/v2/ mit dem Namen Ihres Typs im Browser auf: Erscheinen die Metafelder in der Antwort? Wenn nicht, prüfen Sie show_in_rest und ob der Inhaltstyp custom-fields unterstützt.
- [1]WordPress.org (2026): Plugin Handbook – Post Types, Taxonomies, Metadata.
- [2]WordPress.org (2026): Code Reference – register_post_type(), register_taxonomy(), register_post_meta().
- [3]WordPress.org (2026): Block Bindings API – Block Editor Handbook.
Stand: September 2026, WordPress 7.1, PHP 8.3. Kursmaterial der Klarwerk Akademie. WordPress entwickelt sich schnell – maßgeblich ist die aktuelle Dokumentation auf developer.wordpress.org.