WordPress Tipps #3 – Post-Listen Teil 1

Diese und übernächste Woche zeigen wir dir ein paar Tricks wie du die Post-Listen im WordPress-Backend optimieren und erweitern kannst.

Inhalt

Alle der folgenden Code-Snippets können im functions.php des gewünschten Themes hinterlegt werden.

Spalten umbenennen

Vorhandene Spalten können bei Bedarf einfach umbenannt werden. Das folgende Beispiel ändert die Bezeichnung der Titel-Spalte für normale Posts, Pages oder einem eigenen Post-Type:

function post_columns_rename($columns) {
    $columns['title'] = 'Beitragsname';

    return $columns;
}
add_filter('manage_posts_columns', 'post_columns_rename'); // Beiträge
//add_filter('manage_pages_columns', 'post_columns_rename'); // Seiten
//add_filter('manage_{$post-type}_posts_columns', 'post_columns_rename'); // Eigener Post-Type

Neben title gibt es noch folgende Standard-Spalten: cb (Checkbox), author (Autor), categories (Kategorien), tags (Schlagworte), comments (Kommentare) und date (Datum).

Spalten hinzufügen

Sobald man eigene Plugins schreibt oder eigene Post-Types verwendet, wird man früher oder später eigene Spalten in den Post-Listen benötigen. Dazu muss man mit zwei verschiedenen Hooks zuerst die Spalte selber und dann deren Inhalt definieren.

Spalten definieren

Mit dem folgenden Hook werden zwei neue Spalten hinzugefügt:

function post_columns_append($columns) {
    $columns['subtitle'] = 'Untertitel';
    $columns['time'] = 'Zeit';

    return $columns;
}
add_filter('manage_posts_columns', 'post_columns_append'); // Beiträge
//add_filter('manage_pages_columns', 'post_columns_append'); // Seiten
//add_filter('manage_{$post-type}_posts_columns', 'post_columns_append'); // Eigener Post-Type

Der Nachteil an dem obigen Beispiel ist, dass die Spalten auf der rechten Seite angehängt werden. Möchte man die Spalten jedoch an einer bestimmten Stelle einfügen, muss man dazu den Columns-Array neu zusammenbauen. Im folgenden Beispiel wird die Spalte Untertitel nach Titel und Zeit nach Datum eingefügt:

function post_columns_add($columns) {
    $columns_new = array();

    foreach($columns as $column_key => $column_value) {
        $columns_new[$column_key] = $column_value;

        if($column_key == 'title') {
            $columns_new['subtitle'] = 'Untertitel';
        }

        if($column_key == 'date') {
            $columns_new['time'] = 'Zeit';
        }
    }

    return $columns_new;
}
add_filter('manage_posts_columns', 'post_columns_add'); // Beiträge
//add_filter('manage_pages_columns', 'post_columns_add'); // Seiten
//add_filter('manage_{$post-type}_posts_columns', 'post_columns_add'); // Eigener Post-Type

Spalteninhalte anzeigen

Bis jetzt sind nur die Spalten und deren Überschriften definiert, jedoch noch kein Inhalt. Mit dem folgenden Hook werden nun für die oben definierten Spalten Inhalte angezeigt:

function post_columns_add_content($column_name, $post_id) {
    switch($column_name) {
        case 'subtitle':
            echo get_post_meta($post_id, 'subtitle', true);
            break;

        case 'time':
            echo get_the_time('H:i', $post_id);
            break;
    }
}
add_action('manage_posts_custom_column', 'post_columns_add_content', 10, 2); // Beitrag und eigene nicht-hierarchische Post-Types
//add_action('manage_pages_custom_column', 'post_columns_add_content', 10, 2); // Seiten und eigene hierarchische Post-Types

