Startseite BlogWordPressCustom Post Types ab WordPress 3.0 nutzen

Custom Post Types ab WordPress 3.0 nutzen

29. April 2010 — WordPress
WordPress 3.0: custom post types, taxonomy

WordPress steht demnächst in der Version 3.0 stabil zur Verfügung. Neben zahlreichen kleinen Verbesserungen und Erweiterungen wartet WordPress 3.0 mit einer sehr mächtigen Neuerung auf: den Custom Post Types. Denn bislang kannte WordPress nur Post (Artikel/ Beitrag) und Page (Seite). Demnächst kann man dieses System dank register_post_type beliebig erweitern. Wie der aktuelle Stand bei WordPress 3.0 bei den Custom Post Types ist, was man damit machen kann und wie man das vorab leicht testen kann, zeigt dieser Beitrag.

WordPress 3.0

Aktuell liegt WordPress in der Version 3.0-beta1 vor, die mit Ausnahme der neuen Menü-Funktion sehr stabil läuft. Dennoch ist es eine beta-Version, die man nicht (unbedingt) öffentlich, also live einsetzen sollte. Auch wird WordPress 3.0 erst bei den automatischen Updates angezeigt, wenn die Version als stabli zum Download veröffentlicht wird.
Daher geht man am besten wie folgt vor, will man gefahrenlos den eigenen Blog mit Erscheinen der stablien Version auf ein neues Level heben:

  1. Alles Unnötige aus der aktuellen Datenbank entfernen wie Spamkommentare, Artikelrevisionen, … beispielsweise mit dem Plugin Cleanup WordPress
  2. Backup der Datenbank und Backup der Serverdaten
  3. Geschützen Testbereich einrichten (lokales XAMPP – light tuts auch oder zugangsgeschützer Webserver)
  4. Datenbank und Dateien dorthin einrichten bzw. kopieren: Testbereich ist damit fertig
  5. Automatisches Update (der Testkopie!) auf Version 3.0-beta1 dank genialem Plugin WordPress Beta-Tester.
  6. Fertig, nach einem Datenbankupdate sollte der Blog wie bisher laufen – nur jetz in 3.0-beta1.

WordPress 3.0
Das an sich schöne graue Backend-Theme ist derzeit leider noch kontrastärmer als bisher (Vergleich bei Perun). Dank anregender Diskussionen könnte sich das aber bis zur stabilen Version noch bessern.

Custom Post Types

Wozu also das ganze? Angenommen man schreibt im Blog aktuelle Artikel und hat Seiten für Impressum etc. Will man nun eine dritte Art von Inhalten wie etwa einen Fragen und Antwort-Bereich (Q&A) hinzufügen, ginge das bislang auf zwei Arten.

  1. Man gliedert via functions.php im Theme bei den Artikel eine neue Kategorie Fragen aus dem Loop, Feed usw. aus.
  2. Man erstellt einfach weitere Seiten – hierarchisch unter einer grundlegenden Seite Fragen.

Die Sache mit der Kategorie wird spätestens bei der Navigation lästig und bei einer Funktionsänderung im Core droht dann Chaos. Bei den Seiten wird die Navigation auch komplex sowie – je nach Permalink-Struktur – WordPress zunehmend langsamer. Beginnt nämlich der Permalink nicht mit einem zahlenmäßigen Platzhalter (wie ID oder Datumsteile), sondern kommt als erster Platzhalter etwa die Kategorie oder der Titel, muss WordPress bei der Zuordnung des richtigen Inhaltes eine bei vielen Seiten sehr, sehr lange Tabelle abarbeiten. Viele Seiten sind also performancehemmend bei bestimmten Permalinkstrukturen.
Doch jetzt kann man via functions.php im Theme ganz einfach neue Arten von post (Artikel) oder pages (Seiten) in WordPress anlegen.

Custom Post Types anlegen

In der functions.php des WordPress-Themes geht das beispielsweise wie folgt:

function post_type_fragen() {
register_post_type(
           'fragen',
           array('label' => __('Fragen'),
           'singular_label' => __('Frage'),
           'public' => true,
           'show_ui' => true,
           'capability_type' => 'post',
           'hierarchical' => false,
           'rewrite' => array("slug" => "fragen"),
           'supports' => array('title','editor','trackbacks','custom-fields','comments','revisions'),
           'menu_position' => 4
           )
         );
}
add_action('init','post_type_fragen');

