WordPress Tipps #4 – Post-Listen Teil 2

Wie im letzten Beitrag erwähnt, zeigen wir dir auch diese Woche ein paar Tricks wie du die Post-Listen im WordPress optimieren und erweitern kannst. Diese Woche schauen wir uns an, wie man Spalten sortierbar macht und wie man eigene Bulk-Aktionen erstellen kann.

Inhalt

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

Spalte sortierbar machen

Im letzten Beitrag haben wir dir gezeigt, wie man eigene Spalten hinzufügen kann. Diese Spalten können jedoch noch nicht sortiert werden. Mit ein paar Zeilen Code kann jedoch (fast) jede Spalte sortierbar gemacht werden. In dem folgenden Beispiel gehen wir davon aus, dass wir bereits zwei neue Spalten (Vorname und Nachname), wie im letzten Beitrag gezeigt, hinzugefügt haben.

Als Erstes muss man mit einem Hook festlegen, dass die Spalten per Klick auf die Überschrift sortiert werden können:

function manage_sortable_columns($columns) {
    $columns['firstname'] = 'firstname';
    $columns['lastname'] = 'lastname';

    return $columns;
}
add_filter('manage_edit-{$post-type}_sortable_columns', 'manage_sortable_columns');

Der Array-Key von $columns muss mit dem Key übereinstimmen, der beim Hinzufügen der normalen Spalte verwendet wurde. Der Wert hinter dem = wird als orderby-Wert bei der Sortierung mitgegeben, so dass wir sie abfragen können.

Im zweiten Schritt müssen wir das Query der Post-Liste so anpassen, dass die Spalten auch richtig sortiert ausgegeben werden. Dazu müssen wir in das Post-Query eingreifen und die neuen orderby-Werte abfragen:

function pre_get_posts_sortable_columns($query) {
    if(!is_admin()) return; // Diese Sortierung nur für das WordPress-Backend zulassen

    $orderby = $query->get('orderby');

    if($orderby == 'firstname') {
        $query->set('meta_key', 'firstname');
        $query->set('orderby', 'meta_value');
    } elseif($orderby == 'lastname') {
        $query->set('meta_key', 'lastname');
        $query->set('orderby', 'meta_value');
    }
}
add_action('pre_get_posts', 'pre_get_posts_sortable_columns');

Das obige Beispiel sorgt dafür, dass wenn der orderby-Wert „firstname“ ist, die Ausgabe nach einem Post-Meta-Feld (meta_value) mit dem Wert (meta_key) „firstname“ sortiert werden soll. Das selbe gilt natürlich auch für „lastname“. Wenn die Sortierung auch für die Ausgabe in der Front verfügbar sein muss, kann einfach die erste Zeile innerhalb der Funktion entfernt werden.

Beinhaltet das Feld, nachdem man sortieren möchte, eine Zahl, dann sollte statt $query->set('orderby', 'meta_value'); besser $query->set('orderby', 'meta_value_num'); verwendet werden, da nur so Zahlen korrekt sortiert werden.

Edit-Bulk-Aktion entfernen

Bulk-Aktionen sind die Aktionen, welche man über die Dropdown-Menüs links über und unter der Post-Liste, auf alle ausgewählten Posts ausführen kann. Ähnlich wie die im letzten Beitrag erwähnte QuickEdit-Aktion macht es vielleicht auch Sinn, die Bulk-Edit-Aktion zu deaktivieren. Das folgende Snippet macht genau das:

function bulk_action_remove_edit($actions) {
    unset($actions['edit']);

    return $actions;
}
add_filter('bulk_actions-edit-post','bulk_action_remove_edit'); // Beiträge
//add_filter('bulk_actions-edit-page','bulk_action_remove_edit'); // Seiten
//add_filter('bulk_actions-edit-{$post-type}','bulk_action_remove_edit'); // Eigener Post-Type

Bulk-Aktion hinzufügen

Um eigene Bulk-Aktionen in die Dropdown-Menüs hinzufügen zu können, benötigt es ein paar Tricks, da man diese leider nicht ohne Workaround definieren kann. In dem folgenden Beispiel fügen wir eine Export-Aktion für den Post-Type „employee“ hinzu.