Dieser Hook wird für jede oben definierte Spalte aufgerufen, so könnten auch Standard-Spalten-Inhalte überschrieben werden. Der $column_name muss mit dem Array-Key der Spalten-Definition von oben übereinstimmen. Wichtig: Die Hooks manage_posts_custom_column und manage_pages_custom_column werden jeweils für alle nicht-hierarchische (posts) und hierarchische (pages) Post-Types verwendet. Wenn man die Spalten-Inhalte also nur für einen bestimmten Post-Type definieren möchte, muss man eine Abfrage dafür einbauen:

if(get_post_type($post_id) == 'post') {
    // Code für Post-Type 'post'
}

Spalten entfernen

Wenn man nicht alle Spalten in einer Post-Liste benötigt, kann man diese mit wenig Aufwand entfernen. Der folgende Hook entfernt die Spalten für Kategorien und Tags:

function post_columns_remove($columns) {
    unset($columns['categories'], $columns['tags']);

    return $columns;
}
add_filter('manage_posts_columns', 'post_columns_remove'); // Beiträge
//add_filter('manage_pages_columns', 'post_columns_remove'); // Seiten
//add_filter('manage_{$post-type}_posts_columns', 'post_columns_remove'); // Eigener Post-Type

QuickEdit-Aktion entfernen

Manchmal kann es sein, dass man die Quick-Edit-Funktion für gewisse Post-Types deaktivieren möchte, um zu verhindern, dass der Post ausserhalb der normalen Edit-Seite bearbeitet werden kann. Mit dem folgenden Snippet wird auf dem Post-Type page (also für normale Seiten) die Aktion aus der Liste entfernt:

function post_row_actions_remove_quickedit($actions, $post) {
    if($post->post_type == 'page') {
        unset($actions['inline hide-if-no-js']);
    }

    return $actions;
}
add_filter('post_row_actions', 'post_row_actions_remove_quickedit', 10, 2);

Wenn QuickEdit für alle Post-Types entfernt werden soll, kann die if-Abfrage einfach entfernt werden.

Post-Aktion hinzufügen

Neben den Standard-Aktionen (Bearbeiten, QuickEdit, Papierkorb und Vorschau) können auch eigene Links oder Aktionen hinzugefügt werden, die dann zur Verfügung stehen, wenn an mit der Maus über eine Post-Zeile in der Liste fährt.

Einfacher Link hinzufügen

Wenn man lediglich einen Link zu den Aktionen hinzufügen möchte, kann man dies mit einem einfachen Hook erledigen. Innerhalb des Hooks muss abgefragt werden, für welchen Post-Type die Aktion definiert werden soll ($post->post_type == 'post'), da sie ansonsten für alle Post-Types hinzugefügt würde. Das folgende Snippet fügt einen einfachen externen Link für normale Beiträge hinzu:

function post_row_actions_add_link($actions, $post) {
    if($post->post_type == 'post') {
        $actions['google'] = '<a href="http://www.google.ch" target="_blank">Google</a>';
    }

    return $actions;
}
add_filter('post_row_actions', 'post_row_actions_add_link', 10, 2); // Beitrag und eigene, nicht-hierarchische Post-Types
//add_filter('page_row_actions', 'post_row_actions_add_link', 10, 2); // Seiten und eigene, hierarchische Post-Types

Genau wie schon bei den Spalten, hat dieser Hook der Nachteil, dass diese Aktionen nach allen anderen am Ende der Liste definiert werden. Wenn die Aktion an einer bestimmten Stelle eingefügt werden soll, kann dies ähnlich wie bei den Spalten gemacht werden. Das folgende Beispiel fügt die Aktion Google direkt nach der Standard-Aktion Bearbeiten ein:

function post_row_actions_add_link($actions, $post) {
    if($post->post_type == 'post') {
        $actions_new = array();

        foreach($actions as $action_key => $action_link) {
            $actions_new[$action_key] = $action_link;

            if($action_key == 'edit') {
                $actions_new['google'] = '<a href="http://www.google.ch" target="_blank">Google</a>';
            }
        }
    } else {
        $actions_new = $actions;
    }

    return $actions_new;
}
add_filter('post_row_actions', 'post_row_actions_add_link', 10, 2); // Beitrag und eigene nicht-hierarchische Post-Types
//add_filter('page_row_actions', 'post_row_actions_add_link', 10, 2); // Seiten und eigene hierarchische Post-Types

