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.
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:
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.
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.
functions.php
im Theme bei den Artikel eine neue Kategorie Fragen aus dem Loop, Feed usw. aus.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.
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');
domain.de/fragen/fragentitel
erreichbar.
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');
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.
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;
Im Blog schreibt Robert Hartl über CMS, SEO & Webdesign. Kontakt →
Trackback-URL: https://www.netprofit.de/blog/custom-post-types-wordpress.html/trackback
Danke Uwe, wird gleich korrigiert, ist erst beim letzten Aktualisieren passiert.
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]
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
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.
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ß
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ß
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.
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.
Robert Hartl
Kommentar 9
19. März 2011 um 12:50 Uhr
Cool, da bin ich mal gespannt, ob ich das hinbekomme!!! 😀
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
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.
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
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.
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.
Martin
Kommentar 15
5. Juli 2012 um 20:13 Uhr
Kommentare werden erst nach manueller Freischaltung sichtbar. Die übermittelten Daten werden entsprechend der Datenschutzerklärung zur Verarbeitung des Kommentars gespeichert.
Nibelungenplatz 2
D-94032 Passau
Tel.: +49 (0)851/ 966 31-31
Fax: +49 (0)851/ 966 31-41
E-Mail: kontakt@netprofit.de
Ihre Codeblöcke beinhalten kein ‚>‘, wurde alles umgewandelt in >.
Kommentar 1
29. April 2010 um 13:55 Uhr