Entscheidend ist demnach die Funktion register_post_type (Parameter siehe Codex).
Damit legt man etwa Namen (Mehrzahl und Einzahl), Typ (Artikel oder Seite) und Felder fest. Im Backend passiert dann folgendes:
Custom Post Type in WordPress -Backend
Nun kann man neue Fragen genau bei Artikel oder Seiten (je nach gewähltem Typ) in dieser neuen Art erstellen. Die Frage wäre dann je nach Permalink-Struktur unter domain.de/fragen/fragentitel erreichbar.

Custom Post Types mit Kategorien und/ oder Tags

Wichtig zu wissen ist, dass diese benutzerdefinierten Inhaltstypen nicht die normalen Tags oder Kategorien nutzen können, welche den Artikeln vorbehalten bleiben.
Aber man kann sich ganz einfach selbst gleich spezielle Kategorien (hierarchische Taxonomy) und/ oder Tags (nicht hierarchische Taxonomy) für den neuen Typ (hier Fragen) anlegen.
WP Engineer zeigt das sehr anschaulich am Beispiel Filme, zu dem man Schauspieler-Kategorien (Actor) und Produktions-Tags (Production) anlegt:

function post_type_movies() {
  register_post_type(
                'movies',
                array(
                        'label' => __('Movies'),
                        'public' => true,
                        'show_ui' => true,
                        'supports' => array(
                                     'post-thumbnails',
                                     'excerpts',
                                     'trackbacks',
                                     'custom-fields',
                                     'comments',
                                     'revisions')
                )
        );
   register_taxonomy( 'actor', 'movies', array( 'hierarchical' => true, 'label' => __('Actor') ) );
        register_taxonomy( 'production', 'movies',
    array(
                         'hierarchical' => false,
       'label' => __('Production'),
       'query_var' => 'production',
       'rewrite' => array('slug' => 'production' )
    )
  );
}
add_action('init', 'post_type_movies');

Beim Erstellen erscheinen dann die Meta-Boxen rechts für die Schauspieler-Kategorien und Produktions-Tags.
Wem das jetzt alles zuviel Code ist, der sollte sich das Plugin aktivieren, das hierzu eine Benutzeroberfläche zum Zusammenklicken anbietet.

Custom Post Types im Backend erweitern

Custom Post Type
Für Fortgeschrittene und Perfektionisten kann man im Backend auch die Darstellung der Spalten noch weiter anpassen. Ein extremes Beispiel mit guten Erläuterungen findet man bei Konstantin.

Custom Post Types im Theme/ Template

Achtung! WordPress erstellt (derzeit) keinen rewrite-Eintrag für den Custom Post Type. Im obigen Beispiel würde also unter domain.de/fragen/ die 404-Fehlerseite erscheinen. Um eine logische Überblicksseite unter domain.de/fragen/ anzubieten, muss man daher derzeit am einfachsten auf eine normale Seite mit dem Slug fragen ausweichen.

Im Theme kann man mit if($post_type == 'fragen') ganz einfach abfragen, ob derzeit ein Inhalt des Custom Post Types Fragen angezeigt wird. Hat man dazu etwa die Custom Taxonomy Themen (als Kategorie oder Tags) vergeben, kann man diese mit if(is_tax('themen')) abfragen. Im Loop kann man die verwendeten Themen dann mit echo get_the_term_list($post->ID,'themen','Thema: ',', ',''); anzeigen.
Will man beispielsweise auch die Kommentare jeweils anpassen, funktioniert die Abfrage (außerhalb des Loops) nur, wenn man zuvor folgendes anfragt:

global $post;
$post_type = $post->post_type;

NETPROFIT Blog

Im Blog schreibt         über CMS, SEO & Webdesign. Kontakt →

Kategorien

Trackback-URL: http://blog.netprofit.de/custom-post-types-wordpress.html/trackback

15 Kommentare zu Custom Post Types ab WordPress 3.0 nutzen

Ihre Codeblöcke beinhalten kein ‘>’, wurde alles umgewandelt in &gt.

Gravatar von Uwe - via garvatar.org Uwe
Kommentar 1
29. April 2010 um 13:55 Uhr

Danke Uwe, wird gleich korrigiert, ist erst beim letzten Aktualisieren passiert.

