Irgendwann kommt man an den Punkt wo die in WordPress gängigen Post Types Artikel und Seite nicht mehr ausreichen. Als Beispiel für diese Problematik kann man die Darstellung von verschiedenen Referenten einer Konferenz nehmen. Hier möchte man gerne den Namen, das Bild und noch andere Daten zu einer Person eingeben, um diese im Anschluss aufbereitet auszugeben. Das Zauberwort dafür heißt Custom Post Types.

Zur Erläuterung dieser Funktion greife in nochmals das Thema Redner einer Konferenz auf. Unsere Redner sollen einen Namen, ein Bild, eine Beschreibung und Kontaktdaten haben und in einer Übersicht ausgegeben werden.

Zu erst verschaffen wir uns per FTP oder auf anderem Wege Zugriff auf unsere WordPress-Installation. Dort wechseln wir nun in den Ordner „wp-content/themes/mytheme“, wo unsere Template-Dateien liegen. Um nun einen neuen Custom Post Type anzulegen, öffnen wir die functions.php in einem geeigneten Editor. Dort sollten schon einige Funktionen vorhanden sein.

Die einfachste Möglichkeit einen Custom Post Type zu nutzen ist die Verwendung dieses minimalen Code-Schnipsels.

<?php
add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'redner',
    array(
      'labels' => array(
        'name' => __( 'Redner' ),
        'singular_name' => __( 'Redner' )
      ),
      'public' => true,
      'has_archive' => true,
    )
  );
}
?>

Custom Post Types: Redner Übersicht

Diese paar Zeilen legen den neuen Typen „Redner“ in WordPress an. Dadurch können wir uns die Übersicht ansehen und Redner erstellen, da wir mehr als nur das realisieren wollen, nutzen wir diese Zeilen als Basis und fügen noch weitere Zeilen hinzu.

<?php
// Register Custom Post Type Redner
function gen_cpt_redner() {

    $labels = array(
        'name'                => 'Redner',
        'singular_name'       => 'Redner',
        'menu_name'           => 'Redner',
        'parent_item_colon'   => 'Redner',
        'all_items'           => 'Alle Redner',
        'view_item'           => 'Zeige Redner',
        'add_new_item'        => 'Neuen Redner anlegen',
        'add_new'             => 'Neuen Redner anlegen',
        'edit_item'           => 'Redner bearbeiten',
        'update_item'         => 'Redner aktualisieren',
        'search_items'        => 'Redner suchen',
        'not_found'           => 'Kein Redner gefunden',
        'not_found_in_trash'  => 'Kein Redner gefunden im Papierkorb',
    );
    $rewrite = array(
        'slug'                => 'redner',
        'with_front'          => true,
        'pages'               => true,
        'feeds'               => true,
    );
    $args = array(
        'label'               => 'Redner',
        'description'         => 'Ermöglicht das Anlegen und Ausgeben von Rednern',
        'labels'              => $labels,
        'supports'            => array( 'title', 'editor', 'thumbnail', ),
        'hierarchical'        => false,
        'public'              => true,
        'show_ui'             => true,
        'show_in_menu'        => true,
        'show_in_nav_menus'   => true,
        'show_in_admin_bar'   => true,
        'menu_position'       => 5,
        'menu_icon'           => 'dashicons-admin-users',
        'can_export'          => true,
        'has_archive'         => true,
        'exclude_from_search' => false,
        'publicly_queryable'  => true,
        'rewrite'             => $rewrite,
    );
    register_post_type( 'Redner', $args );

}
// Hook into the 'init' action
add_action( 'init', 'gen_cpt_redner', 0 );

add_action( 'admin_init', "cpt_redner_meta_boxen" );
add_action( 'save_post', "cpt_redner_daten_speichern" );

function cpt_redner_meta_boxen(){
    add_meta_box("kontakt-meta", "Kontaktdaten", "cpt_redner_feld_kontakt", "redner", "side", "low");
}
function cpt_redner_feld_kontakt(){
    global $post;
    $custom = get_post_custom($post->ID);
    $kontaktfeld = $custom["kontaktfeld"][0];
    echo '<textarea name="kontaktfeld">'. $kontaktfeld . '</textarea>';
}
function cpt_redner_daten_speichern(){
    global $post;
    update_post_meta($post->ID, "redner", $_POST["kontaktfeld"]);
}
?>

Custom Post Types: Redner anlegen

Die Ausgabe der im Custom Post Type erstellten Daten wird im kommenden Post zum Thema „Ausgabe und Darstellung von Custom Post Types in WordPress“ erläutert. Dort werden die Formate Archiv und Single behandelt und mit Beispielen untermalt.

Wer sich die Zeit mit dem Code sparen möchte, kann auch den Generator von generatewp.com nutzen. Es empfiehlt sich jedoch bereits ein gewisses Verständnis für dieses Thema mitzubringen. Durch das Verwenden von Custom Post Types lassen sich auch einfach ein Portfolio, ein Lebenslauf oder ein Pressebereich in WordPress gestalten. Wer sich sehr für gute Lektüre interessiert, dem kann ich das Buch WordPress 4: Das umfassende Handbuch (Galileo Computing) nur empfehlen, da dort ziemlich viele Dinge gut erläutert werden. Außerdem hat man immer wieder alles schnell auf einen Blick, wenn man was sucht.

Links zum Beitrag: