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
- Capabilities vs. Rollen:
currentusercan('capability')
prüfen, nicht currentusercan('rolle')
.
→ Beispiel: currentusercan('editposts')
.
- Rollen nach Migration „vergessen“:
Manchmal gehen Rollen verloren, wenn man die DB migriert. Lösung: Rollen im Plugin definieren und bei init
sicherstellen.
- Menüs tauchen trotzdem auf:
Drittplugins können Menüs wieder hinzufügen. Dann zusätzlich CSS oder Capability-Checks nutzen.
- 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.