Gravatar von Robert Hartl - via garvatar.org Robert Hartl
Kommentar 2
29. April 2010 um 13:58 Uhr

WordPress wird immer genialer. Bin auch gerade am überlegen ob ich es mal ausprobieren sollte.
[Anmerkung Admin: Kommentarspam auf einem SEO-Blog - so unglaublich, dass ich den Kommentar schon wieder freischalten muss, bei dem bedauernswerten Namen natürlich ohne URL]

Gravatar von webkataloge eintragsdienst - via garvatar.org webkataloge eintragsdienst
Kommentar 3
2. Juli 2010 um 10:07 Uhr

Hallo, die Einrichtung hat dank dieser Anleitung super funktioniert.
Ich stehe allerdings vor dem Problem, dass ich den Slug nachträglich verändern möchte. Trotz Anpassen der functions.php ignoriert WordPress die neue Einstellung. Was kann ich tun?

Danke! Gruß Jürgen

Gravatar von Jürgen - via garvatar.org Jürgen
Kommentar 4
2. August 2010 um 16:00 Uhr

Gute Frage, schon die Permalinkstruktur im normalen Admin aktualisiert? Denn da liegt im Zweifel immer (nur) ein Update-Problem vor.

Gravatar von Robert Hartl - via garvatar.org Robert Hartl
Kommentar 5
2. August 2010 um 16:38 Uhr

@Robert: Ja, das habe ich bereits gemacht. Auch das Suchen und Ersetzen des alten Slugs in der Datenbank brachte nicht den gewünschten Erfolg. Es ist mir ein Rätsel, wo WordPress diese Information speichert.

Gruß

Gravatar von Jürgen - via garvatar.org Jürgen
Kommentar 6
2. August 2010 um 16:47 Uhr

Cleanup finde ich COOL. WordPress wird immer besser und einfacher. Jetzt mit WordPressMU möglichkeiten ist es für Communitys auch Super. Custom Posts ist immer eine Herausforderung. Danke für deine Info. Werde es Probieren.

Gruß

Gravatar von Ed Rowland - via garvatar.org Ed Rowland →
Kommentar 7
14. November 2010 um 16:16 Uhr

Auf diesen Blogeintrag bin ich auf meiner Suche nach einer Möglichkeit gestoßen, Linktipps in der Sidebar auszugeben, etwa wie es http://carta.info bei seiner Netzlese macht.

Da ich in Sachen WordPress-Code noch relativ neu bin, hier nur schnell eine Verständnisfrage: Könnte ich diese Custom Post Types so verwenden, dass ich damit Links mit einer kurzen Beschreibung in der Sidebar ausgeben kann?

Das ganze soll hat nicht so wie die Blogroll sein, sondern sich auf aktuelle Linktipps beziehen, eben so wie bei den Social-Media-Diensten, die man auch via Plugin in den Blog einspeisen kann. Ich möchte dazu aber eben keinen externen Dienst verwenden.

Gravatar von Ali Schwarzer - via garvatar.org Ali Schwarzer →
Kommentar 8
19. März 2011 um 11:58 Uhr

Hallo Ali,
natürlich, man muss vorher Typ, Kategorien/ Tags etc. überlegen, dann den Custom Post Type anlegen und die neusten x Beiträge in der Sidebar ausgeben.

Gravatar von Robert Hartl - via garvatar.org Robert Hartl
Kommentar 9
19. März 2011 um 12:50 Uhr

Cool, da bin ich mal gespannt, ob ich das hinbekomme!!! :D

Gravatar von Ali Schwarzer - via garvatar.org Ali Schwarzer →
Kommentar 10
19. März 2011 um 20:08 Uhr

Hallo Robert,
ich bin durch die custom post types auf eine Idee gekommen, von der ich aber nicht sicher bin, ob die so gut ist.

Kann ich damit auch einen post type definieren, der so weit wie möglich einer page/Seite entspricht? Ich kann natürlich gleich pages nehmen und es geht ja auch um das Redesign von statischen Sites mit WP, aber bei den pages habe ich das Problem, dass ich keine .html-Urls nachbauen kann. Die brauche ich aber, sonst gehen die Links ins Leere. 301 wäre auch eine Möglichkeit, aber aus SEO-Gründen nur 2. Wahl. Plugin für .html-Urls gibt es nur eines z.Z., davon mache ich mich auch nicht gerne abhängig.