Als erstes muss die Aktion in die Dropdown-Menüs hinzugefügt werden. Da es dafür (noch) keinen WordPress-Hook gibt, muss man diese Optionen mit JavaScript (in unserem Beispiel mit jQuery) erstellt werden:

function bulk_action_add_to_select() {
    // Aktion nur für den Post-Type "employee" hinzufügen
    if(get_post_type() == 'employee') {
        echo '
        <script type="text/javascript">
            jQuery(function() {
                jQuery('<option value="export">Export</option>').appendTo('select[name="action"]');
                jQuery('<option value="export">Export</option>').appendTo('select[name="action2"]');
            });
        </script>';
    }
}
add_action('admin_footer-edit.php', 'bulk_action_add_to_select');

Jetzt haben wir in den Dropdowns eine zusätzliche Aktion mit der Bezeichnung „Export“ erstellt. Diese kann man jetzt schon auswählen, jedoch passiert noch nicht viel. Als nächstes müssen wir die Logik für die eigentliche Aktion definieren:

function bulk_action_export() {
    // Security check
    if(!isset($_GET['_wpnonce']) || !wp_verify_nonce($_GET['_wpnonce'], 'bulk-posts')) {
        return false;
    }

    $action = _get_list_table('WP_Posts_List_Table')->current_action();

    if($action == 'export') {
        // Ein Array mit allen ausgewählten Post IDs
        $post_ids = ( isset($_GET['post']) ? $_GET['post'] : array() );

        // Eigentlicher Export Code hier
        ...
        $exported = 1; // 1 = Erfolg, 0 = Fehler

        // Weiterleitung zurück zur Liste
        $sendback = add_query_arg(array('exported' => $exported, 'count' => count($post_ids)), $_GET['_wp_http_referer']);
        wp_redirect($sendback);
        exit();
    }
}
add_action('load-edit.php', 'bulk_action_export');

Der Ablauf des Hooks oben sollte selbsterklärend sein. Zuerst wird ein Sicherheitscheck durchgefügt, dann die ausgewählte Aktion evaluiert und wenn die Aktion export ist, der Export durchgeführt. Ganz am Ende wird dann auf die Liste zurück weitergeleitet.

Wie du erkennen kannst, musst du die eigentliche Export-Logik selber programmieren, in dem Beispiel geht es lediglich darum zu zeigen, wie man eine Bulk-Aktion definieren kann und nicht wie man einen Export baut.

Die beiden Snippets bis jetzt sorgen dafür, dass man die Aktion auswählen kann und dass die Aktion auch etwas macht. Jedoch sieht man noch nicht, ob die Aktion erfolgreich war oder nicht, da keine Benachrichtigung angezeigt wird. Auch eine Meldung können wir mit wenigen Zeilen Code definieren:

function bulk_action_show_notice() {
    global $pagenow;

    // Zeigt die Meldung an wenn der Post-Type employee ist und exported true bzw. 1 ist
    if(get_post_type() == 'employee' && $pagenow == 'edit.php' && isset($_GET['exported']) && $_GET['exported']) {
        echo '<div class="updated"><p>' . $_GET['count'] . ' Einträge exportiert</p></div>';
    }
}
add_action('admin_notices', 'bulk_action_show_notice');

Durch diese Codezeilen wird bei Erfolg (wenn $exported = 1) eine „grüne“ Erfolgsmeldung angezeigt und man sieht, wie viele Beiträge exportiert wurden. Das kann natürlich beliebig angepasst werden. Man kann das z.B. so erweitern, dass im Fehlerfall eine Fehlermeldung oder eine Warnung, wenn man keine Beiträge zum Exportieren ausgewählt hat, anzeigt wird.

Der dritte Teil …

… folgt demnächst. Wir sind noch nicht ganz fertig mit den Post-Listen, es gibt immer noch ein paar interessante Tricks. Schau doch wieder vorbei!

Andere WordPress Tipps

Schlagwörter:

Schreibe einen Kommentar

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