Andreas Hecht 3. Oktober 2014

WordPress Intern: Ein Einstieg in Custom Post Types

Eine Einführung in Custom Post Types

ist WordPress-Entwickler und bietet dir WordPress-Sicherheit für deine Website. Zudem entwickelt er...

Die meisten Menschen, die sich mit WordPress etwas näher beschäftigen, haben bereits einmal von Custom Post Types  gehört. Wirklich etwas mit dieser Funktion anzufangen, und vor allem sie auch zu nutzen, wissen leider die wenigsten Webdesigner und Blogger. Dabei sind Custom Post Types so etwas wie das Salz in der WordPress Suppe – sie sind einer der Gründe, warum WordPress heute so weit verbreitet ist und geliebt wird. Werfen wir heute also einen gemeinsamen Blick auf die Custom Post Types und schauen, was man mit ihnen anfangen kann.

Eine Einführung in Custom Post Types

Was genau sind Custom Post Types?

WordPress ist das beliebteste Content Management System der Welt, weil es extrem anpassbar und flexibel ist. Grundsätzlich ist alles denkbare auch machbar, wobei die Funktion der Custom Post Types eine Art ist, mit WordPress das zu erreichen, was erreicht werden soll.

Serienmäßig kommt WordPress bereits mit einigen Post Types daher, zu nennen wären:

  • Post (Post Type: ‘post’)
  • Page (Post Type: ‘page’)
  • Attachment (Post Type: ‘attachment’)
  • Revision (Post Type: ‘revision’)
  • Navigation menu (Post Type: ‘nav_menu_item’)

Ein Custom Post Type ist also nicht mehr als eine Erweiterung, eine weiterer Bereich, um etwas zu posten. Dabei ist ein Custom Post Type nicht auf eine spezielle Inhaltsart, wie eine statische Seite oder einen dynamischen Blogpost festgelegt. Ein Custom Post Type kann also jede Art von Inhalt darstellen, auch wenn die Darstellung statischen Inhalts nicht viel Sinn ergeben würde, da Seiten hierfür wesentlich besser geeignet wären.

Besonders gut jedoch eignet sich der Custom Post Type für einen weiteren, dynamischen (neben den Blogartikeln) Inhaltsbereich. Ein idealer Einsatzbereich wäre zum Beispiel die Integration eines Portfolios in ein Theme. Ein Portfolio ist dynamisch, es werden von Zeit zu Zeit weitere Einträge angelegt. Auch wenn ein Portfolio anders aussieht, es verhält sich dynamisch wie ein Blog.

Custom Taxonomies

Custom Taxonomies sind sozusagen eine Unterfunktion der Custom Post Types. Sie sorgen dafür, dass Custom Post Types kategorisiert und mit Schlagworten versehen werden können. Es sind Kategorien und / oder Tags für die WordPress Custom Post Types. Das Erstellen der Custom Taxonomies geht recht leicht, wir werden weiter unten darauf zurückkommen. Allerdings sind Custom Taxonomies noch viel umfassender und vielseitiger als dieser Artikel aufzuzeigen vermag. Damit beschäftige ich mich in einem zukünftigen Beitrag.

Custom Post Types im praktischen Einsatz

Mit Hilfe der WordPress Custom Post Types wird es Ihnen recht leicht fallen, ein funktionelles Portfolio anzulegen, in dem Sie anschliessend Ihre Arbeiten ansprechend präsentieren können. Gehen wir die nötigen Schritte nun einmal zusammen durch:

Custom Post Type registrieren

Fügen Sie den folgenden Code an das Ende der functions.php Ihres Themes (wp-content/themes/ihr Theme).

/**
*
* Registration unseres Custom Post Types "Portfolio"
*
*/

function ah_custom_post_type() {

$labels = array(
'name' => 'Portfolio Einträge',
'singular_name' => 'Portfolio',
'menu_name' => 'Portfolio',
'parent_item_colon' => '',
'all_items' => 'Alle Einträge',
'view_item' => 'Eintrag ansehen',
'add_new_item' => 'Neuer Eintrag',
'add_new' => 'Hinzufügen',
'edit_item' => 'Eintrag bearbeiten',
'update_item' => 'Update Eintrag',
'search_items' => '',
'not_found' => '',
'not_found_in_trash' => '',
);
$rewrite = array(
'slug' => 'portfolio',
'with_front' => true,
'pages' => true,
'feeds' => true,
);
$args = array(
'labels' => $labels,
'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'comments', 'trackbacks', ),
'taxonomies' => array( 'category', 'post_tag' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'show_in_admin_bar' => true,
'menu_position' => 5,
'can_export' => false,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'rewrite' => $rewrite,
'capability_type' => 'page',
);
register_post_type( 'portfolio', $args );

}

// Hook into the 'init' action
add_action( 'init', 'ah_custom_post_type', 0 );

Ein paar Worte zum Code

Der oberste Abschnitt bis hin zum $rewrite kümmert sich um das erweiterte Admin-Menü. Der weitere, mittlere Teil sorgt für den Permalink mit dem Slug „portfolio“. Der untere Teil des Codes legt fest, welche Einzelteile unterstützt werden, wie zum Beispiel Titel, Editor, Excerpt, Beitragsbild und Kommentare.

Ihr WordPress-Administrationsbereich zeigt Ihnen nun den neuen Menüpunkt „Portfolio“, ebenso die Untermenü Punkte „Kategorien“ und „Schlagworte“.

Der neue WordPress-Admin Menüpunkt Portfolio

Um nun mit dem Portfolio arbeiten zu können, braucht es noch etwas mehr als diesen positiv angelegten Menüpunkt. Wir müssen noch Templates erstellen, um das Portfolio korrekt im WordPress-Theme anzuzeigen.

Nötige Templates für den Custom Post Type

Die WordPress Template Engine wird die Templates für diesen Post Type automatisch erkennen, wenn sie im Format single-posttype.php für den einzelnen Post und archive-posttype.php für die Übersichtsseite vorliegen. Je nachdem, wie umfangreich Ihr Projekt werden soll, müssen Sie nun ein bis zwei Templates erstellen, eines nennen Sie dann single-portfolio.php und eines archive-portfolio.php.

In diesem Beispiel legen wir nun das Template archive-portfolio.php an, um die Portfolio-Einträge alle auf einer Seite zu zeigen.

Custom Post Type anzeigen

Erstellen Sie mit dem Editor Ihrer Wahl eine neue leere Seite und nennen Sie sie archive-portfolio.php. Kopieren Sie nun den Inhalt Ihrer page.php (oder auch der index.php) in dieses neu angelegte Template. Ersetzen Sie anschliessend die Beschreibung des Templates mit folgendem:

<?php
 /**
 * Template Name: Archive Portfolio Template
 */

Nun ist es wichtig dem Template mitzuteilen, welche Art von Inhalt angezeigt werden soll. Hierzu platzieren Sie oberhalb des Loop folgenden Code:

<?php query_posts(array('post_type'=>'portfolio')); ?>

Die archive-portfolio.php

Wichtig zu wissen

Bitte gehen Sie nun zum Menüpunkt „Einstellungen => Permalinks“ und speichern Ihre Permalinks einmal erneut ab. Tun Sie dies nicht, so wird es beim Aufruf von www.ihre-seite.de/portfolio/ höchstwahrscheinlich einen 404-Fehler geben. Nach dem erneuten Abspeichern der Permalinks kann die Seite ohne Probleme aufgerufen werden.

Ein Portfolio Eintrag

Da die Seite „Portfolio“ physisch nicht vorhanden ist (aber problemlos aufgerufen werden kann), sollte man diesen Menüpunkt händisch über die Funktion „Links“ aufsetzen.

Menüpunkt händisch hinzufügen

Alternativ kann man auch eine neue, leere Seite mit dem Titel Portfolio anlegen und das Template „Archive Portfolio Template“ auswählen. Damit wurde der nötige Menüpunkt automatisch generiert:

Den Menüpunkt Portfolio generieren

Fazit

Mit Custom Post Types ist es sehr leicht, die normale WordPress-Funktionalität um weitere Bereiche zu ergänzen. Grundsätzlich sind der Kreativität keine Grenzen gesetzt, auch sehr umfangreiche Aufgaben können hiermit gelöst werden. Ein gutes Beispiel hierfür ist die Website des Premium WordPress-Theme-Providers WooThemes.com, der Menüpunkt „Themes“ wurde genauso – wenn auch sehr viel komplizierter – umgesetzt.

Links zum Beitrag

(dpe)

Andreas Hecht

ist WordPress-Entwickler und bietet dir WordPress-Sicherheit für deine Website. Zudem entwickelt er WooCommerce Shops mit Ladezeiten von unter einer Sekunde. Er schreibt seit 2012 für Dr. Web. Auf seinem Blog veröffentlicht er unter anderem nützliche WordPress-Snippets.

13 Kommentare

  1. Hallo,

    ich konnte anhand ihres Tutorials einen Custom Post Types erstellen. Nun möchte ich die einzelnen Beiträge kategorisieren… Kategorien sind angelegt, allerdings werden mir die custom posts nicht auf der kategorien-übersichtsseite angezeigt. Wenn ich einen „normalen“ Beitrag in die verwendeten Kategorien verschiebe, werden mir diese angezeigt.
    Haben sie eine Lösung für mein Problem?

    MfG
    Tim

  2. Hallo,

    bei einer neuen Seite habe ich zurzeit ein Problem: Ich muss mit Custom Post Types in Kategorien posten. Um euch das mal zu veranschaulichen:

    Stell dir vor, die Seite handelt über Autos. Ich möchte für jede Marke ein Custom Post Type haben.
    Die URL Struktur sollte so sein:
    meineseite.de/autos/bmw/bmw-x3
    meineseite.de/autos/audi/a-8

    Wenn ich nun aber einen Custom Post erstelle, sieht es so aus:
    meineseite.de/custom-post/titel

    Hast Du einen Tipp für mich?

  3. Hallo Allerseits
    ich verzweifle fast grade an dem Versuch meine CTPs zu kategoriseren – und zwar so, das sich das auch in deren URLs wiederspiegelt (irgendwie steh ich total auf dem Schlauch obwohl schon seit 1 1/2 Tagen teste)

    Ich versuchs mal folgendermaßen zu erklären:

    1: Wenn ich einen Post (also einen Beitrag vom Post-Type „post“) anlege, dann weise ich diesen einer Kategorie zu.
    Heisst der Beitrag „Hallo Welt“ und befindet sich in der Kategorie „Allgemein“ entsteht daraus der Slug …./allgemein/hallo-welt/

    Verschiebe ich diesen Beitrag in zBsp. die Kategorie „Vermischtes“ entsteht darus der Slug …./vermischtes/hallo-welt/

    Und genaus dieses Verhalten versuche ich mit einem selbst erstellten CPT zu reproduzieren – und es mag mir einfach nicht gelingen.

    2: Um verständlich zu machen warum ich mich daran so festbeisse.
    Ich muss unsere Website umbauen. Bisher habe ich um verschiedene Designs für Category & Singleansichten zu erzeugen mit Conditional Tags gearbeitet (so wie es auch Siegfried angerissen hat).

    Für den Umbau muss ich allerdings dafür sorgen das sich meine URLs nicht ändern (wegen eingehender Deeplinks & SEO).

    Aus diesem Grund muss ich dafür sorgen das ich per CPT Urls nach verschiedenen Mustern erzeugen kann wie sich auch ergeben würden wenn man Posts in Kategorien ablegt (Schaut mal in unsere Verleihabteilung – dann wird das klar)

    3: ich habe dazu die beiden bekanntesten CPT Plugins probiert (Custom Post Type UIs & Types).

    Kann mir vielleicht mal jemand auf die Sprünge helfen?
    Nutzt man dazu Taxonimien?
    Wenn ja, wie?

    Gruss axel

  4. Erstmal danke für dieses kleine Tutorial. Hat alles bei mir soweit funktioniert. Nur leider werden die Beiträge des Custom Post Types nicht in den Kategorien und Schlagworten auf der Website angezeigt. Wie kann ich das ändern?

  5. Hallo Andreas,

    ich denke gerade weil sich der Beitrag an Einsteiger wendet ist es umso wichtiger, die unterschiedlichen Konzepte deutlich zu machen. In dem Moment, wo der Parameter „has_archive“ auf „true“ steht greift die archive-portfolio.php grundsätzlich und es ist nicht notwendig, beim Anlegen der Seite die als Menüpunkt dienen soll, ein Page-Template auszuwählen. Das irritiert deshalb, weil eben genau die beiden Möglichkeiten, ein Archiv für CPTs anzulegen, exisitieren: Entweder über ein Page-Template oder über eine archive.php die hier aber kombiniert werden ohne diesen wichtigen Unterschied deutlich zu machen. Das führt aus meiner Sicht auf eine falsche Fährte und soweit ich das erinnere in älteren Versionen sogar zu einer 404 durch den Konflikt der beiden Slugs. Ich halte das deshalb für wichtig, weil es früher oder später zu Problemen führt wenn man tiefer in die Materie einsteigt und die Trennung beider Herangehensweisen nicht klar ist. Die grauen Haare habe ich mir selber alle schon geholt.

  6. Hallo, guten Morgen,
    vielen Dank für den informativen Artikel. Allerdings hat sich für mich eine Frage ergeben. Warum sollte ich einen separaten Bereich anlegen, wie zum Beispiel „Portfolio“? Kann ich dazu nicht auch die Kategorie „Portfolio“ erstellen? Ist das nicht einfacher, schneller? Sorry für mich hat sich der Nutzen der Custom Post Types durch diesen Artikel noch nicht ganz erschlossen. Danke für ein paar ergänzende Worte.

    1. Hallo, klar kannst du einfach nur eine Kategorie dafür erstellen. Custom Post Types sind jedoch für eine klare Trennung zwischen verschiedenen Inhalten gedacht. Besonders auch, weil man

      1. Bin abgerutscht, sorry 🙂

        Custom Post Types werden auch gern genommen, weil man ein bewusst anderes Design für diesen Bereich haben will, sprich: ein Portfolio (um beim Beispiel zu bleiben) soll bedeutend anders aussehen als ein normaler Blogpost. Hier hat man also die Gelegenheit, einzelne Portfolio Einträge bereits komplett anders darzustellen, als einen Blogpost. Auch die Übersichtsseite der Portfolio-Einträge wird sich im allgemeinen vom Design her komplett vom Blog abheben (sollen).

        Custom Post Types sorgen hier also für eine klare Trennung von Design und Inhalt.

  7. Aus meiner Sicht ist der Beitrag zu Custom Post Types potentiell verwirrend und birgt diverse Fallstricke die einen weniger geübten WordPresser einige grauen Haare kosten dürften. Zum einen wird hier das Anlegen eines Archiv-Templates empfohlen dass dann aber gleichzeitig als WordPress-Page-Template ausgezeichnet wird. Gleichermaßen ist es ein erheblicher Unterschied, ob der Inhalt aus einer page.php oder einer index.php kopiert wird. Richtig ist, das die Template-Engine eine archive-posttypename.php erkennt. In diesem Fall muss WordPress nicht über query_posts mitgeteil werden was zu tun ist – es reicht ein „normaler“ Loop. Das Fragment zur Auszeichnung als Page-Template (Template Name: usw.) hat in dieser Archive-Datei eigentlich nichts zu suchen. Soll tatsächliche eine statische Seite als Archiv dienen ist dafür ein entsprechendes Page-Template zu erstellen dass dann über „Template Name: …“ auch als solches ausgewiesen werden kann. Dieses sollte nicht unter archive-posttypename.php gespeichert werden weil dieser Name dem Archiv-Template vorbehalten ist um potentielle Konflikte oder spätere Verwirrungen zu vermeiden. Dies trifft hier insbesondere auch deshalb zu, weil das empfohlen Anlegen einer statischen Seite einen weiteren Konflikt hervorruft, nämlich einen Konflikt zwischen dem Post Type Slug (meinedomain.de/portfolio) und der URI der statischen Seite die hier ebenfalls auf /portfolio endet. Wird das Archiv also über eine statische Seite (Page-Template) gelöst um etwa oberhalb der Portfolio-Einträge noch Inhalte auszugeben, kann der Post Type über get_posts oder eine Custom Query (WP_Query) geholt werden. query_posts hat auch hier nichts verloren um weitere Konflikte zu vermeiden, was im Übrigen in 99% aller weiteren Fälle gelten kann. Das Problem besteht auch darin, das der im Beitrag beschriebene Weg bis zu einem gewissen Punkt tatsächlich funktioniert, früher oder später aber mit Sicherheit diverse Problem verursacht deren Ursache nur noch schwer auszumachen ist. Zu beachten ist zusammenfassend der Unterschied zwischen WordPress-eigenen Archiven und Custom Archiven über WordPress Page Templates, die Vermeidung von query_posts und das Konfliktpotential zwischen den Slugs von Custom Post Types und den Slugs statischer Seiten.

    1. Hallo Markus,

      vielen Dank für Deinen Kommentar! Schön, dass Du Dir die Zeit genommen hast, meinen Artikel zu kritisieren – an konstruktiver Kritik kann ich schliesslich nur wachsen. Beim nächsten Kommentar in dieser Länge bitte ich allerdings dringend um die Nutzung von Absätzen. Das erleichtert die Lesbarkeit enorm!

      Punkt 1: Ich zeichnete die Datei archive-portfolio.php aus gutem Grund als Page-Template aus. Dieser Grund ist oben im Artikel auch deutlich angeführt. Wenn ich einen Custom Post Type „Portfolio“ (um beim Beispiel zu bleiben) erstelle, dann kann ich den im Anschluss nicht so einfach als Menüpunkt zum WordPress-Menü hinzufügen. Aufrufen kann ich die Domain deineseite.de/portfolio/ schon, aber unter der Menükonfiguration taucht er nicht auf. Daher habe ich als einen von zwei Lösungsvorschlägen die Auszeichnung als Page Template gemacht. So hat man bei einer abgespeicherten leeren Seite namens „Portfolio“ nämlich einen Punkt im WordPress-Menü generiert.

      Punkt 2: Sicherlich ist es ein Unterschied, ob ich meinen Custom Post Type aus der page.php oder der index.php generieren lasse. Doch da das hier eine Einführung ist (für Anfänger!) ist das nebensächlich, Hauptsache es wird überhaupt einmal angezeigt. Ein echtes, richtiges Projekt wird so oder so mit einem Custom Template umgesetzt. Also, who cares?

      Punkt 3: Ja! Da hast Du völlig recht, über diesen Fehler bin ich gar nicht gestolpert, danke dafür! Selbstverständlich reicht eine „normale“ Loop, da WordPress ja durch die archive-portfolio.php bereits erkennt, da es ein Custom Post Type ist. Mein Fehler, mea Culpa.

      Punkt 4: Eine statische Seite soll bei mir als Archiv dienen? Habe ich nichts von geschrieben, bitte nochmal meinen Artikel genau lesen. Ansonsten: Punkt 1 trifft das Thema so, wie ich es gemeint habe.

      Abschliessend kann ich nur sagen, dass der Beitrag für Einsteiger gedacht ist und keinesfalls für Fortgeschrittene oder Profis. Einsteiger finden mit diesem Artikel schnell zu ersten Erfolgen, finden halt schnell einen Einstieg in die Materie. Genau darum geht es im Beitrag.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.