{"id":1343,"date":"2018-07-07T17:29:50","date_gmt":"2018-07-07T15:29:50","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=1343"},"modified":"2018-11-09T06:23:47","modified_gmt":"2018-11-09T05:23:47","slug":"wordpress-custom-post-types-die-ehrenrettung-als-cms","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/07\/07\/wordpress-custom-post-types-die-ehrenrettung-als-cms\/","title":{"rendered":"WordPress Custom Post Types &#8211; die Ehrenrettung als CMS?"},"content":{"rendered":"<p>Was in anderen CMS l\u00e4ngst zur Standardausr\u00fcstung geh\u00f6rt, n\u00e4mlich eine Logik zur Verwaltung und Pr\u00e4sentation unterschiedlicher Beitragstypen, ist in WordPress &#8222;out of the box&#8220; erstmal nicht machbar, man hat Blog-Beitr\u00e4ge und statische Seiten, und das wars erstmal. In Joomla habe ich daf\u00fcr die Kategorien mit einem ausgefeilten Verwaltungssystem, in Drupal die Inhaltstypen mit nicht minder komfortabler Steuerung \u00fcber die Benutzeroberfl\u00e4che.<\/p>\n<h2>Wozu braucht man \u00fcberhaupt diese Unterscheidung nach unterschiedlichen Inhaltstypen?<\/h2>\n<p>Das ist f\u00fcr einen einfachen Quasselblog erstmal noch nicht notwendig, man kann ja seine Beitr\u00e4ge \u00fcber die WordPress-Kategorien sehr feink\u00f6rnig und sogar hierarchisch logisch gruppieren. Das Kategoriensystem von WordPress ist sogar besonders ausgefeilt und komfortabel in der Bedienung, da haben sich die Core-Programmierer wirklich was einfallen lassen.<\/p>\n<p>Es stellt sich aber bei den meisten Blogs mit der Zeit heraus, dass der urspr\u00fcnglich vorgesehene Rahmen nach einiger Laufzeit zum zu engen Korsett wird. Einfaches Beispiel: dieser Blog hier, der vor anderthalb Jahren als reiner WordPress-Plauderblog angefangen hat. Mit der Zeit kamen dann noch andere Themen dazu, reine PHP- oder MySQL-Topics zum Beispiel, oder auch vor ein paar Monaten die Beitragsserie \u00fcber Joomla. Wenn ich da gleich sauber gearbeitet h\u00e4tte, h\u00e4tte ich mir gleich einen neuen Beitragstyp f\u00fcr jedes neue Thema angelegt, da hab ich geschlampert und versucht, das \u00fcber den Kategorienbaum zu steuern. Hat jetzt nicht gerade zur \u00dcbersichtlichkeit beigetragen, ich gebs ja zu. Ob ich das jetzt nachtr\u00e4glich noch umbauen m\u00f6chte weiss ich noch nicht, aber sch\u00f6ner w\u00e4rs schon man h\u00e4tte f\u00fcr jedes Haupthema eine eigene Blogseite, und auch eine eigene Kategorisierung oder auch Stichwort-Verwaltung.<\/p>\n<h2>Wieso &#8211; ist denn WordPress MultiBlog-f\u00e4hig?<\/h2>\n<p>Ein definitives &#8222;Im Prinzip ja&#8220;. Es geht halt nicht so ohne weiteres \u00fcber die Benutzeroberfl\u00e4che, man kommt nicht darum herum in die functions.php einzugreifen oder sich ein Plugin zu schreiben. Aber gehen tuts &#8211; mit Custom Post Types. Es ist noch nicht einmal besonders schwierig, und Tante Google liefert auch jede Menge Artikel zu dem Thema. Besonders informativ fand ich <a href=\"https:\/\/www.elmastudio.de\/wordpress-custom-post-types-teil1-was-sind-custom-post-types-eigentlich-und-wie-kannst-du-sie-nutzen\/\">diesen Beitrag bei Elmastudio<\/a>,\u00a0 und auch <a href=\"https:\/\/www.drweb.de\/wordpress-intern-ein-einstieg-custom-post-types-50402\/\">der Beitrag hier von drweb<\/a> bringt ordentlich Licht in die Sache. Mit den Custom Post Types in einem Atemzug werden h\u00e4ufig die Custom Taxonomies angesprochen, das klingt erstmal kompliziert, ist aber eigentlich auch nicht weiter schwierig. Man kann sich damit eigene Kategorie- und Stichwort-Logiken f\u00fcr die neuen Post Types anlegen, das ist sehr n\u00fctzlich und absolut praxistauglich.<\/p>\n<p>Wir gehens hier aber mal langsam und der Reihe nach an. Ich nehme als Beispiel wieder mein Inselfisch-Kochbuch, da haben wir gleich einen praktischen Einsatz.<\/p>\n<h2>Wozu jetzt einen neuen Beitragstyp?<\/h2>\n<p>Im Inselfisch-Kochbuch sind die Beitr\u00e4ge meine Rezepte, und das ist gut eingefahren und funktioniert auch pr\u00e4chtig. Die Anwender finden sich gut zurecht, das Kategoriensystem ist in der Praxis bew\u00e4hrt und sowohl \u00fcbersichtlich als auch informativ. Welche Inhalte also habe ich, die einen neuen Beitragstyp sinnvoll machen w\u00fcrden? Na, die Kochb\u00fccher! Die habe ich auf statische Seiten gelegt, und das ist weder besonders \u00fcbersichtlich f\u00fcr die Anwender (ellenlanges Aufklappmen\u00fc) noch f\u00fcr mich komfortabel zu pflegen. Ich h\u00e4tte ja noch eine ganze Latte Kochb\u00fccher, die ich auch gern einstellen w\u00fcrde, aber da jedesmal das Men\u00fc wieder umzustricken ist mir echt zu aufwendig. Da w\u00e4re es doch viel sch\u00f6ner, ich k\u00f6nnte im Blog-Stil meine Kochb\u00fccher der Reihe nach reinklopfen und immer wieder dynamisch welche dazuschreiben&#8230; ja, auf gehts!<\/p>\n<h2>Wie soll der neue Post Type Kochbuch aussehen?<\/h2>\n<p>Eigentlich auch nicht anders als jeder andere WordPress-Beitrag. Titel, Beschreibung, gegebenenfalls ein Bild. Dazu noch Autor und Verlag, gegebenenfalls der Preis und\u00a0 die Seitenzahl &#8211; aber das muss jetzt nicht in eine strikte Logik gepackt werden, das hat alles im Inhalt Platz. Interessanter ist es dann schon, die Kochb\u00fccher nach Herkunftsland (Bayern, USA, Asien&#8230;) zu gruppieren, daf\u00fcr werde ich eine eigene Logik basteln. Und dann nehmen wir noch eine Stichwortverwaltung mit rein, in der k\u00f6nnte sowas stehen wie: Nachschlagewerk, Lesefutter, Grundrezepte, Spezialit\u00e4ten, F\u00fcr Anf\u00e4nger, f\u00fcr Profis&#8230; das kommt dann beim Eintragen der Kochb\u00fccher, da wird sich noch einiges finden. F\u00fcr die Herkunftsl\u00e4nder macht eine hierarchische Kategorien-Logik Sinn (Asien\/Thailand, Asien\/China&#8230;), f\u00fcr die Stichw\u00f6rter (irgendwie logisch) die Stichw\u00f6rter. Das legen wir uns jetzt mal der Reihe nach an.<\/p>\n<h2>Definition des neuen Post Types Kochbuch in der functions.php<\/h2>\n<p>Da k\u00f6nnen wir so gut wie alle WordPress-Beitragseigenschaften \u00fcbernehmen, deswegen wird die Definition relativ kurz und knackig:<\/p>\n<pre>function post_type_<span style=\"color: #ff0000;\">kochbuch<\/span>() {\r\n\u00a0\u00a0 \u00a0register_post_type(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 '<span style=\"color: #ff0000;\">kochbuch<\/span>',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 array(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'label' =&gt; __(<span style=\"color: #ff0000;\">'Kochbuch'<\/span>),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'public' =&gt; true,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'show_ui' =&gt; true,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'supports' =&gt; array(\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0'title',\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0'editor',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'post-thumbnails',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'custom-fields',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'revisions')\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 )\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\r\n}\r\nadd_action('init', '<span style=\"color: #ff0000;\">post_type_kochbuch<\/span>');<\/pre>\n<p>Damit ist der neue Post-Type auch schon angelegt und taucht bereits im Admin-Men\u00fc auf:<\/p>\n<div id=\"attachment_1345\" style=\"width: 860px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1345\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1345\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/07\/kochbuch_admin.jpg\" alt=\"kochbuch_admin\" width=\"850\" height=\"516\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/07\/kochbuch_admin.jpg 850w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/07\/kochbuch_admin-300x182.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/07\/kochbuch_admin-768x466.jpg 768w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/07\/kochbuch_admin-624x379.jpg 624w\" sizes=\"(max-width: 850px) 100vw, 850px\" \/><p id=\"caption-attachment-1345\" class=\"wp-caption-text\">kochbuch_admin<\/p><\/div>\n<p>Man kann auch schon mal testweise einen neuen Eintrag vom Typ Kochbuch anlegen, aber wenn man ihn anschauen will, kommt wahrscheinlich die 404-Fehlermeldung. Wir machen auch erst mal noch was anderes:<\/p>\n<h2>Ein Template f\u00fcr den neuen Post Type anlegen<\/h2>\n<p>Daf\u00fcr klemmt man sich die archive.php aus dem Parent-Theme und macht eine Kopie mit dem Namen archive-kochbuch, die legt man ins ChildTheme-Verzeichnis. Zuerst \u00e4ndert man den Templatenamen:<\/p>\n<pre>\/**\r\n\u00a0* Template Name: Kochbuch Archive pages\r\n\u00a0*\r\n\u00a0*\/<\/pre>\n<p>Dann erg\u00e4nzt man den Code unmittelbar vor dem Loop um eine Zeile, so da\u00df WordPress auch den richtigen Post Type anzieht:<\/p>\n<pre><span style=\"color: #ff0000;\">&lt;?php query_posts(array('post_type'=&gt;'kochbuch')); ?&gt;<\/span>\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;?php\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/* Start the Loop *\/\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while ( have_posts() ) : the_post();<\/pre>\n<p>Jetzt noch im Dashboard unter Einstellungen\/Permalinks einmal die Permalink-Einstellungen speichern. Jetzt sollte man sich den eben erstellten ersten Kochbuch-Beitrag auch angucken k\u00f6nnen.<\/p>\n<h2>Eine eigene Seite f\u00fcr die Kochb\u00fccher erstellen<\/h2>\n<p>Neue Seite erstellen, ich nenn sie mal einfach Kochb\u00fccher. Wenn alles geklappt hat, kann man jetzt bei den Templates das soeben erstellte Kochbuch-Template anw\u00e4hlen:<\/p>\n<div id=\"attachment_1346\" style=\"width: 325px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1346\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1346\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/07\/kochbuch_template.jpg\" alt=\"kochbuch_template\" width=\"315\" height=\"308\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/07\/kochbuch_template.jpg 315w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/07\/kochbuch_template-300x293.jpg 300w\" sizes=\"(max-width: 315px) 100vw, 315px\" \/><p id=\"caption-attachment-1346\" class=\"wp-caption-text\">kochbuch_template<\/p><\/div>\n<p>Damit werden auf dieser Seite automatisch alle Beitr\u00e4ge vom neuen Post Type Kochbuch angezeigt. Diese Seite f\u00fcgt man sich jetzt noch in sein Men\u00fc ein, und schon kann man loslegen.<\/p>\n<p>Jetzt fehlt noch ein bisschen Feintuning, zum Beispiel m\u00f6chte ich noch die Herkunftsl\u00e4nder und die Stichworte haben, aber daf\u00fcr gibt es einen neuen Beitrag.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was in anderen CMS l\u00e4ngst zur Standardausr\u00fcstung geh\u00f6rt, n\u00e4mlich eine Logik zur Verwaltung und Pr\u00e4sentation unterschiedlicher Beitragstypen, ist in WordPress &#8222;out of the box&#8220; erstmal nicht machbar, man hat Blog-Beitr\u00e4ge und statische Seiten, und das wars erstmal. In Joomla habe ich daf\u00fcr die Kategorien mit einem ausgefeilten Verwaltungssystem, in Drupal die Inhaltstypen mit nicht minder [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1,48,42,2,59],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1343"}],"collection":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/comments?post=1343"}],"version-history":[{"count":5,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1343\/revisions"}],"predecessor-version":[{"id":1350,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1343\/revisions\/1350"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=1343"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=1343"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=1343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}