Manuel Killert
Ratgeber · Custom Post Types · WordPress

Custom Post Types — eigene Inhaltstypen in WordPress.

Referenzen als normale Beiträge, Stellenanzeigen als Seiten, Immobilien in einem Page-Builder-Raster, das bei jeder Änderung auseinanderfällt? Mit eigenen Inhaltstypen bekommt jede Art von Inhalt ihre eigene Struktur — sauber pflegbar, filterbar und für Google verständlich.

Referenzen ansehen →Projekt anfragen
Kurz erklärt

Ein Custom Post Type ist ein eigener Inhaltstyp in WordPress neben Beiträgen und Seiten — etwa „Projekte“, „Immobilien“, „Stellenanzeigen“ oder „Kurse“. Er bekommt einen eigenen Menüpunkt im Backend, eigene Felder für strukturierte Angaben, eigene Taxonomien zum Kategorisieren und eigene Vorlagen im Frontend. Registriert wird er per Code, idealerweise in einem Plugin.

Wann eigene Inhaltstypen sinnvoll sind.

Die Faustregel: Wenn du viele Einträge derselben Art hast, die alle die gleichen Angaben haben, ist das ein eigener Inhaltstyp.

InhaltTypische FelderTypische Taxonomien
Projekte / ReferenzenKunde, Ort, Jahr, Leistungen, GalerieBranche, Leistung
ImmobilienPreis, Fläche, Zimmer, Baujahr, StatusObjektart, Ort
StellenanzeigenArbeitszeit, Standort, Eintritt, AnsprechpartnerBereich, Anstellungsart
Kurse / LektionenDauer, Niveau, Audio, ReihenfolgeKurs, Thema
TeamPosition, Kontakt, FotoAbteilung, Standort
VeranstaltungenDatum, Uhrzeit, Ort, Preis, AnmeldungVeranstaltungsart
Produkte ohne ShopTechnische Daten, Datenblatt, VariantenProduktfamilie

Nicht sinnvoll ist ein eigener Inhaltstyp für einzelne Seiten mit individuellem Aufbau oder für Inhalte, die sich mit normalen Beiträgen und Kategorien gut abbilden lassen.

Die drei Bausteine.

  1. Der Inhaltstyp selbst — zum Beispiel „Projekt“, mit Titel, Text, Beitragsbild und eigener Adresse wie /projekte/badsanierung-bramsche/.
  2. Metafelder — strukturierte Angaben wie Ort, Jahr oder Preis, die gefiltert und einheitlich dargestellt werden können.
  3. Taxonomien — eigene Kategorien oder Schlagwörter wie „Branche“ oder „Leistung“, mit eigenen Übersichtsseiten.

Custom Post Type registrieren.

Inhaltstyp „Projekt“ mit Taxonomie „Leistung“ und Feldern
<?php
/**
 * Plugin Name: Projekte
 * Description: Eigener Inhaltstyp für Referenzprojekte.
 */

add_action( 'init', function () {

    register_post_type( 'projekt', [
        'labels' => [
            'name'          => 'Projekte',
            'singular_name' => 'Projekt',
            'add_new_item'  => 'Neues Projekt anlegen',
        ],
        'public'       => true,
        'has_archive'  => true,                        // Übersicht unter /projekte/
        'rewrite'      => [ 'slug' => 'projekte' ],
        'menu_icon'    => 'dashicons-portfolio',
        'supports'     => [ 'title', 'editor', 'thumbnail', 'excerpt' ],
        'show_in_rest' => true,                        // Block-Editor und REST-API
    ] );

    register_taxonomy( 'leistung', 'projekt', [
        'labels'       => [ 'name' => 'Leistungen', 'singular_name' => 'Leistung' ],
        'hierarchical' => true,                        // wie Kategorien
        'rewrite'      => [ 'slug' => 'leistung' ],
        'show_in_rest' => true,
    ] );

    foreach ( [ 'ort' => 'string', 'jahr' => 'integer' ] as $feld => $typ ) {
        register_post_meta( 'projekt', $feld, [
            'type'          => $typ,
            'single'        => true,
            'show_in_rest'  => true,
            'auth_callback' => fn() => current_user_can( 'edit_posts' ),
        ] );
    }
} );

