WordPress Custom Post Type

Wordpress Custom Post Type Plugin
Es existiert ein Beitrag für eine überarbeitete Version als Plugin. Bitte beachten Sie die bessere Wartbarkeit als Plugin.

WordPress ist schon lange keine reine Blogging-Software mehr. Viele Internetpräsenzen werden mit Hilfe der Software umgesetzt und dann ist auch immer öfter ein spezieller Beitragstyp notwendig. Entweder weil man die Typen sauber voneinander trennen möchte, oder aber auch weil der neue Beitragstyp weitere Eigenschaften haben soll. Dazu besteht die Möglichkeit einen „WordPress Custom Post Type“ (Eigener Beitragstyp) zu erstellen.

Vorwort

An einem fiktiven Beispiel wollen wir zeigen was dazu notwendig ist. Nehmen wir an, es soll eine Webseite für einen Autoverkäufer mit WordPress realisiert werden. Dazu soll ein Post Type „Fahrzeuge“ erstellt werden. Dieser wiederum soll in verschiedene Kategorien einsortiert werden können. Zum Beispiel „Limosine“, „Kombi“ und „Cabrio“.

Für die kommenden Zeilen setze ich Grundkenntnisse im Umgang mit einem Editor und der Programmiersprache PHP voraus.

Eine zentrale Rolle für unser Vorhaben spielt die functions.php in dem jeweiligen Theme. Hier werden, für das Thema erforderliche Funktionen platziert und automatisch eingebunden.

Den WordPress Custom Post Type erstellen

Als Erstes öffnen wir also die functions.php des entsprechenden Themes im Editor. Für das Theme Twenty-Twelve liegt diese Datei im Pfad: /wp-content/themes/twentytwelve/functions.php. Wir benötigen eine eigene Funktion, welche den Beitragstyp initialisiert.

/**
 * Custom post type
 */
function custom_post_type_vehicles()
{
    // register_post_type
}

Dazu bedienen wir uns der WordPress-Eigenen Funktion register_post_type().

$arrLabels = array(
    'name' => __( 'Fahrzeuge', 'vehicles' ),
    'singular_name' => __( 'Fahrzeug', 'vehicles' ),
    'all_items' => __( 'Alle Fahrzeuge', 'vehicles' ),
    'add_new' => __( 'Hinzufügen', 'vehicles' ),
    'add_new_item' => __( 'Fahrzeug hinzufügen', 'vehicles' ),
    'edit_item' => __( 'Fahrzeug bearbeiten', 'vehicles' ),
    'new_item' => __( 'Neues Fahrzeug', 'vehicles' ),
    'view_item' => __( 'Fahrzeug ansehen', 'vehicles' ),
    'items_archive' => __( 'Fahrzeug Archiv', 'vehicles' ),
    'search_items' => __( 'Fahrzeug suchen', 'vehicles' ),
    'not_found' => __( 'Kein Fahrzeug gefunden', 'vehicles' ),
    'not_found_in_trash' => __( 'Kein Fahrzeug im Papierkorb gefunden', 'vehicles' )
);
$arrArgs = array(
    'labels' => $arrLabels,
    'description' => _e( 'Eckdaten und Ausstattungen unserer Fahrzeuge', 'vehicles' ),
    'public' => true,
    'show_ui' => true,
    'menu_position' => 5,
    'supports' => array(
        'title',
        'editor',
        'excerpt',
        'custom-fields',
        'page-attributes'
    ),
    'rewrite' => array( 'slug' )
);
register_post_type( 'vehicle', $arrArgs );

Dann nutzen wir die Funktion add_action() um unseren eigenen Post Type zu initialisieren. Wer die Struktur der functions.php etwas aufgeräumter mag, sollte im unteren Bereich die Funktionen schreiben und alle add_action-Anweisungen direkt in den ersten Zeilen der Datei unterbringen. Der komplette Code sieht dann so aus.