Ich vermute, ich könnte mit einem custom post type genau wie mit einem post .html-Urls erzeugen und wenn es eine quasi-page wäre… wäre das die optimale Lösung. Oder?

Grüße,

Martin

Gravatar von Martin - via garvatar.org Martin
Kommentar 11
5. Juli 2012 um 00:18 Uhr

Hallo Martin,

es gibt richtigerweise ein Plugin, dass der URL der pages (Seiten) ein .html anhängt. Das haben wir auf einigen Seiten seit Jahren im Einsatz – sehr zuverlässig. Es gibt meines Wissens aber auch ein oder zwei Plugins, die zugleich auch Kategorie- usw. Permalink-Strukturen angeben lassen (teilweise auch inkl. custom post types), damit dürfte das auch gehen.

Mit den Custom Post Types hat man grundsätzlich den Nachteil, dass man in die normale Permalink-Sparte und deren Regel fällt – je nachdem für Artikel oder Seiten. Du kannst nämlich nur den Slug vorgeben, also was als Verzeichnis davor steht (quasi wie das category in den Standardeinstellungen). In Deinem Fall müsstest Du das dann also als eigenen Artikel-Typ (nicht Seiten-Typ) anlegen, was aber nicht immer passt.

Es gibt aber auch ein Plugin, dass die URL-Struktur für Custom-Post-Types so ändern lässt, dass man .html ans Ende setzen kann. Für Kategorien, Tags etc. wirkt das aber schon nicht mehr. Deshalb haben wir es auch wieder deinstalliert. Name weiß ich nicht auswendig, aber mit custom permalink in der Plugin-Suche solltest Du schon weit kommen.

Gravatar von Robert Hartl - via garvatar.org Robert Hartl
Kommentar 12
5. Juli 2012 um 14:42 Uhr

Hallo Robert,
danke soweit.

Meine Idee war, mir durch ein einen page-ähnlichen, neuen custom post type ein plugin sparen zu können, d.h., gar kein .html-plugin zu brauchen.

Weil dieser neue type wäre ja technisch ein post (custom POST type), für den man in WP bereits problemlos (ohne plugin) .html anfügen kann. Bei posts geht das in WP ohne plugin, nur bei pages nicht.

Deinen 2. Absatz habe ich nicht ganz verstanden. Wenn ich in die normale Permalink-Sparte falle, also in die der posts, bei denen .html ohne plugin möglich ist, dann wäre das doch das Erwünschte? Warum kann ich doch nur den slug vorne vorgeben?

Sorry, wenn ich das nicht raffe. Hier steht was dazu (im unteren Drittel, bei “Urls”):
http://codex.wordpress.org/Post_Types

Gravatar von Martin - via garvatar.org Martin
Kommentar 13
5. Juli 2012 um 18:08 Uhr

Wenn Du Deinen custom post type als post deklarierst, gelten dafür die normalen Permalink-Regeln, in der Du .html anhängen kannst. Der Slug gibt nur die Verzeichnisbezeichnung davor an.
Aber dann wird das wie ein Artikel (zB keine Hierarchien) behandelt. Wenn das passt, ist das ok.

Gravatar von Robert Hartl - via garvatar.org Robert Hartl
Kommentar 14
5. Juli 2012 um 18:40 Uhr

Na ja, es sollte halt wie eine page aussehen (und möglichst auch im Seiten-Code faktisch eine page sein). Das sollte durch entspr. Custom-Code in register_post_type möglich sein, oder?

Die Hierarchie kriege ich über die Navi gebacken, wo man auch posts einfügen kann.

Gravatar von Martin - via garvatar.org Martin
Kommentar 15
5. Juli 2012 um 20:13 Uhr

Kommentar schreiben zu Custom Post Types ab WordPress 3.0 nutzen

Kommentare werden erst nach manueller Freischaltung sichtbar.

Kommentar

KommentatorIn

(erforderlich)

(erforderlich, wird nicht angezeigt)

(optional)

Theresienstraße 28
D-94032 Passau

Tel.: +49 (0)851/ 966 31-31
Fax: +49 (0)851/ 966 31-41
E-Mail:

©  2001 − 2014  NETPROFIT  | Kontakt | AGB | Impressum