7. November 2017

WordPress Plugin Entwicklung Tutorial #3

  • Website

Im zweiten Teil dieses Tutorials haben wir uns als WordPress Agentur mit der Erstellung einer Einstellungs-Seite beschäftigt. Nun wollen wir eigene Beitragstypen, die custom post types,  erstellen und in unserem Plugin verwenden. Begleitend zum Tutorial stellen wir euch den Quellcode in diesem Git-Repository zur Verfügung.

⇒ Hier geht es direkt zu Teil #1 und Teil #2 des WordPress Plugin Entwicklung Tutorials.

Inhalte in WordPress

WordPress verwendet intern post-Objekte, um Inhalte zu verwalten. Diese Objekte repräsentieren die Inhalte der Datenbank-Tabelle wp_posts und werden verwendet, um nahezu alle Inhalte einer WordPress-Seite zu verwalten. Alle posts bestehen aus mehreren Datenfeldern, wie z.B. Name und Inhalt. Hier eine Auflistung aller Felder. Um diese Beiträge logisch voneinander zu trennen, wird das Feld post_type verwendet. Dieses ist einfach ein String, der einem Beitrag einen Typen zuordnet. WordPress definiert einige Beitragstypen vor, unter anderem Blogbeiträge und Seiten. Diese Trennung nach Beitragstypen wird sowohl im Backend (es gibt eigene Menüpunkte für Beiträge und Seiten) als auch programmatisch durch die gesamte Funktionsstruktur des WordPress-Frameworks vorgenommen.

Custom post types verwenden

Das Framework von WordPress erlaubt dem Entwickler recht einfach, eigene Inhaltstypen zu definieren und zu verwenden. Diese verhalten sich normalerweise genau so, wie es Seiten bzw. Beiträge tun und unterscheiden sich im Regelfall kaum von diesen. In erster Linie dienen sie der semantischen Trennung von Inhaltselementen. Mit ein wenig Aufwand kann man mit diesen aber sehr umfangreiche Datenstrukturen abbilden und komplexe Abläufe implementieren. Mit der erweiterten Verwendung der custom post types werden wir uns aber erst in den nächsten Teilen dieser Blog-Serie befassen. Zunächst wollen wir uns mit den Grundlagen vertraut machen.

Custom post types anlegen

Um einen eigenen Beitragstypen bei WordPress zu registrieren, wird die Funktion register_post_type verwendet. Diese erwartet als ersten Parameter einen String, der dem neuen Beitragstypen einen Namen gibt und als zweiten Parameter ein Array von Argumenten. Der String für den Namen des Beitragstypen wird auch slug genannt.

Hier ein Beispiel für die Registrierung eines custom post types:

public function register_my_custom_post_type(){

  // to shorten this we only set two labels and let the others default
  $labels = array(
    'name' => _x( 'PM Examples', 'Post Type General Name', 'text_domain' ),
    'singular_name' => _x( 'PM Example', 'Post Type Singular Name', 'text_domain' ),
  );

  $args = array(
    'label' => __( 'PM Example', 'text_domain' ),
    'description' => __( 'Example custom post type', 'text_domain' ),
    'labels' => $labels,
    'supports' => array( 'title', 'editor', 'excerpt', 'author', ),
    'taxonomies' => array( 'category', 'post_tag' ),
    'hierarchical' => false,
    'public' => true,
    'menu_position' => 5,
    'show_in_admin_bar' => true,
    'show_in_nav_menus' => true,
  );

  register_post_type( 'pm_example_cpt', $args );
}

Alle verfügbaren Argumente für das Array werden auf der Codex-Seite für die Funktion register_post_type genauer erläutert. Es gibt einen Online-Generator von GenerateWP, mit dem man den Code für die Erstellung eines custom post types generieren lassen kann.

Die oben aufgeführte Funktion register_my_custom_post_type muss nun an die init-Action des WordPress-Frameworks gekoppelt werden, damit der neue Beitragstyp verwendet werden kann. Dazu kann der obere Codeblock in die class-pm-example-admin.php eingefügt werden. Nun wird die Methode define_admin_hooks in der Datei class-pm-example.php um folgende Zeile ergänzt:

$this->loader->add_action( 'init', $plugin_admin, 'register_my_custom_post_type' );

So ist sicher gestellt, dass der custom post type immer mit dem WordPress-Framework initialisiert wird und in allen WordPress-Prozessen verfügbar ist.

Jetzt findet man im WordPress-Backend auch den Menüpunkt PM Example in der Admin-Sidebar. Hier können, equivalent zu den Seiten und Beiträgen, neue Beiträge des Typs PM Example erstellt und verwaltet werden. Diese bekommen auch eine eigene Frontend-Seite und können so direkt verwendet werden.

Custom post types mit WP_Query programmatisch abholen

Um innerhalb eines Plugins oder Themes an die Einträge eines Beitragstypen zu kommen, können verschiedene Framework-Methoden verwendet werden. Alle davon stellen aber eine Abstraktion bzw. Vereinfachung des Zugriffs über die WP_Query-Klasse dar. Diese Klasse dient dazu Beitrags-Anfragen an die WordPress-Datenbank zu stellen und wird auch intern für fast alle Seitenanfragen verwendet. In diesem Beispiel werden wir die Klasse nur oberflächlich kennenlernen, um eine einfache Abfrage zu realisieren.

Die Klasse stellt bereits bei der Konstruktion die entsprechende Datenbank-Abfrage und das Ergebnis über verschiedene Methoden zur Verfügung. Daher muss der Klassen-Konstruktur bereits mit den Daten der Abfrage aufgerufen werden. Hierfür wird wieder ein assoziatives Array verwendet.

$query_args = array (
  'post_type' => 'pm_example_cpt',
  'post_status' => 'publish',
  'posts_per_page' => 10 // use -1 for all posts
);

$query = new WP_Query( $query_args );
$all_posts = $query->get_posts();

In diesem Beispiel fragen wir 10 veröffentlichte Beiträge unseres neu erstellten Beitragstypen ab. Mit der Methode get_posts erhalten wir ein Array aller Beiträge in Form eines post-Objektes. Sollten weniger als 10 veröffentlichte Beiträge existieren, erhalten wir auch weniger Ergebnisse. Es gibt keine Fehlermeldung. Die WP_Query Klasse erlaubt es, sehr komplexe Anfragen zu erzeugen und kommt häufig zum Einsatz. Daher werden wir sie in einem späteren Teil dieser Blog-Reihe genauer kennenlernen.

Custom post types Anwendungszwecke

Eigene Beitragstypen sind vielseitig verwendbar und können für fast alle Anwendungsfälle genutzt werden, die nicht bereits durch die vordefinierten Beitragstypen bzw. durch Kategorien abgebildet werden. Hier einige Beispiele für mögliche Anwendungsfälle:

  • Produkte eines Shop-Systems
  • Termine in einem Kalender
  • Stellenausschreibungen
  • Mitarbeiter-Profile

Es existieren mehrere Mechanismen, um Beitragstypen um weitere Datenfelder zu erweitern. Am häufigsten werden hierzu die Meta-Einträge, die man jedem Beitrag zuordnen kann, benutzt. Diese Meta-Einträge erlauben es, die Inhalte um beliebige Daten zu erweitern und neue Input-Felder im Backend zu verwenden. Auf diese Mechanismen und weitere Möglichkeiten custom post types zu erweitern, gehen wir im nächsten Blog-Beitrag ein.

Zusammen­fassung

Wir haben die Grundlagen der Beitrags-Typen und post-Objekte kennengelernt und einen eigenen Beitragstyp erstellt. Zusätzlich haben wir einen ersten Einblick in die Verwendung des WP_Query-Objektes bekommen, um Beiträge gefiltert abzufragen. Diese gehören zu den wichtigsten Elementen in der WordPress Entwicklung und werden von uns als WordPress Agentur im regulären Tagesgeschäft verwendet.

Über den Autor

Waldemar Schiller

Scroll to Top