WordPress-Benutzerverwaltung: Eingehende Analyse von Rollen und Berechtigungen
Das Benutzerverwaltungssystem vonWordPress basiert auf Rollen und Berechtigungen. Eine Rolle ist ein Unternehmen, das einen eindeutigen Namen und eine Reihe von Berechtigungen enthält, von denen jedes den Zugang zu plattformspezifischen Merkmalen dieser Rolle definiert. Lassen Sie uns in die Arbeitsmechanismen von WordPress -Rollen und -Trägen eingraben.
add_role()
, remove_role()
, add_cap()
und remove_cap()
können verwendet werden, um Rollen und Berechtigungen zu verwalten. Sie müssen jedoch bei Verwendung dieser Funktionen auf den Zugriff und die Leistung des Datenbanks achten. register_activation_hook()
verwenden. Eine andere Möglichkeit besteht darin, die WordPress -Datenbank zu umgehen, indem die globale Variable $wp_user_roles
festgelegt wird. Die Standardrolle und Berechtigungsliste finden Sie in WordPress Codex.
Die -Datenbank speichert diese Liste in der Tabelle wp_options
.
Es verwendet die serialisierte wp_user_roles
-Taste.
Die Deserialisierten sind wie folgt:
<code>array( 'administrator' => array( 'name' => '管理员', 'capabilities' => array( 'switch_themes' => true, 'edit_themes' => true, 'activate_plugins' => true, 'edit_plugins' => true, 'edit_users' => true, // [...] ) ), 'contributor' => array( 'name' => '投稿者', 'capabilities' => array( 'delete_pages' => true, 'delete_others_pages' => true, 'delete_published_pages' => true, 'delete_posts' => true, // [...] ) ), // [...] );</code>
Diese Metadaten werden automatisch festgelegt, wenn eine neue WordPress -Site installiert ist.
Wenn WordPress beginnt, lädt die -Klasse die Liste aus der Datenbank. WP_Roles
und plugins_loaded
Haken. init
in der Tabelle wp_usermeta
gespeichert, um Benutzer mit ihren Rollen zu verknüpfen. meta_key
Nach der Deserialisierung lautet die Metadaten wie folgt:
<code>array( 'administrator' => true )</code>
Denken Sie auch daran,
ist das Präfix des aktuellen Blogs. wp_
erhalten). $GLOBALS['wpdb']->get_blog_prefix()
wp_capabilities
a:1:{s:13:"administrator";b:1;}
wp_10_capabilities
a:1:{s:11:"contributor";b:1;}
wp_15_capabilities
a:1:{s:10:"subscriber";b:1;}
[...]
-Intrag, den wir in der Tabelle wp_options
gesehen haben. wp_user_roles
Schließlich können wir sowohl die wp_user_level
Metadaten als auch die Rolle sehen.
Es wird verwendet, um mit Zeichen in älteren Versionen von WordPress umzugehen, und ist jetzt veraltet.
Wir haben gelernt, wie Rollen geladen und mit Benutzern verknüpft werden.
Einige Standardberechtigungen sind im WordPress -Kerncode festcodiert.
Wenn der Plugin -Bildschirm beispielsweise geladen ist, wird beispielsweise geprüft, ob der aktuelle Benutzer das Plugin verwalten kann, indem Sie den folgenden Code ausführen:
<code>array( 'administrator' => array( 'name' => '管理员', 'capabilities' => array( 'switch_themes' => true, 'edit_themes' => true, 'activate_plugins' => true, 'edit_plugins' => true, 'edit_users' => true, // [...] ) ), 'contributor' => array( 'name' => '投稿者', 'capabilities' => array( 'delete_pages' => true, 'delete_others_pages' => true, 'delete_published_pages' => true, 'delete_posts' => true, // [...] ) ), // [...] );</code>
Rollen sind niemals festcodiert.
WordPress bietet die folgenden globalen Funktionen, mit denen wir mit Rollen umgehen können.
current_user_can()
Überprüfen Sie, ob der aktuelle Benutzer über die erforderlichen Berechtigungen verfügt.
<code>array( 'administrator' => true )</code>
WP_User::has_cap
Überprüfen Sie, ob ein bestimmter Benutzer die Berechtigung verfügt.
<code>if (!current_user_can('activate_plugins')) { wp_die(__('您没有足够的权限来管理此站点的插件。')); }</code>
Wir können feststellen, dass current_user_can
diese Funktion verwendet.
get_editable_roles()
kehrt zu bearbeitbaren Rollen zurück.
<code>add_action('init', function() { if (current_user_can('install_plugins')) { echo '您可以安装插件'; } else { echo '您不能安装插件'; } });</code>
Diese Liste kann durch editable_roles
Filter überschrieben werden, daher sollten wir uns nicht auf diese Funktion verlassen, um die vollständige Liste der Rollen auf der Website zu erhalten.
Bitte beachten Sie die Verwendung des admin_init
-Hakens, da die Funktion noch nicht in den init
-Haken geladen wurde.
get_role()
Get WP_Role
Objekt basierend auf seiner Schnecke.
<code>add_action('init', function() { $user = get_user_by('slug', 'admin'); if ($user->has_cap('install_plugins')) { echo '管理员可以安装插件'; } else { echo '管理员不能安装插件'; } });</code>
WP_Role::has_cap()
Überprüfen Sie, ob die Rolle die erforderlichen Berechtigungen hat.
<code>add_action('admin_init', function() { $roles = get_editable_roles(); var_dump($roles); });</code>
WordPress bietet auch eine vollständige API, um Rollen und ihre Berechtigungen anzupassen.
add_role()
Registrieren Sie eine neue Rolle in der Datenbank.
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role); }); // 这将打印: // WP_Role 对象 // ( // [name] => administrator // [capabilities] => Array // ( // [switch_themes] => 1 // [edit_themes] => 1 // [activate_plugins] => 1 // [edit_plugins] => 1 // [...]</code>
remove_role()
Wenn vorhanden, löschen Sie die erforderliche Rolle aus der Datenbank.
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role->has_cap('install_plugins')); // 打印 TRUE });</code>
WP_Role::add_cap()
Berechtigungen zur Rolle hinzufügen.
<code>add_action('init', function() { add_role('plugins_manager', '插件管理员', array( 'install_plugins', 'activate_plugins', 'edit_plugins' )); });</code>
Dies können Kernberechtigungen (install_plugins
, edit_posts
…) oder eine benutzerdefinierte Zeichenfolge (my_awesome_plugin_cap
) sein.
Ermöglicht es uns, für unser Plugin so viele benutzerdefinierte Berechtigungen wie möglich zu registrieren.
WP_Role::remove_cap()
Wenn es existiert, löschen Sie Berechtigungen aus der Rolle.
<code>add_action('init', function() { remove_role('plugins_manager'); });</code>
WP_User::add_role()
Fügen Sie einem bestimmten Benutzer Rollen hinzu.
<code>add_action('init', function() { $role = get_role('contributor'); $role->add_cap('install_plugins'); });</code>
Mit dieser Funktion können Sie theoretisch mehrere Rollen für denselben Benutzer festlegen.
Da das WordPress -Backend nur eine Rolle pro Benutzer anzeigt und verwaltet, sollten wir nicht mehrere Rollen für Benutzer hinzufügen und immer WP_User::remove_role()
verwenden, bevor wir eine neue Rolle hinzufügen.
WP_User::remove_role()
Entfernen Sie die Rollen vom gegebenen Benutzer.
<code>add_action('init', function() { $role = get_role('contributor'); $role->remove_cap('install_plugins'); });</code>
WP_User::add_cap()
Berechtigungen zu einem bestimmten Benutzer hinzufügen.
<code>array( 'administrator' => array( 'name' => '管理员', 'capabilities' => array( 'switch_themes' => true, 'edit_themes' => true, 'activate_plugins' => true, 'edit_plugins' => true, 'edit_users' => true, // [...] ) ), 'contributor' => array( 'name' => '投稿者', 'capabilities' => array( 'delete_pages' => true, 'delete_others_pages' => true, 'delete_published_pages' => true, 'delete_posts' => true, // [...] ) ), // [...] );</code>
Dies ist sehr nützlich, wenn wir dem Benutzer eine einzige Berechtigung hinzufügen möchten, ohne eine vollständige Rolle zu erstellen.
WP_User::remove_cap()
Berechtigungen vom gegebenen Benutzer entfernen.
<code>array( 'administrator' => true )</code>
Abgesehen von einer Frage sehen die Funktionen, die wir sehen, gut aus: Datenbankzugriff und Leistung.
worauf konzentrieren wir uns hauptsächlich beim Umgang mit Rollen und Berechtigungen, wenn sollte unser Code ausgelöst werden?
Um dies zu erklären, werfen wir einen Blick auf den WordPress -Kerncode.Erstens möchten wir ein neues leeres Zeichen hinzufügen:
<code>if (!current_user_can('activate_plugins')) { wp_die(__('您没有足够的权限来管理此站点的插件。')); }</code>
-Funktion (tatsächlich um add_role
umgeleitet): WP_Roles::add_role
<code>add_action('init', function() { if (current_user_can('install_plugins')) { echo '您可以安装插件'; } else { echo '您不能安装插件'; } });</code>
-Funktion einmal und macht dann nichts. add_role
<code>add_action('init', function() { $user = get_user_by('slug', 'admin'); if ($user->has_cap('install_plugins')) { echo '管理员可以安装插件'; } else { echo '管理员不能安装插件'; } });</code>
-Funktion in WordPress 4.2.2 lautet wie folgt: WP_Role::add_cap()
<code>add_action('admin_init', function() { $roles = get_editable_roles(); var_dump($roles); });</code>
-Objekt, aber wir können auch sehen, dass die Datenbank jedes Mal aktualisiert wird, wenn unser Code ausgeführt wird, auch wenn unsere neuen Berechtigungen bereits registriert sind! $this->roles
Dies bedeutet, dass, wenn wir uns um die Leistung kümmern, alle Code, die wir für benutzerdefinierte Rollen und Berechtigungen schreiben, nicht ausgeführt werden sollten, wenn jede Seite geladen wird.
Es gibt verschiedene Möglichkeiten, diese Datenbankprobleme zu vermeiden.
aktivieren
WordPress ermöglicht Plugin -Autoren, die Funktion Erstellen wir ein Beispiel -Plugin: register_activation_hook()
Dieser Code wird nur einmal ausgeführt, wenn das Plugin auf der Website aktiviert ist.
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role); }); // 这将打印: // WP_Role 对象 // ( // [name] => administrator // [capabilities] => Array // ( // [switch_themes] => 1 // [edit_themes] => 1 // [activate_plugins] => 1 // [edit_plugins] => 1 // [...]</code>
Was passiert, wenn sich das Plugin bereits in der Produktion befindet oder wenn das Reaktivieren beim Drücken des Updates weggelassen wird?
In der Tat stützt sich diese Lösung auch auf der Datenbank und erfordert einen zusätzlichen Schritt, wenn Sie den Code drücken.
WordPress -Datenbank bypass
Es gibt auch eine unbekannte Lösung, die in einigen Fällen gut funktioniert.
die Rolle aus der Datenbank lädt, wenn WordPress startet:
WP_Roles
WordPress prüft die
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role->has_cap('install_plugins')); // 打印 TRUE });</code>
Wenn WordPress festgelegt ist, verwendet WordPress den Inhalt und blockiert die Datenbankverwendung, indem die $wp_user_roles
-Variable auf False festgelegt wird.
Probieren wir es aus und führen Sie nur eine neue, eingeschränkte Administratorrolle: $this->use_db
Beim Laden des Backends können wir sehen, dass es die Definition unserer benutzerdefinierten Rolle behält:
Diese Lösung löst das Datenbankproblem, kann jedoch einige andere Probleme einführen:
Dies kann jedoch eine praktikable Lösung beim Erstellen einer benutzerdefinierten WordPress -Anwendung sein, die eine benutzerdefinierte Liste statischer Rollen erfordert:
In diesem Artikel stelle ich einen Überblick über Rollen und Berechtigungen in WordPress ein.
Obwohl die vollständige API es uns ermöglicht, fast alles zu tun, was wir wollen, sind Beziehungen zu Datenbanken immer noch das Hauptproblem.
Wir müssen dies bei der Entwicklung unserer Plugins und Themen berücksichtigen.
Was denkst du über die Art und Weise, wie WordPress Rollen verwaltet? Ich freue mich auf Ihr Feedback!
WordPress hat sechs Standardbenutzerrollen: Super Administrator, Administrator, Herausgeber, Autor, Mitwirkender und Abonnent. Jede Rolle hat einen bestimmten Satz von Berechtigungen. Beispielsweise kann ein Superadministrator auf alle administrativen Funktionen mehrerer Websites zugreifen. Administratoren können alle Verwaltungsaufgaben auf einer einzelnen Site ausführen. Redakteure können Beiträge veröffentlichen und verwalten, einschließlich der anderen Benutzer. Autoren können ihre eigenen Beiträge posten und verwalten. Mitwirkende können ihre eigenen Beiträge schreiben und verwalten, aber sie können nicht veröffentlicht werden. Abonnenten können ihr Profil nur verwalten.
add_role()
Um eine neue Benutzerrolle in WordPress hinzuzufügen, können Sie die Funktion
add_role( 'custom_role', __('自定义角色'), array( 'read' => true, // 可以读取帖子 'edit_posts' => true, // 可以编辑帖子 ) );
remove_role()
Um eine Benutzerrolle in WordPress zu löschen, können Sie die Funktion
remove_role('custom_role');
add_cap()
Um Benutzerrollen in WordPress Berechtigungen hinzuzufügen, können Sie die Funktion
$role = get_role('custom_role'); $role->add_cap('publish_posts', true);
Um Berechtigungen von Benutzerrollen in WordPress zu entfernen, können Sie die Funktion remove_cap()
verwenden. Diese Funktion akzeptiert einen Parameter: Genehmigung. Um beispielsweise die Berechtigung "Publish_Posts" aus "Custom_Role" zu entfernen, können Sie den folgenden Code verwenden:
$role = get_role('custom_role'); $role->remove_cap('publish_posts');
Um die Standardbenutzerrolle in WordPress zu ändern, navigieren Sie zu Einstellungen & GT; Wählen Sie unter neuen Benutzer-Standardrollen die Rolle aus, die Sie als Standardmenü im Dropdown-Menü festlegen möchten.
WordPress unterstützt nicht die Zuordnung mehrerer Rollen an Benutzer standardmäßig. Sie können dies jedoch mit Plugins wie mehreren Rollen tun. Nachdem Sie das Plugin installiert und aktivieren, können Sie dem Benutzer auf der Profilseite des Benutzers mehrere Rollen zuweisen.
Um den Inhaltszugriff basierend auf Benutzerrollen in WordPress einzuschränken, können Sie Plugins wie Mitglieder verwenden. Mit diesem Plugin können Sie steuern, welche Rollen auf bestimmten Inhalten auf Ihrer Website zugreifen können.
Um benutzerdefinierte Berechtigungen in WordPress zu erstellen, können Sie die Funktion add_cap()
verwenden. Diese Funktion akzeptiert zwei Parameter: Erlaubnis und einen Booleschen Wert, der angibt, ob die Rolle die Genehmigung hat. Um beispielsweise eine benutzerdefinierte Berechtigte mit dem Namen "Management_Custom" zu "Custom_Role" hinzuzufügen, können Sie den folgenden Code verwenden:
$role = get_role('custom_role'); $role->add_cap('manage_custom', true);
Um zu überprüfen, ob ein Benutzer in WordPress über bestimmte Berechtigungen verfügt, können Sie die Funktion current_user_can()
verwenden. Diese Funktion akzeptiert einen Parameter: Genehmigung. Um beispielsweise zu überprüfen, ob der aktuelle Benutzer die Berechtigung "verwalten" hat, können Sie den folgenden Code verwenden:
if (current_user_can('manage_custom')) { // 当前用户具有“manage_custom”权限 }
Alle Bilder behalten ihr ursprüngliches Format und ihre Lage.
Das obige ist der detaillierte Inhalt vonMastering von WordPress -Rollen und -funktionen beherrschen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!