// Nach Aktivierung Permalinks einmalig neu schreiben, damit /projekte/ erreichbar ist
register_activation_hook( __FILE__, function () {
    do_action( 'init' );
    flush_rewrite_rules();
} );

register_post_meta stellt die Felder für den Block-Editor und die REST-API bereit, bringt aber noch keine Eingabemaske mit. Die entsteht über eine eigene Box im Editor, einen Block oder ein Feld-Plugin.

Felder und Taxonomien.

Eingabemasken für Felder

Für die Redaktion braucht jedes Feld eine verständliche Eingabe. Drei gängige Wege:

  • Feld-Plugins wie Advanced Custom Fields oder Meta Box — schnell eingerichtet, sehr verbreitet, für die meisten Projekte eine gute Wahl.
  • Eigene Metaboxen oder Seitenleisten-Einstellungen im Block-Editor — ohne zusätzliches Plugin, mehr Entwicklungsaufwand.
  • Block-Bindungen: Neuere WordPress-Versionen können Blöcke direkt mit Metafeldern verbinden, sodass Felder im Layout erscheinen.

Taxonomie oder Feld?

Soll es eine eigene Übersichtsseite geben, nach der Besucher filtern — etwa „alle Projekte zur Badsanierung“ —, ist es eine Taxonomie. Ist es eine individuelle Angabe pro Eintrag — etwa das Baujahr —, ist es ein Feld.

Plugin oder Theme?

Custom Post Types gehören in ein Plugin, nicht in die functions.php des Themes. Der Grund: Die Inhalte sind Daten, das Theme ist Darstellung. Wird das Theme gewechselt, bleiben die Einträge zwar in der Datenbank, verschwinden aber aus dem Backend und von der Website, wenn die Registrierung im Theme stand. In einem Plugin überleben sie jeden Theme-Wechsel.

Die Vorlagen für die Darstellung — Einzelansicht und Übersicht — dürfen dagegen im Theme liegen: bei Block-Themes als Vorlagen im Website-Editor, bei klassischen Themes als single-projekt.php und archive-projekt.php.

SEO und strukturierte Daten.

  • Sprechende Adressen: /projekte/badsanierung-bramsche/ statt /?p=123.
  • Übersichtsseiten mit Text: Das Archiv und jede Taxonomie-Seite bekommen eine Einleitung, statt nur eine Liste zu sein.
  • Keine dünnen Seiten: Einträge mit nur einem Satz besser nicht indexieren oder mit Inhalt füllen.
  • Strukturierte Daten passend zum Typ — etwa für Stellenanzeigen, Veranstaltungen oder Kurse, die Google gesondert darstellen kann.
  • Interne Verlinkung: Leistungsseiten zeigen passende Projekte, Projekte verlinken zur Leistung.
  • Sitemap: Den neuen Inhaltstyp in die XML-Sitemap aufnehmen — die meisten SEO-Plugins erkennen ihn automatisch.

Typische Fehler.

FehlerFolgeLösung
Registrierung in der functions.phpInhalte weg nach Theme-WechselIn ein Plugin verschieben
Permalinks nicht neu geschrieben404-Fehler auf neuen SeitenEinstellungen → Permalinks einmal speichern
Slug kollidiert mit einer SeiteSeite oder Archiv nicht erreichbarEindeutigen Slug wählen
show_in_rest vergessenKein Block-Editor, keine REST-APIshow_in_rest auf true
Alles als TaxonomieHunderte leere ÜbersichtsseitenIndividuelle Angaben als Felder
Kurzer Name wie „job“ ohne PräfixKonflikt mit anderen PluginsEindeutigen Namen wählen

Selbst machen oder machen lassen?

Ein einfacher Inhaltstyp mit zwei Feldern ist mit dem Code oben und einem Feld-Plugin gut selbst machbar. Aufwendiger wird es mit Filtern im Frontend, Karten, Importen bestehender Daten, Beziehungen zwischen Inhaltstypen — etwa Kurse und Lektionen —, strukturierten Daten, eigener Redaktionsoberfläche oder Hunderten von Einträgen, die performant abgefragt werden müssen. Das gehört in den Bereich eines eigenen Plugins. Beispiel für viele verknüpfte Inhaltstypen: Lernplattform-Plugin.

Kleine Erweiterungab ~800 €

Zusatzfunktion, Anpassung eines bestehenden Plugins, kleiner Rechner oder Shortcode.

Eigenes Pluginmeist 2.000–6.000 €

Eigene Inhaltstypen, Einstellungen im Backend, Formulare, Logik, Dokumentation.

Komplexes Pluginab ~6.000 €

Schnittstellen zu CRM, ERP oder Zahlungsdiensten, Mitgliederbereiche, Lernplattformen.

Orientierungswerte, keine Fixpreise — nach einem kurzen Gespräch bekommst du ein Festpreisangebot.

Wer die Plugins entwickelt.

Ich bin Manuel Killert, WordPress-Entwickler aus Quakenbrück. Seit 2020 baue ich WordPress-Websites, seit einigen Jahren auch eigene Plugins: einen Bürgergeldrechner und einen Mietprüfer für das Jobcenter Cloppenburg, das Lernplattform-Plugin hinter spanisch-lernen.com mit über 300 Lektionen, KI-Generatoren für Content-Plattformen und 3D-Konfiguratoren als WordPress-Plugins. Als Dozent an der KW Design Akademie unterrichte ich unter anderem Plugin-Entwicklung. Du sprichst direkt mit der Person, die den Code schreibt.

Referenzen

Echte Projekte — live ansehen.

Eigene Plugins und individuelle Funktionen aus meinen Projekten.

Häufige Fragen

FAQ — Custom Post Types in WordPress.

Was ist ein Custom Post Type in WordPress?

Ein eigener Inhaltstyp neben Beiträgen und Seiten, zum Beispiel Projekte, Immobilien, Stellenanzeigen oder Kurse. Er erhält einen eigenen Menüpunkt im Backend, eigene Felder, eigene Taxonomien zum Kategorisieren und eigene Vorlagen im Frontend.

Wann sollte ich einen Custom Post Type anlegen?

Wenn es viele Einträge derselben Art mit gleichen Angaben gibt, etwa Referenzprojekte mit Ort und Jahr oder Stellenanzeigen mit Standort und Arbeitszeit. Für einzelne individuelle Seiten oder Inhalte, die gut als Beiträge mit Kategorien funktionieren, ist er nicht nötig.

Gehört ein Custom Post Type ins Theme oder in ein Plugin?

In ein Plugin. Steht die Registrierung in der functions.php des Themes, verschwinden die Inhalte nach einem Theme-Wechsel aus Backend und Website. Die Darstellungsvorlagen dürfen dagegen im Theme liegen.

Was ist der Unterschied zwischen Taxonomie und Metafeld?

Eine Taxonomie gruppiert Einträge und erzeugt eigene Übersichtsseiten, etwa alle Projekte zur Badsanierung. Ein Metafeld speichert eine individuelle Angabe pro Eintrag, etwa das Baujahr oder den Preis.

Warum zeigt mein Custom Post Type einen 404-Fehler?

Meist wurden die Permalinks nach der Registrierung nicht neu geschrieben. Ein einmaliges Speichern unter Einstellungen, Permalinks behebt das. Weitere Ursachen sind ein Slug, der mit einer bestehenden Seite kollidiert, oder public auf false.

Brauche ich Advanced Custom Fields für eigene Felder?

Nicht zwingend. Feld-Plugins wie Advanced Custom Fields oder Meta Box sind schnell eingerichtet und für viele Projekte eine gute Wahl. Alternativ lassen sich Felder per register_post_meta und eigene Eingabemasken im Block-Editor ohne zusätzliches Plugin umsetzen.

Manuel Killert (rechts im Bild) mit einem FreundDas bin ich – rechts im Bild
Kontakt

Erzähl mir von deiner neuen Website.

Beschreib kurz, was du vorhast — du bekommst eine ehrliche Einschätzung zu Umfang, Zeit und Kosten.

Antwort meist innerhalb von 24 Stunden · hallo@manuelkillert.de