Auch in dem obigen Beispiel wird die Aktion nur für normale Beiträge definiert, für alle anderen Post-Types werden die Aktionen unverändert ausgegeben (else-Abfrage).

Aktion hinzufügen

Neben Links können auch komplexere Aktionen definiert werden. Auch diese Aktionen werden genau so wie die einfachen Links definiert, darum zeigen wir im folgenden Snippet nur den einfachen Hook der die Aktion an die bereits vorhandenen Links anhängt. Als Beispiel erstellen wir eine Aktion, welche einen Post publiziert (also den Status auf ‚publish‘ setzt) und nur angezeigt wird, wenn der Post nicht bereits publiziert wurde:

function post_row_actions_add_action($actions, $post) {
    if($post->post_type == 'post' && $post->post_status != 'publish') {
        $publish_link = wp_nonce_url(admin_url('edit.php?post_type=' . $post->post_type . '&publish_post=' . $post->ID), 'publish_post');
        $actions['publish'] = '<a href="' . $publish_link . '">Publizieren</a>';
    }

    return $actions;
}
add_filter('post_row_actions', 'post_row_actions_add_action', 10, 2); // Beitrag und eigene nicht-hierarchische Post-Types
//add_filter('page_row_actions', 'post_row_actions_add_action', 10, 2); // Seiten und eigene hierarchische Post-Types

Um die Sicherheit dieser Aktion zu erhöhen, generieren wir für den Aktions-Link mit wp_nonce_url einen sogenannten nonce. Das zweite Argument dieser Funktion ist die sogenannte nonce-action (in diesem Beispiel „publish_post“), welche in der Aktion abgefragt werden kann.

Aktion ausführen

Jetzt haben wir den Link hinzugefügt und müssen noch die Aktion selber definieren. Dies machen wir über den allgemeinen Hook current_screen, welcher bei jedem Backend-Seiten-Aufruf ausgeführt wird. Aus diesem Grund müssen wir innerhalb des Hooks die Seite $current_screen->base = 'edit', den Post-Type $current_screen->post_type und den URL-Parameter isset($_GET['publish_post']) abfragen. Neben dieser Abfrage müssen wir auch den zuvor definierten nonce überprüfen (die nonce-action muss übereinstimmen). Nach der eigentlichen Aktion (in diesem Fall wp_update_post, um den Post-Status auf ‚publish‘ zu setzen) leiten wir mit wp_redirect zurück zur Liste:

function post_action_publish_post($current_screen) {
    // Aktion überprüfen
    if($current_screen->base = 'edit' && $current_screen->post_type == 'post' && isset($_GET['publish_post'])) {
        // nonce überprüfen
        if(isset($_GET['_wpnonce']) && wp_verify_nonce($_GET['_wpnonce'], 'publish_post')) {
            // Post status auf 'publish' setzen
            wp_update_post(
                array(
                    'ID' => $_GET['publish_post'],
                    'post_status' => 'publish'
                )
            );
        }

        // Zurück zur Liste weiterleiten
        wp_redirect($_SERVER['HTTP_REFERER']);
        exit();
    }
}
add_action('current_screen', 'post_action_publish_post');

Der zweite Teil …

… folgt in zwei Wochen. Es gibt noch mehr interessante Tipps zu den Post-Listen die wir dir nicht vorenthalten möchten. Schau doch wieder vorbei!

Andere WordPress Tipps

  • #CMS
  • #Entwicklung
  • #Tipps
  • #WordPress

Kommentare

Leider hats noch niemanden interessiert. Dich vielleicht?

Kommentar schreiben

Ähnliche Beiträge

Zur Übersicht

Mit der Nutzung unserer Website erklären Sie sich mit der Verwendung von Cookies einverstanden. Weitere Informationen