In 5 Schritten eigene WordPress Admin-Spalten erstellen

Für viele Projekte müssen neue Spalten im WordPress Admin her. Ob das eine einfache Zahl, ein Link oder aber die Kennzeichnung für eine Premiumhervorhebung ist. Für alles braucht man neue Spalten im WordPress Admin. Das Helpful WordPress Plugin nutzt zum Beispiel die Admin-Spalten um die Anzahl der Abstimmungen pro Beitrag anzuzeigen. Hier erfährst du, wie du deine eigenen Admin-Spalten einfügst, ohne Verwendung eines Plugins.

Fangen wir erst einmal damit an, dass es hierfür auch WordPress Plugins gibt. Ein Beispiel (das erste Ergebnis, welches ich auf Google gefunden habe) wäre das Admin Columns Plugin auf WordPress.org. Damit kannst du deine eigenen Spalten erstellen und natürlich auch wieder ein paar Euros für eine Pro-Version hinlegen, wenn du mehr Features benötigst. Das Plugin hat ziemlich gute Bewertungen.


Hier geht es aber darum, wie du deine Admin-Spalten mit PHP erstellst. Im Beispiel wird dir also gezeigt, wie du ein eigenes Meta-Feld (hier Premium) in die Spaltenübersicht einfügst und sortierbar machst.

Vollständiger Code mit Kommentaren:

Admin-Spalten initialisieren

add_action('admin_init', 'init_columns');

/**
 * Initialisiert die neue Spalte.
 *
 * @return void
 */
function init_columns(): void
{
    global $pagenow;

    if (is_admin() && 'edit.php' === $pagenow) {

        // Hier bei den Hooks drauf achten, dass "mein_post_type" mit dem jeweiligen Post Type ersetzt wird
        add_filter('manage_mein_post_type_posts_columns', 'register_columns');
        add_action('manage_mein_post_type_posts_custom_column', 'populate_columns', 10, 2);
        add_filter('manage_edit-mein_post_type_sortable_columns', 'register_sortable_columns');

        add_action('pre_get_posts', 'sort_columns_query');
    }
}Code-Sprache: PHP (php)

Hier beginnt der Spaß und hier registrieren wir alle Funktionen, damit sie im WordPress Admin verwendet werden. Beachte hier vor allem die Kommentare, damit du weißt was du zutun hast, um sie nur für einen bestimmten Inhaltstyp zu aktivieren.

Spalten registrieren

/**
 * Registriert die neue Spalte, direkt nach der "Titel"-Spalte.
 *
 * @param array $defaults
 *
 * @return array
 */
function register_columns(array $defaults): array
{
    $columns = [];
    foreach ($defaults as $key => $value):
        $columns[$key] = $value;

        // Eine Spalte direkt nach dem "Titel"
        if ('title' === $key) {
            // Die neue Spalte: key = id, value = Name
            $columns['premium'] = 'Art';
        }
    endforeach;

    return $columns;
}Code-Sprache: PHP (php)

Hier beginnt die Zauberei. Hier registrieren wir unsere eigene Spalte mit der ID premium und nennen sie Art, da der Premiumstatus für uns die Art des Inhalts widerspiegelt.

Inhalt der Admin-Spalten bestimmen

/**
 * Bestimmt den Inhalt der neuen Spalte.
 *
 * @param string $column_name
 * @param int $post_id
 *
 * @return void
 */
function populate_columns(string $column_name, int $post_id): void
{
    // Wenn die Spalte "premium" aufgerufen wird
    if ('premium' === $column_name) {
        // Beispiel mit einem Meta-Feld "premium"
        if (get_post_meta($post_id, 'premium', true)) {
            echo 'Premium';
        } else {
            echo '-';
        }
    }
}Code-Sprache: PHP (php)

Hier bestimmen wir den eigentlichen Inhalt der Spalte. In unserem Beispiel wollen wir das wenn das Meta-Feld premium gesetzt ist, in der Spalte Premium steht, ansonsten -.

Spalten für Sortierung aktivieren

/**
 * Registriert die sortierbare neue Spalte.
 *
 * @param array $columns
 *
 * @return array
 */
function register_sortable_columns(array $columns): array
{
    $columns['premium'] = 'premium';

    return $columns;
}
Code-Sprache: PHP (php)

Hier geben wir schnell an, dass wir wollen, dass man die Spalte mit Klick auf den Spaltennamen sortieren kann.

Sortierung ausführen

/**
 * Bestimmt wie die Inhalte sortiert werden sollen, wenn man auf die Spalte klickt.
 *
 * @param object $wp_query
 *
 * @return void
 */
function sort_columns_query(object $wp_query): void
{
    if (!is_admin()) {
        return;
    }

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

    if ('premium' === $orderby) {
        $meta_query = [
            'relation' => 'OR',
            [
                'key' => 'premium',
                'type' => 'NUMERIC',
            ],
        ];

        $wp_query->set('meta_query', $meta_query);
        $wp_query->set('orderby', 'meta_value');
    }
}Code-Sprache: PHP (php)

Damit WordPress weiß, was zutun ist, bestimmen wir hier wie der Query manipuliert werden soll, wenn wir auf den Spaltennamen geklickt haben. In unserem Beispiel gehen wir davon aus, dass das Meta-Feld einen Zahlenwert zurück gibt. Also einmal 1 für Premium und einmal 0 für nicht Premium. Also sortieren wir hier numerisch.


Das war es schon. Jetzt sollte deine eigene Spalten zu sehen und auch sortierbar sein. Du kannst innerhalb des Codes auch get_field von Advanced Custom Fields verwenden, falls du nicht mit den hauseigenen Funktionen der Meta-Felder von WordPress arbeitest.

Beachte bei der Sortierung, dass die Sortierung am besten funktioniert, wenn der Wert numerisch ist. Bei der alphabetischen Sortierung können merkwürdige Ergebnisse auftreten.

Den vollständigen Code findest du noch einmal hier: