Eigene Userrollen in WordPress anlegen & absichern

How-To: Eigene Userrollen in WordPress anlegen & absichern

Dieses Tutorial zeigt, wie du in WordPress eigene Userrollen anlegst, mit eigenen Berechtigungen (Capabilities), Login-Anpassungen und aufgeräumtem Admin-Menü. So können Redakteure, Moderatoren oder Support-User nur das sehen, was sie wirklich brauchen.


1. Warum eigene Rollen?

  • WordPress bringt Standardrollen wie Administrator, Redakteur, Autor mit.
  • Oft braucht man jedoch feinere Abstufungen: z. B. Support, Kunde, Team-Mitglied.
  • Mit eigenen Rollen lassen sich Rechte gezielt steuern.


2. Grundprinzipien

  • Rollen bestehen aus einem Namen (Slug), einem Label (sichtbar) und einer Menge von Capabilities.
  • Capabilities sind einzelne Berechtigungen (z. B. editposts, publishpages, uploadfiles).
  • User bekommen eine Rolle → damit alle zugehörigen Rechte.


3. Umsetzung als Plugin (empfohlen)

Rollen sollten nicht in die functions.php vom Theme, sondern in ein eigenes kleines Plugin.

Datei: wp-content/plugins/custom-roles/custom-roles.php

<?php
/**
 * Plugin Name: Custom Roles Example
 * Description: Beispiel für eigene Rollen + Admin-Aufräumung.
 * Version: 1.0.0
 * Author: Dein Name
 */

// Rollen definieren
function cr_get_roles() {
    return [
        'custom_editor' => [
            'label' => 'Custom Editor',
            'caps'  => [
                'read'           => true,
                'edit_posts'     => true,
                'edit_pages'     => true,
                'publish_posts'  => true,
                'upload_files'   => true,
                // keine Admin-/Plugin-Rechte
            ],
        ],
        'custom_moderator' => [
            'label' => 'Custom Moderator',
            'caps'  => [
                'read'           => true,
                'edit_posts'     => true,
                'upload_files'   => true,
                // stark eingeschränkt
            ],
        ],
    ];
}

// Rollen bei Aktivierung anlegen
function cr_roles_activate() {
    foreach (cr_get_roles() as $role => $def) {
        remove_role($role); // alte Version bereinigen
        add_role($role, $def['label'], $def['caps']);
    }
}
register_activation_hook(__FILE__, 'cr_roles_activate');

// (Optional) Rollen bei Deaktivierung löschen
function cr_roles_deactivate() {
    // foreach (array_keys(cr_get_roles()) as $role) {
    //     remove_role($role);
    // }
}
register_deactivation_hook(__FILE__, 'cr_roles_deactivate');

// Admin-Menüs aufräumen
add_action('admin_menu', function () {
    if (current_user_can('administrator')) return;
    $user = wp_get_current_user();

    if (in_array('custom_editor', $user->roles)) {
        remove_menu_page('plugins.php');
        remove_menu_page('users.php');
        remove_menu_page('tools.php');
    }
    if (in_array('custom_moderator', $user->roles)) {
        remove_menu_page('plugins.php');
        remove_menu_page('themes.php');
        remove_menu_page('users.php');
    }
}, 99);

// Login-Logo und Redirect anpassen
add_action('login_enqueue_scripts', function () {
    echo '<style>
        body.login { background:#f5f5f5; }
        .login h1 a { background-image:url("https://example.com/logo.png") !important;
                      width:200px; height:80px; background-size:contain; }
    </style>';
});
add_filter('login_redirect', function ($redirect_to, $request, $user) {
    if (isset($user->roles) && in_array('custom_editor', $user->roles)) {
        return admin_url('edit.php');
    }
    if (isset($user->roles) && in_array('custom_moderator', $user->roles)) {
        return admin_url('upload.php');
    }
    return $redirect_to;
}, 10, 3);


4. Rollen testen

  • Neuen User erstellen → Rolle „Custom Editor“ zuweisen.
  • Mit Zweitbrowser oder Inkognito einloggen.
  • Prüfen, ob Admin-Menüs und Rechte passen.


5. Typische Stolpersteine

  1. Capabilities vs. Rollen:

currentusercan('capability') prüfen, nicht currentusercan('rolle').
→ Beispiel: current
usercan('editposts').

  1. Rollen nach Migration „vergessen“:

Manchmal gehen Rollen verloren, wenn man die DB migriert. Lösung: Rollen im Plugin definieren und bei init sicherstellen.

  1. Menüs tauchen trotzdem auf:

Drittplugins können Menüs wieder hinzufügen. Dann zusätzlich CSS oder Capability-Checks nutzen.

  1. Nicht bei Deaktivierung löschen (Produktion):

Sonst stehen User ohne Rolle da. Besser drinlassen oder nur in Staging löschen.


6. Erweiterungen

  • Custom Capabilities vergeben, z. B. canreviewposts.
  • Metaboxen entfernen für bestimmte Rollen:
  add_action('add_meta_boxes', function () {
      if (!current_user_can('manage_options')) {
          remove_meta_box('slugdiv', 'post', 'normal');
      }
  });
  • Gutenberg-Block-Auswahl einschränken:
  add_filter('allowed_block_types_all', function ($allowed_blocks) {
      if (!current_user_can('manage_options')) {
          return ['core/paragraph','core/heading','core/image'];
      }
      return $allowed_blocks;
  }, 10, 2);

7. Fazit

Mit einem kleinen Plugin kannst du:

  • Eigene Rollen & Rechte definieren
  • Admin-Oberfläche pro Rolle aufräumen
  • Login & Redirects anpassen

So wird WordPress sicherer, aufgeräumter und DAU-tauglicher.

custom-roles.zip