add_action( 'init', 'custom_post_type_vehicles' );
/**
 * Custom post type
 */
function custom_post_type_vehicles()
{
    $arrLabels = array(
        'name' => __( 'Fahrzeuge', 'vehicles' ),
        'singular_name' => __( 'Fahrzeug', 'vehicles' ),
        'all_items' => __( 'Alle Fahrzeuge', 'vehicles' ),
        'add_new' => __( 'Hinzufügen', 'vehicles' ),
        'add_new_item' => __( 'Fahrzeug hinzufügen', 'vehicles' ),
        'edit_item' => __( 'Fahrzeug bearbeiten', 'vehicles' ),
        'new_item' => __( 'Neues Fahrzeug', 'vehicles' ),
        'view_item' => __( 'Fahrzeug ansehen', 'vehicles' ),
        'items_archive' => __( 'Fahrzeug Archiv', 'vehicles' ),
        'search_items' => __( 'Fahrzeug suchen', 'vehicles' ),
        'not_found' => __( 'Kein Fahrzeug gefunden', 'vehicles' ),
        'not_found_in_trash' => __( 'Kein Fahrzeug im Papierkorb gefunden', 'vehicles' )
    );
    $arrArgs = array(
        'labels' => $arrLabels,
        'description' => __( 'Eckdaten und Ausstattungen unserer Fahrzeuge', 'vehicles' ),
        'public' => true,
        'show_ui' => true,
        'menu_position' => 5,
        'supports' => array(
            'title',
            'editor',
            'excerpt',
            'custom-fields',
            'page-attributes'
        ),
        'rewrite' => array( 'slug' )
    );
    register_post_type( 'vehicle', $arrArgs );
}

Laden wir nun den Administrationsbereich, taucht in der Navigation – direkt unter den Standard-Beiträgen – ein neuer Punkt „Fahrzeuge“ auf. Damit wäre der erste Schritt getan und wir können nun Fahrzeuge anlegen, bearbeiten und löschen.

Die Kategorien erstellen

Wir haben im Vorfeld beschlossen, dass wir die Fahrzeuge in Kategorien einteilen möchten. Dazu erweitern wir unsere zuvor geschriebene custom_post_type_vehicles() mit der Funktion register_taxonomy().

/**
 * Custom post type
 */
function custom_post_type_vehicles()
{
    /**
     * register_post_type (siehe oben)
     */
    $arrTaxArgs = array(
        'labels' => array(
            'name' => __( 'Fahrzeugtypen', 'vehicle' ),
            'singular_name' => __( 'Fahrzeugtyp', 'vehicle' ),
            'all_items' => __( 'Alle Fahrzeugtypen', 'vehicle' ),
            'edit_item' => __( 'Fahrzeugtyp bearbeiten', 'vehicle' ),
            'view_item' => __( 'Fahrzeugtyp anzeigen', 'vehicle' ),
            'update_item' => __( 'Fahrzeugtyp ändern', 'vehicle' ),
            'add_new_item' => __( 'Fahrzeugtyp hinzufügen', 'vehicle' ),
            'parent_item' => __( 'Übergeordneter Fahrzeugtyp', 'vehicle' ),
            'search_items' => __( 'Fahrzeugtyp suchen', 'vehicle' )
        ),
        'hierarchical' => true,
        'rewrite' => array( 'slug' )
    );
    register_taxonomy( 'vehicle_categories', 'vehicle', $arrTaxArgs );
}

Nun lassen sich verschiedene Fahrzeugtypen anlegen und zuordnen.

Widget für ein Zufallsfahrzeug erstellen

Unsere Widget-Klasse wird von der WordPress-Klasse WP-Widget abgeleitet und besteht aus insgesamt 4 Methoden.

/**
 * Widget: Random vehicle
 */
class random_vehicle_widget extends WP_Widget
{
    // initialisiert die WP_Widget-Klasse
    function __construct() {}
    // Stellt unser Widget im Frontend dar
    function widget( $arrArgs, $instance ) {}
}

