WordPress als CMS: eigene Seiten-Typen definieren (Anleitung)

Wordpress als CMS: Seiten-Typen definieren

Wordpress als CMS: Seiten-Typen definieren - Foto / Illustration: T.Bortels/cpu20.de

WordPress ist ja nicht nur ein großartiges Werkzeug, um relativ unkompliziert eine Webseite, einen Blog oder eine News-Seite zu erstellen. Man kann WordPress inzwischen auch so weit anpassen, dass es sich durchaus als Content Management System (CMS) nutzen läßt. „WordPress als CMS“ ist ein großes Thema – aber was macht ein CMS aus?

Vorweg muß ich schnell anmerken, daß es mich ein wenig nervt, daß bei WordPress die Inhaltstypen ‚Post Types‘ genannt werden, und nicht ‚Content Types‘. Man gewöhnt sich zwar bekanntlich an fast alles, aber irgendwann sollte man diese Fehlbennung korrigieren. Warum? Der Begriff ‚Post Type‘ suggeriert, dass in WordPress eigentlich alles einer ‚Seiten-Matapher‚ folgen würde – was ich generell begrüßen würde. Allerdings gibt es bereits einen  Seitentypen (Post Type) „Seiten“ und das stiftet ein wenig Verwirrung. Denn sowohl „Seiten“ als auch „Beiträge“ sind bei WordPress Seiten-Typen. Dieser Umstand ist vermutlich der Geschichte von WordPress zu verdanken – als Blog-Tool ging es zunächst eben hauptsächlich um „Posts“. Seiten waren dann eine spezielle Art von eines „Posts“. Aber das führt jetzt vielleicht zu weit.

Was macht WordPress zu einem Content Management System?

Für mich ist die Möglichkeit, eigene Seitentypen definieren zu können vermutlich das wichtigste Kriterium, das WordPress zu einem CMS macht. Wenn man unterschiedliche Inhalts-Typen oder Daten-Typen verwalten möchte, kommt man nicht darum herum, diese Daten unterschiedlich zu behandeln. Jeder Inhalts-Typ hat seine ganz speziellen Eigenschaften. Eine Webseite für ein Plattenlabel hat beispielsweise Seiten zu Bands, Seiten zu Alben, Seiten zu einzelnen Songs – und vielleicht einen Konzert-Kalender. Hinzu kommen Seiten mit allgemein gehaltenen Informationen zum Label – also zum Beispiel ‚Info-Seiten‘ über die Label-Geschichte etc.

Wordpress CMS: eigene Seiten-Typen definieren

WordPress: Übersicht des Seiten-Typen „Info-Page“

Unterschiedliche Inhaltstypen sind in der Regel zunächst mal unterschiedliche Daten-Typen. Um diesen Daten Bedeutung geben zu können, sollten sie entsprechend unterschiedlich behandelt bzw. gehandhabt werden können. Und das ist nur dann möglich, wenn das CMS auch wirklich unterschiedliche Daten- bzw. Inhaltstypen unterschiedlich behandeln kann. Als Folge können dann Inhaltstypen jeweils eigene Eingabefelder, ein eigenes Template, ein eigenes Layout, eine eigene ‚Gestalt‘ haben.

Seiten-Typen mithilfe von Themes vs. Plugins definieren

Es gibt eine Fülle von WordPress Themes – sowohl kostenpflichtige ‚Premium‘ Themes, als als kostenlose Themes. Ein Premium Theme zeichnet sich häufig dadurch aus, dass es für einen besonderen Anwendungsfall konzipiert wurde. Es gibt Premium Themes für so ungefähr jeden Anwendungsfall: Ein Premium Theme für Fotografen ist vielleicht besonders stark in der Präsentation von Fotos und bringt einen Seitentypen „Portfolio“ mit – ein Premium Theme für Veranstaltungsorte wird vermutlich einen Content Typen „Termine“ mitbringen.

