WordPress wurde als Blog-Plattform geboren, ist aber längst nicht mehr nur das: Heute verwaltet es Portfolios, Immobilien, Akademien, Unternehmensverzeichnisse und ganze Shops. Das Element, das diese Vielseitigkeit ermöglicht, sind die WordPress Custom Post Types: personalisierte Inhaltstypen, die neben Beiträgen und Seiten existieren, aber mit eigenem Namen, eigenen Feldern, eigenen URLs und einem eigenen Bereich im Dashboard. Wenn du jemals versucht hast, „Projekte“, „Rezepte“ oder „Kurse“ mit normalen Beiträgen und Kategorien zu verwalten, weißt du, wie schnell das im Chaos endet. In diesem vollständigen Leitfaden erfährst du, was genau ein Custom Post Type (CPT) ist, wann es sinnvoll ist, ihn zu erstellen und wann nicht, wie man ihn mit vollständigem und korrektem PHP-Code registriert, wie man eigene Taxonomien hinzufügt, wie man ihn in deinem Theme anzeigt und welche Auswirkungen er auf SEO hat. Am Ende wirst du jedes Projekt mit der Solidität eines professionellen Entwicklers strukturieren können.
Was sind WordPress Custom Post Types
In WordPress ist jeder Inhalt technisch gesehen ein „Post“: die Blogbeiträge (post), die Seiten (page), die Medienanhänge (attachment), die Revisionen oder die Navigationsmenüs. Alle werden in derselben Datenbanktabelle gespeichert (wp_posts) und unterscheiden sich durch den Wert der Spalte post_type. Ein Custom Post Type ist nichts anderes als ein neuer Wert in dieser Spalte, von dir registriert, mit eigenen Regeln: welche Funktionen er unterstützt (Editor, Beitragsbild, Auszug), wie er im Menü heißt, welche URL seine Elemente haben und ob er in den Suchergebnissen erscheint oder nicht.
Klassische Beispiele, wo WordPress Custom Post Types glänzen:
- Portfolio: Projekte mit Bild, Kunde und verwendeter Technologie.
- Immobilien: Immobilien mit Preis, Fläche und Standort.
- Akademie: Kurse und Lektionen mit Dauer und Niveau.
- Restaurant: Gerichte mit Allergenen und Preis.
- Veranstaltungen: mit Datum, Ort und Kapazität.
Tatsächlich verwendest du sie bereits, ohne es zu wissen: Die Produkte von WooCommerce sind ein CPT namens product, und die Formulare fast jedes Plugins werden ebenfalls als eigene Inhaltstypen gespeichert.
Wann man einen CPT erstellen sollte (und wann nicht)
Die Schlüsselfrage: Ist dieser Inhalt konzeptionell anders als ein Blogbeitrag? Wenn die Antwort ja ist (es ist sinnvoll, ihn separat aufzulisten, mit eigenen Archiven und eigener Struktur), ist er ein Kandidat für einen CPT. Wenn du Beiträge nur thematisch gruppieren möchtest, sind die richtigen Werkzeuge die altbekannten Kategorien und Tags.
| Situation | Passende Lösung |
|---|---|
| Den Blog nach Themen trennen | Kategorien |
| Produktblätter, Kurse, Immobilien… | Custom Post Type |
| Beiträge mit einzelnen Schlüsselwörtern markieren | Tags |
| Einen CPT klassifizieren (Genre eines Buches, Bereich einer Immobilie) | Benutzerdefinierte Taxonomie |
| Spezifische Daten jedes Elements (Preis, Datum, ISBN) | Benutzerdefinierte Felder (Post-Meta) |
Eine weitere Vorentscheidung: Code oder Plugin? Plugins wie Custom Post Type UI oder Pods ermöglichen die Registrierung von CPTs über das Dashboard, ohne PHP schreiben zu müssen, und sind absolut gültig. Im Gegenzug erzeugen sie Abhängigkeit: Wenn das Plugin deaktiviert wird, wird der Inhalt nicht gelöscht, verschwindet aber aus dem Dashboard. Die Registrierung per Code, die wir jetzt sehen werden, ist leichter, portabler und kontrollierbarer, und so machen es alle professionellen Themes und Plugins.
Wie man einen Custom Post Type mit Code registriert
Alles dreht sich um eine Funktion: register_post_type(), die im Hook ausgeführt werden muss init. Dies ist eine vollständige und kommentierte Registrierung für einen Portfolio-CPT, sofort einsatzbereit:
<?php
function biblioweb_registrar_cpt_proyecto() {
$labels = array(
'name' => 'Proyectos',
'singular_name' => 'Proyecto',
'menu_name' => 'Porfolio',
'add_new' => 'Añadir nuevo',
'add_new_item' => 'Añadir nuevo proyecto',
'edit_item' => 'Editar proyecto',
'new_item' => 'Nuevo proyecto',
'view_item' => 'Ver proyecto',
'search_items' => 'Buscar proyectos',
'not_found' => 'No se han encontrado proyectos',
'not_found_in_trash' => 'No hay proyectos en la papelera',
'all_items' => 'Todos los proyectos',
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'menu_position'=> 20,
'menu_icon' => 'dashicons-portfolio',
'rewrite' => array( 'slug' => 'proyectos', 'with_front' => false ),
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'revisions', 'custom-fields' ),
'show_in_rest' => true, // Necesario para el editor de bloques y la REST API.
'taxonomies' => array(),
);
register_post_type( 'proyecto', $args );
}
add_action( 'init', 'biblioweb_registrar_cpt_proyecto' );
Gehen wir die Argumente durch, die die meisten Fragen aufwerfen:
public: intrue, der CPT hat eigene URLs, erscheint im Dashboard und ist sichtbar. Für interne Inhalte (zum Beispiel Testimonials, die nur eingebettet angezeigt werden) kann dies mit [Parameter] verfeinert werden.publicly_queryableyexclude_from_search.has_archive: erstellt die Archivseite untertudominio.com/proyectos/mit der Liste aller Elemente.rewrite: definiert den Slug der URLs.with_front => falseverhindert das Erben von Präfixen aus der Permalink-Struktur (wie/blog/).supports: welche Boxen im Editor erscheinen. Wenn dein CPT keinen Texteditor benötigt, entferne ihn und das Formular wird sauberer.show_in_rest: unerlässlich intruewenn du Gutenberg mit diesem CPT verwenden oder es über die REST API konsumieren möchtest.menu_icon: jedes Icon aus der Dashicons-Bibliothek oder der Pfad zu einer eigenen SVG-Datei.
Ein wichtiger Hinweis: Nach dem Registrieren oder Ändern eines CPT besuche Einstellungen → Permalinks und klicke auf „Änderungen speichern“. Dieser Vorgang generiert die Rewrite-Regeln neu; wenn du das nicht tust, geben die neuen URLs einen 404-Fehler zurück und du verschwendest viel Zeit mit der Suche nach einem Fehler, der nicht in deinem Code liegt.
Wo platzieren? In einem eigenen Plugin oder in einem Snippet-Manager wie WPCode, das wir hier ausführlich analysiert haben. Vermeide die functions.php des Themes: Ein CPT ist Funktionalität, kein Design, und muss einen Theme-Wechsel überleben.
Benutzerdefinierte Taxonomien: Klassifiziere deine neuen Inhalte
Die Standardkategorien und -tags gehören zu den Beiträgen. Um einen CPT zu klassifizieren, ist es richtig, eigene Taxonomien mit register_taxonomy(). Um beim Portfolio zu bleiben, erstellen wir eine Taxonomie „Projekttyp“:
<?php
function biblioweb_registrar_taxonomia_tipo() {
$labels = array(
'name' => 'Tipos de proyecto',
'singular_name' => 'Tipo de proyecto',
'search_items' => 'Buscar tipos',
'all_items' => 'Todos los tipos',
'edit_item' => 'Editar tipo',
'add_new_item' => 'Añadir nuevo tipo',
);
register_taxonomy(
'tipo_proyecto',
array( 'proyecto' ),
array(
'labels' => $labels,
'hierarchical' => true, // true = como categorías; false = como etiquetas.
'rewrite' => array( 'slug' => 'tipo-proyecto' ),
'show_in_rest' => true,
)
);
}
add_action( 'init', 'biblioweb_registrar_taxonomia_tipo' );
Der Parameter hierarchical entscheidet das Verhalten: in true funktioniert wie Kategorien (mit Eltern-Kind-Hierarchie und Kontrollkästchen); in false, wie Tags (freier Text). Jeder Begriff generiert automatisch seine eigene Archivseite: tudominio.com/tipo-proyecto/diseno-web/.
So zeigst du Custom Post Types in deinem Theme an
WordPress löst die Darstellung über die Vorlagenhierarchie. Für unseren CPT proyecto sucht in dieser Reihenfolge:
single-proyecto.phpfür den einzelnen Eintrag (falls nicht vorhanden, verwendesingle.php).archive-proyecto.phpfür die Liste (falls nicht vorhanden, verwendearchive.phpund danachindex.php).taxonomy-tipo_proyecto.phpfür die Taxonomie-Archive.
Wenn dein Theme ein Block-Theme ist oder du einen Page Builder verwendest, kannst du normalerweise Vorlagen dem CPT über dessen eigene Oberfläche zuweisen. Und für benutzerdefinierte Listen in jeder Vorlage oder jedem Shortcode erfolgt die Abfrage mit WP_Query:
<?php
$proyectos = new WP_Query( array(
'post_type' => 'proyecto',
'posts_per_page' => 6,
'tax_query' => array(
array(
'taxonomy' => 'tipo_proyecto',
'field' => 'slug',
'terms' => 'diseno-web',
),
),
) );
if ( $proyectos->have_posts() ) :
while ( $proyectos->have_posts() ) : $proyectos->the_post();
the_title( '<h3>', '</h3>' );
the_post_thumbnail( 'medium' );
endwhile;
wp_reset_postdata();
endif;
Vergiss niemals wp_reset_postdata() nach einer benutzerdefinierten Schleife: stellt die Hauptabfrage wieder her und vermeidet seltsame Nebenwirkungen im Rest der Seite. Die vollständige Referenz aller verfügbaren Argumente findest du in der offizielle Dokumentation der Post Types von developer.wordpress.org.
Benutzerdefinierte Felder: die Daten, die den Eintrag vervollständigen
Ein CPT definiert den „Container“, aber die spezifischen Daten (Preis, Kunde, Lieferdatum) leben in benutzerdefinierten Feldern (Post Meta). Du kannst sie auf drei Arten verwalten: mit dem nativen Feld-Editor (spartanisch, aber funktional), mit Code über register_post_meta() y get_post_meta()oder mit spezialisierten Plugins wie Advanced Custom Fields (ACF) oder Meta Box, die komfortable Bearbeitungsoberflächen mit Validierung und erweiterten Feldtypen generieren. Für ernsthafte Projekte ist die Kombination CPT per Code + ACF für die Felder wahrscheinlich der Branchenstandard.
<?php
// Registrar un campo y exponerlo en la REST API:
register_post_meta( 'proyecto', 'cliente', array(
'type' => 'string',
'single' => true,
'show_in_rest' => true,
'sanitize_callback' => 'sanitize_text_field',
) );
// Leerlo en la plantilla:
$cliente = get_post_meta( get_the_ID(), 'cliente', true );
SEO und Custom Post Types: Was du überprüfen solltest
Ein gut durchdachter CPT ist ein Segen für SEO: Er erzeugt saubere Archive, semantische URLs und eine klare Struktur. Es ist jedoch ratsam, vier Punkte zu überprüfen:
- Sitemap: überprüfe, ob dein SEO-Plugin den neuen Inhaltstyp in der XML-Sitemap enthält. Sowohl Yoast als auch Rank Math, dessen kostenlose Version wir analysiert haben, erkennen öffentliche CPTs und ermöglichen deren Aktivierung oder Ausschluss nach Typ.
- Selektive Indexierung: Wenn der CPT unterstützender Inhalt ist (Testimonials, wiederverwendbare Blöcke), markiere ihn als nicht indexierbar oder registriere ihn direkt mit
public => false. - Slug mit Absicht:
/proyectos/sagt mehr als/cpt_portfolio/. Der Rewrite-Slug ist eine SEO-Entscheidung, und eine spätere Änderung erfordert Weiterleitungen. - Inhalt im Archiv: Die automatisch generierte Archivseite ist oft eine einfache Liste; eine Seite mit eigenem Einführungstext zu bewerten, kann den Unterschied ausmachen, um das Haupt-Keyword des Inhaltstyps zu positionieren.
Häufig gestellte Fragen
Was passiert mit dem Inhalt, wenn ich das Plugin deaktiviere, das den CPT registriert?
Nichts wird gelöscht: Die Elemente bleiben in der Datenbank. Sie werden lediglich nicht mehr im Dashboard angezeigt und ihre URLs geben 404 zurück, da WordPress diesen Inhaltstyp nicht mehr erkennt. Bei Reaktivierung der Registrierung (Plugin oder Snippet) erscheint alles wieder intakt. Deshalb ist es wichtig, die Registrierung unabhängig vom Theme zu halten.
Custom Post Type oder Kategorien? Ich bin mir immer noch nicht sicher, was ich verwenden soll
Verwende Kategorien, wenn du Blogartikel organisieren möchtest, die dasselbe Format teilen. Verwende einen CPT, wenn der Inhalt eine eigene Natur hat: unterschiedliche Felder, unterschiedliche Vorlage und Sinn als unabhängiger Bereich der Website. Ein praktischer Tipp: Wenn du dich dabei ertappst, diese „Beiträge“ vom Hauptblog verstecken zu wollen, sollten sie fast sicher ein Custom Post Type sein.
Wie viele Custom Post Types kann ich erstellen?
Es gibt keine relevante technische Grenze: Alle teilen sich die Tabelle wp_posts und die Kosten für die Registrierung jedes Typs sind minimal. Die vernünftige Grenze ist organisatorisch: Wenn du mehr als sechs oder acht Typen hast, überprüfe, ob einige davon nicht eigentlich Taxonomien oder Felder desselben Typs sein sollten. Reserviere Namen mit Präfix (zum Beispiel bw_proyecto), wenn du deinen Code verteilst, um Kollisionen mit anderen Plugins zu vermeiden.
Warum geben meine Custom Post Types einen 404-Fehler zurück?
In 95 % der Fälle liegt es an den Rewrite-Regeln: WordPress hat die neuen URLs noch nicht „gelernt“. Gehe zu Einstellungen → Permalinks und speichere, ohne etwas zu ändern. Wenn das Problem weiterhin besteht, überprüfe, ob public sei true, dass der Rewrite-Slug nicht mit einer bestehenden Seite kollidiert und dass die Registrierung im Hook init bei jedem Laden, nicht nur bei der Aktivierung.
Es ist ratsam, mindestens einmal pro Quartal ein vollständiges SEO-Audit durchzuführen. Sie sollten jedoch die Leistung Ihrer Keywords und den Zustand Ihrer Website wöchentlich überwachen. Inhaltsaktualisierungen und kleinere Optimierungen können regelmäßiger vorgenommen werden.
Die Custom Post Types von WordPress sind das Werkzeug, das einen Blog in ein echtes maßgeschneidertes CMS verwandelt: Portfolios, Kataloge, Verzeichnisse oder Akademien, jeder Inhalt mit seiner Struktur, seinen URLs und seinem Platz im Dashboard. Das professionelle Rezept besteht aus drei Schritten: Registrieren des Typs mit register_post_type() im Hook init (und die Permalinks speichern), es mit eigenen Taxonomien über register_taxonomy()und die Einträge mit benutzerdefinierten Feldern vervollständigen. Von da an die Vorlagenhierarchie und WP_Query geben dir die volle Kontrolle darüber, wie alles angezeigt wird. Beginne mit einem einzigen echten Inhaltstyp deines Projekts, registriere ihn per Code in einem eigenen Snippet oder Plugin und überprüfe im Dashboard, was sich ändert, wenn du echte „Projekte“ anstelle von verkleideten Beiträgen verwaltest. Diese strukturelle Klarheit wirst du, deine Kunden und Google zu schätzen wissen.