Der Konstruktor ist schnell geschrieben. Hier wollen wir das Widget mit Namen und Beschreibung standardmäßig initialisieren.

function __construct()
{
    $arrOptions = array(
        'name' => __( 'Zufallsfahrzeug', 'vehicle' ),
        'description' => __( 'Stellt ein Fahrzeug nach dem Zufallsprinzip dar.', 'vehicle' )
    );
    parent::WP_Widget( false, $arrOptions['name'], $arrOptions );
}

Nun widmen wir uns dem Erscheinungsbild unseres Widget.

function widget( $arrArgs, $instance )
{
    $arrCache = wp_cache_get( 'widget_random_vehicle', 'widget' );
    if ( !is_array( $arrCache ) ) $arrCache = array();
    if ( !isset( $arrArgs['widget_id'] ) ) $arrArgs['widget_id'] = $this->id;
    if ( isset( $arrCache[ $arrArgs['widget_id'] ] ) )
    {
        echo $arrCache[ $arrArgs['widget_id'] ];
        return;
    }
    ob_start();
    extract( $arrArgs );
    $strTitle = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );
    // Zufallsfahrzeug auslesen
    $objRandVehicle = new WP_Query(
        array(
            'post_type' => 'vehicle',
            'post_status' => 'publish',
            'posts_per_page' => 1,
            'orderby' => 'rand'
        )
    );
    if ( $objRandVehicle->have_posts() )
    {
        echo '<ul id="widget-random-vehicle">';
        while( $objRandVehicle->have_posts() )
        { 
            $objRandVehicle->the_post();
            echo '<li>';
            echo '    <a href="' . the_permalink() . '" title="' . esc_attr( get_the_title() ) . '">';
            echo '        ' . esc_attr( get_the_title() );
            echo '    </a>';
            echo '</li>';
        }
        echo '</ul>';
        wp_reset_postdata(); 
    } 
    $arrCache[ $arrArgs['widget_id'] ] = ob_get_flush();
    wp_cache_set( 'widget_random_vehicle', $arrCache, 'widget' );
}

Weil unser Widget keine speziellen Einstellungen braucht, überschreiben wir die Methoden update und form nicht. Nun muss unser eigendefiniertes Widget nur noch registriert werden. Dass übernimmt die Funktion register_widget. Diesen Abschnitt schreiben wir wieder in die ersten Zeilen der functions.php

register_widget( 'random_vehicle_widget' );

Das vollständige Beispiel

Komplett sieht das Ganze dann wie folgt aus.

add_action( 'init', 'custom_post_type_vehicles' );
register_widget( 'random_vehicle_widget' );
/**
 * Custom post type
 */