Für viele Nutzer sind solche mehr oder weniger fertig eingerichteten Themes einfach praktisch. Für die verschiedenen Anwendungsfälle bringt das Theme gleich die passenden Seiten-Typen mit – man muß die Webseite dann ’nur noch‘ den eigenen Wünschen entsprechend anpassen. Allerdings findet dadurch auch eine Vermischung von Gestaltung und Funktion statt – die Seiten-Typen sind im Theme integriert. Das kann sich als Nachteil herausstellen, wenn man eines Tages beispielsweise die Gestaltung der Webseite ändern möchte, die Seiten-Typen aber behalten möchte.

Das Probleme wird auch „Theme-Lock“ genannt. Das bedeutet, man läuft Gefahr, sich von diesem einen speziellen Theme abhängig zu machen. Am Anfang mag man diese Gefahr noch nebensächlich erscheinen. Hat man aber erstmal hunderte oder tausende Datensätze eingegeben ist ein Umzug auf ein anderes Theme nur unter Einsatz von viel Arbeit möglich – oder man hilft sich mit einem speziell angepassten Child-Theme.

Eigene Seiten-Typen-Templates in WordPress definieren

Neben Themes gibt es natürlich auch zahlreiche Plug-ins, die entweder neue Seitentypen ‚fertig‘ zur Verfügung stellen, oder einem beim Einrichten von neuen Seitentypen helfen. Aber letztendlich ist es vermutlich die eleganteste Vorgehensweise, wenn man genau den Seitentypen selbst definiert, den man gerade benötigt.

Grundsätzlich lassen sich in WordPress eigene Seitentypen auf zwei Arten definieren: entweder über die functions.php Datei des Themes, oder über ein eigenes Plugin. Und das gehlt leichter, als man vielleicht zunächst vermutet. Eigentlich sind nur zwei Schritte notwendig: über eine Funktion wird zunächst der neue Seitentyp definiert. Dann muß diese Funktion initialisiert werden, um WordPress den neuen Inhaltstypen zur Verfügung zu stellen. Anschliessend kann man damit beginnen, eigene Templates für den neuen Seitentypen anzulegen.

Einen neuen Inhaltstyp in einer Funktion beschreiben

Der folgende Code kann im Prinzip auch als eigenständiges Plugin eingebunden werden. Hier gehen wir aber erst mal davon aus, dass der Code der Theme-Datei functions.php hinzugefügt wird. Das ist zwar langfristig nicht ganz so flexibel, wie ein Plugin, da nun der Content-Typ mehr oder weniger mit dem Theme verknüpft ist – führt aber erst mal zu demselben Ziel:

function my_custom_content_type() {
$labels = array(
 'name'               => 'Info-Page',
 'singular_name'      => 'Info-Page',
 'menu_name'          => 'Info-Pages',
 'name_admin_bar'     => 'Info-Page'
};

$args = array(
 'labels'              => $labels,
 'public'              => true,
 'exclude_from_search' => false,
 'publicly_queryable'  => true,
 'show_ui'             => true,
 'show_in_nav_menus'   => true,
 'show_in_menu'        => true,
 'show_in_admin_bar'   => true,
 'menu_position'       => 5,
 'menu_icon'           => 'dashicons-admin-appearance',
 'capability_type'     => 'post',
 'hierarchical'        => false,
 'supports'            => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ),
 'has_archive'         => false,
 'rewrite'             => array( 'slug' => 'info-page' ),
 'query_var'           => true
 );

register_post_type( 'custom_content_type', $args );#
 // flush_rewrite_rules();
 }

add_action( 'init', 'my_custom_content_type', 0 );

Der oben gezeigt Code ist bereits vollkommen ausreichend, um den neuen Content-Typen „Info Page“ einzurichten. Anschliessend wird im Administrationsbereich ein neuer menupunkt „Info Pages“ zu sehen sein, über den sich Seiten anlegen und verwalten lassen.

Abschliessend können wir dem Theme nun auch noch eine neue Template-Datei für den eben definierten Inhaltstypen hinzufügen. Diese wird dann von WordPress automatisch erkannt und  geladen, um Inhalte dieses Typs anzuzeigen. Zunächst genügt es vollkommen, wenn die Datei „single.php“ als Kopie unter neuem Namen „single_custom_content_type.php“ abgespeichert und in das Theme-Verzeichnis des Servers geladen wird – in diesem Falle wäre das dann „single_info-pages.php“. Diese wird allerdings nur dann die passenden Inhalte laden können, wenn in dieser Datei folgende Zeile angepasst wird.

Schritt zwei: Initialisierung der Funktion / des Inhaltstypen

In der Datei  „single_custom_content_type.php“ anstelle von diesem Code-Schnippsel:

<?php get_template_part( 'content', get_post_format() ); ?>

…sollte mit folgendem Code-Schnippsel ersetzt werden:

<?php get_template_part( 'content', 'custom_content_type' ); ?>

…und fertig ist die Laube…

Vorteile von eigenen Seiten-Typen

Sogar ohne eigene Felder und ohne zusätzliche Style-Definitionen etc. ergeben sich umgehend folgende Vorteile:

  • Der Pager / die Blätterfunktion erkennt den neuen Inhaltstypen. Innerhalb eines Inhaltstypen läßt sich so direkt von Seite zu Seite blättern, ohne dass unterschiedliche Inhalte miteinander vermischt werden.
  • Die Navigationsleiste des Administrationsbereichs bekommt automatisch neue Funktionalitäten: mit einem Klick lassen sich alle Inhalte gleichen Typs übersichtlich auflisten und neue Seiten dieses Types hinzufügen (siehe Abbildung oben).
  • Seiten des neuen Inhaltstypen teilen sich alle dasselbe Stammverzeichnis, das im Code oben unter ’slug‘ bzw. unter  „rewrite“ angegeben wird. Dies gibt den Seiten Bedeuteung, sowohl für Nutzer, die die Seite aufrufen und die URL sehen, als auch für Suchmaschinen. Ausserdem können alle Seiten dieses Typs übersichtlich in einer  Web-Statistiken (z.B. PiWik) miteinander verglichen werden.

Das Definieren von speziellen Inhaltstypen ist natürlich nur ein erster Schritt. Aber immerhin. In den meisten Fällen möchte man nun vermutlich auch eigene Felder definieren – also eine spezielle EIngabemaske für diesen Content-Typen einrichten. Ob man nun diese Felder selbst per Code definiert oder ein PlugIn dafür nutzt muss natürlich jeder selbst für sich entscheiden. Wenn man bespielsweise vorwiegend Webseiten für Bands baut kann es sinnvoll sein. die Eingabemaske selbst zu programmieren und langfristig vielleicht ein eigenes Plugin zu entwickeln. Für die meisten Anwendungsfälle dürfte es aber ausreichen, ein entsprechendes Plug-In wie z.B. ACF oder Pods zu nutzen. Dazu mehr in einem anderen Artikel.

Inhaltstypen für bereits bestehende Seiten ändern

Häufig sieht die Situation ja so aus: man hat bereits eine WordPress-Installation mit einigen Einträgen und Seiten – unter Umständen hat man bereits viele Seiten. Dann kommt man irgendwann auf die Idee, dass es praktischer wäre, einige der Seiten einem neuen, eigenen Inhaltstypen zuzuordnen. Das ist dan des kleinen Plugins Post Type Switcher (wordpress.org/plugins/post-type-switcher/) relativ einfach machbar. Man muß das Plugin nur installieren und aktivieren und schon bekommt man für alle Seiten eine kleine Dropdown-Auswahl, über die sich der Seitentyp nachträglich ändern läßt. Und natürlich gibt es auch eine Möglichkeit, per Massen-Aktualisierung gleich meherere Seiten auf einemal einem neuen Inhaltstypen zuzuordnen. Und bei Fragen: einfach fragen!

Schreibe einen Kommentar

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