function custom_post_type_vehicles()
{
    $arrLabels = array(
        'name' => __( 'Fahrzeuge', 'vehicles' ),
        'singular_name' => __( 'Fahrzeug', 'vehicles' ),
        'all_items' => __( 'Alle Fahrzeuge', 'vehicles' ),
        'add_new' => __( 'Hinzufügen', 'vehicles' ),
        'add_new_item' => __( 'Fahrzeug hinzufügen', 'vehicles' ),
        'edit_item' => __( 'Fahrzeug bearbeiten', 'vehicles' ),
        'new_item' => __( 'Neues Fahrzeug', 'vehicles' ),
        'view_item' => __( 'Fahrzeug ansehen', 'vehicles' ),
        'items_archive' => __( 'Fahrzeug Archiv', 'vehicles' ),
        'search_items' => __( 'Fahrzeug suchen', 'vehicles' ),
        'not_found' => __( 'Kein Fahrzeug gefunden', 'vehicles' ),
        'not_found_in_trash' => __( 'Kein Fahrzeug im Papierkorb gefunden', 'vehicles' )
    );
    $arrArgs = array(
        'labels' => $arrLabels,
        'description' => __( 'Eckdaten und Ausstattungen unserer Fahrzeuge', 'vehicles' ),
        'public' => true,
        'show_ui' => true,
        'menu_position' => 5,
        'supports' => array(
            'title',
            'editor',
            'excerpt',
            'custom-fields',
            'page-attributes'
        ),
        'rewrite' => array( 'slug' )
    );
    register_post_type( 'vehicle', $arrArgs );
    $arrTaxArgs = array(
        'labels' => array(
            'name' => __( 'Fahrzeugtypen', 'vehicle' ),
            'singular_name' => __( 'Fahrzeugtyp', 'vehicle' ),
            'all_items' => __( 'Alle Fahrzeugtypen', 'vehicle' ),
            'edit_item' => __( 'Fahrzeugtyp bearbeiten', 'vehicle' ),
            'view_item' => __( 'Fahrzeugtyp anzeigen', 'vehicle' ),
            'update_item' => __( 'Fahrzeugtyp ändern', 'vehicle' ),
            'add_new_item' => __( 'Fahrzeugtyp hinzufügen', 'vehicle' ),
            'parent_item' => __( 'Übergeordneter Fahrzeugtyp', 'vehicle' ),
            'search_items' => __( 'Fahrzeugtyp suchen', 'vehicle' )
        ),
        'hierarchical' => true,
        'rewrite' => array( 'slug' )
    );
    register_taxonomy( 'vehicle_categories', 'vehicle', $arrTaxArgs );
}
/**
 * Widget: Random vehicle
 */
class random_vehicle_widget extends WP_Widget
{
    function __construct()
    {
        $arrOptions = array(
            'name' => __( 'Zufallsfahrzeug', 'vehicle' ),
            'description' => __( 'Stellt ein Fahrzeug nach dem Zufallsprinzip dar.', 'vehicle' )
        );
        parent::WP_Widget( false, $arrOptions['name'], $arrOptions );
    }

    function widget( $arrArgs, $instance )
    {
        $arrCache = wp_cache_get( 'widget_random_vehicle', 'widget' );
        if ( !is_array( $arrCache ) ) $arrCache = array();
        if ( !isset( $arrArgs['widget_id'] ) ) $arrArgs['widget_id'] = $this->id;
        if ( isset( $arrCache[ $arrArgs['widget_id'] ] ) )
        {
            echo $arrCache[ $arrArgs['widget_id'] ];
            return;
            }
        ob_start();
        extract( $arrArgs );
        $strTitle = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );
        // Zufallsfahrzeug auslesen
        $objRandVehicle = new WP_Query(
            array(
                'post_type' => 'vehicle',
                'post_status' => 'publish',
                'posts_per_page' => 1,
                'orderby' => 'rand'
            )
        );
        if ( $objRandVehicle->have_posts() )
        {
            echo '<ul id="widget-random-vehicle">';
            while( $objRandVehicle->have_posts() )
            { 
                $objRandVehicle->the_post();
                echo '<li>';
                echo '    <a href="' . the_permalink() . '" title="' . esc_attr( get_the_title() ) . '">';
                echo '        ' . esc_attr( get_the_title() );
                echo '    </a>';
                echo '</li>';
            }
            echo '</ul>';
            wp_reset_postdata(); 
        } 
        $arrCache[ $arrArgs['widget_id'] ] = ob_get_flush();
        wp_cache_set( 'widget_random_vehicle', $arrCache, 'widget' );
    }
}

Trackbacks

Diesen Artikel in einem sozialen Netzwerk teilen

Folgen Sie uns auf Twitter oder abonnieren Sie unseren RSS-Feed um keine Artikel zu verpassen.

Support

Wir sind aktuell nicht online. Aber Sie können uns eine E-Mail senden und wir werden uns umgehend bei Ihnen melden.

Wir sind gern für Sie da.

Nachricht mit ENTER bestätigen