Gestion des utilisateurs WordPress: analyse approfondie des rôles et autorisations
Le système de gestion des utilisateurs de WordPress est basé sur des rôles et des autorisations. Un rôle est une entité qui contient un nom unique et un ensemble d'autorisations, chacune définit le niveau d'accès aux caractéristiques spécifiques à la plate-forme de ce rôle. Faisons des mécanismes de travail des rôles et des autorisations WordPress.
add_role()
, remove_role()
, add_cap()
et remove_cap()
peuvent être utilisées pour gérer les rôles et les autorisations. Cependant, vous devez faire attention à l'accès et aux performances de la base de données lors de l'utilisation de ces fonctions. register_activation_hook()
. Une autre façon consiste à contourner la base de données WordPress en définissant la variable globale $wp_user_roles
. La liste de rôle et d'autorisation par défaut est disponible sur WordPress Codex.
La base de données stocke cette liste dans le tableau wp_options
.
Il utilise la clé sérialisée wp_user_roles
.
Les données désérialisées sont les suivantes:
<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>
Ces métadonnées sont automatiquement définies lorsqu'un nouveau site WordPress est installé.
Lorsque WordPress démarre, la classe charge la liste de la base de données. WP_Roles
et plugins_loaded
crochets. init
stocké dans la table wp_usermeta
pour relier les utilisateurs à leurs rôles. meta_key
Après la désérialisation, les métadonnées sont les suivantes:
<code>array( 'administrator' => true )</code>
Aussi, rappelez-vous
est le préfixe du blog actuel. wp_
). $GLOBALS['wpdb']->get_blog_prefix()
wp_capabilities
a:1:{s:13:"administrator";b:1;}
= & gt;
wp_10_capabilities
a:1:{s:11:"contributor";b:1;}
wp_15_capabilities
Cette règle s'applique également à l'entrée a:1:{s:10:"subscriber";b:1;}
que nous avons vue dans le tableau Enfin, nous pouvons voir les métadonnées wp_user_level
ainsi que le rôle.
Il est utilisé pour gérer les caractères dans des versions plus anciennes de WordPress et est désormais obsolète.
Nous avons appris comment les rôles sont chargés et liés aux utilisateurs;
Certaines autorisations par défaut sont codées en dur dans le code de base WordPress.
Par exemple, lorsque l'écran du plugin est chargé, il vérifiera si l'utilisateur actuel peut gérer le plugin en exécutant le code suivant:
<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>
ne sont jamais codés en dur;
WordPress fournit les fonctions globales suivantes pour nous aider à gérer les rôles.
current_user_can()
Vérifiez si l'utilisateur actuel a les autorisations requises.
<code>array( 'administrator' => true )</code>
WP_User::has_cap
Vérifiez si un utilisateur spécifique a la permission.
<code>if (!current_user_can('activate_plugins')) { wp_die(__('您没有足够的权限来管理此站点的插件。')); }</code>
Nous pouvons remarquer que current_user_can
utilise cette fonction.
get_editable_roles()
revient à des rôles modifiables.
<code>add_action('init', function() { if (current_user_can('install_plugins')) { echo '您可以安装插件'; } else { echo '您不能安装插件'; } });</code>
Cette liste peut être écrasée par les filtres editable_roles
, nous ne devons donc pas compter sur cette fonction pour obtenir la liste complète des rôles sur le site Web.
Veuillez noter l'utilisation du crochet admin_init
, car la fonction n'a pas encore été chargée dans le crochet init
.
get_role()
Obtenez WP_Role
objet basé sur sa limace.
<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()
Vérifiez si le rôle a les autorisations requises.
<code>add_action('admin_init', function() { $roles = get_editable_roles(); var_dump($roles); });</code>
WordPress fournit également une API complète pour personnaliser les rôles et leurs autorisations.
add_role()
Enregistrez un nouveau rôle dans la base de données.
<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()
Si présent, supprimez le rôle requis de la base de données.
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role->has_cap('install_plugins')); // 打印 TRUE });</code>
WP_Role::add_cap()
Ajouter des autorisations au rôle.
<code>add_action('init', function() { add_role('plugins_manager', '插件管理员', array( 'install_plugins', 'activate_plugins', 'edit_plugins' )); });</code>
Cela peut être des autorisations de base (install_plugins
, edit_posts
…) ou n'importe quelle chaîne personnalisée (my_awesome_plugin_cap
).
Il nous permet d'enregistrer autant d'autorisations personnalisées que possible pour notre plugin.
WP_Role::remove_cap()
s'il existe, supprimez les autorisations du rôle.
<code>add_action('init', function() { remove_role('plugins_manager'); });</code>
WP_User::add_role()
Ajouter des rôles à un utilisateur donné.
<code>add_action('init', function() { $role = get_role('contributor'); $role->add_cap('install_plugins'); });</code>
Cette fonction vous permet de définir théoriquement plusieurs rôles pour le même utilisateur.
Étant donné que le backend WordPress affiche et gère un rôle par utilisateur, nous ne devons pas ajouter plusieurs rôles pour les utilisateurs et devons toujours utiliser WP_User::remove_role()
avant d'ajouter un nouveau rôle.
WP_User::remove_role()
supprimer les rôles de l'utilisateur donné.
<code>add_action('init', function() { $role = get_role('contributor'); $role->remove_cap('install_plugins'); });</code>
WP_User::add_cap()
Ajouter des autorisations à un utilisateur donné.
<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>
Ceci est très utile si nous voulons ajouter une seule autorisation à l'utilisateur sans avoir à créer un rôle complet.
WP_User::remove_cap()
Supprimer les autorisations de l'utilisateur donné.
<code>array( 'administrator' => true )</code>
En dehors d'une question, les fonctions que nous voyons sont bonnes: l'accès et les performances de la base de données.
sur quoi nous nous concentrons principalement lorsque nous traitons des rôles et des autorisations, c'est quand notre code devrait-il être déclenché?
Pour expliquer cela, jetons un coup d'œil au code de base WordPress.Tout d'abord, nous voulons ajouter un nouveau caractère vide:
<code>if (!current_user_can('activate_plugins')) { wp_die(__('您没有足够的权限来管理此站点的插件。')); }</code>
(en fait redirigé vers add_role
): WP_Roles::add_role
<code>add_action('init', function() { if (current_user_can('install_plugins')) { echo '您可以安装插件'; } else { echo '您不能安装插件'; } });</code>
s'exécute une fois et ne fait plus rien. add_role
<code>add_action('init', function() { $user = get_user_by('slug', 'admin'); if ($user->has_cap('install_plugins')) { echo '管理员可以安装插件'; } else { echo '管理员不能安装插件'; } });</code>
dans WordPress 4.2.2 est la suivante: WP_Role::add_cap()
<code>add_action('admin_init', function() { $roles = get_editable_roles(); var_dump($roles); });</code>
, mais nous pouvons également voir que la base de données sera mise à jour chaque fois que notre code s'exécute, même si nos nouvelles autorisations sont déjà enregistrées! $this->roles
Cela signifie que si nous nous soucions des performances, tout le code que nous écrivons pour les rôles personnalisés et les autorisations ne devrait pas s'exécuter lorsque chaque page se charge.
Il existe plusieurs façons d'éviter ces problèmes de base de données.
WordPress permet aux auteurs du plugin d'utiliser la fonction
Créons un exemple de plugin: register_activation_hook()
Ce code ne s'exécutera qu'une seule fois lorsque le plugin est activé sur le site Web.
<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>
Que se passe-t-il si le plugin est déjà en production, ou si la réactivation est omise lorsque la mise à jour est poussée?
En fait, cette solution repose également sur la base de données et nécessite une étape supplémentaire lors de la poussée du code.
Base de données WordPress de contournement
Il existe également une solution non divulguée qui fonctionne bien dans certains cas.
charge le rôle de la base de données lorsque WordPress démarre:
WP_Roles
WordPress vérifie les variables globales
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role->has_cap('install_plugins')); // 打印 TRUE });</code>
Si défini, WordPress utilisera son contenu et bloquera l'utilisation de la base de données en définissant la variable $wp_user_roles
sur false.
Essayons-le, en gardant seulement un nouveau rôle d'administrateur restreint: $this->use_db
Lors du chargement du backend, nous pouvons voir qu'il conserve la définition de notre rôle personnalisé:
Cette solution résout le problème de la base de données, mais peut introduire d'autres problèmes:
Cependant, cela peut être une solution viable lors de la création d'une application WordPress personnalisée qui nécessite une liste personnalisée de rôles statiques:
Dans cet article, je présente un aperçu des rôles et des autorisations d'utilisation dans WordPress.
Bien que son API complète nous permette de faire presque tout ce que nous voulons, les relations avec les bases de données sont toujours le principal problème.
Nous devons garder cela à l'esprit lors du développement de nos plugins et de nos thèmes.
Que pensez-vous de la façon dont WordPress gère les rôles? Dans l'attente de vos commentaires!
WordPress a six rôles utilisateur par défaut: super administrateur, administrateur, éditeur, auteur, contributeur et abonné. Chaque rôle a un ensemble spécifique d'autorisations. Par exemple, un super administrateur peut accéder à toutes les fonctionnalités administratives de plusieurs sites. Les administrateurs peuvent effectuer toutes les tâches administratives sur un seul site. Les éditeurs peuvent publier et gérer des publications, y compris ceux des autres utilisateurs. Les auteurs peuvent publier et gérer leurs propres messages. Les contributeurs peuvent écrire et gérer leurs propres messages, mais ils ne peuvent pas être affichés. Les abonnés ne peuvent gérer que leur profil.
Pour ajouter un nouveau rôle utilisateur dans WordPress, vous pouvez utiliser la fonction add_role()
. Cette fonction accepte trois paramètres: rôle, nom d'affichage et tableau d'autorisation. Par exemple, pour ajouter un nouveau rôle appelé "Custom_role" et avoir la permission de lire et de modifier les publications, vous pouvez utiliser le code suivant:
add_role( 'custom_role', __('自定义角色'), array( 'read' => true, // 可以读取帖子 'edit_posts' => true, // 可以编辑帖子 ) );
Pour supprimer un rôle utilisateur dans WordPress, vous pouvez utiliser la fonction remove_role()
. Cette fonction accepte un paramètre: rôle. Par exemple, pour supprimer le "Custom_role" précédemment ajouté, vous pouvez utiliser le code suivant:
remove_role('custom_role');
Pour ajouter des autorisations aux rôles utilisateur dans WordPress, vous pouvez utiliser la fonction add_cap()
. Cette fonction accepte deux paramètres: l'autorisation et une valeur booléenne indiquant si le rôle a l'autorisation. Par exemple, pour ajouter la permission de "publih_posts" à "Custom_role", vous pouvez utiliser le code suivant:
$role = get_role('custom_role'); $role->add_cap('publish_posts', true);
Pour supprimer les autorisations des rôles utilisateur dans WordPress, vous pouvez utiliser la fonction remove_cap()
. Cette fonction accepte un paramètre: l'autorisation. Par exemple, pour supprimer l'autorisation "Publish_Posts" de "Custom_role", vous pouvez utiliser le code suivant:
$role = get_role('custom_role'); $role->remove_cap('publish_posts');
Pour modifier le rôle d'utilisateur par défaut dans WordPress, accédez à Paramètres & gt; Dans le cadre des nouveaux rôles par défaut de l'utilisateur, sélectionnez le rôle que vous souhaitez définir par défaut dans le menu déroulant.
WordPress ne prend pas en charge l'attribution de plusieurs rôles aux utilisateurs par défaut. Cependant, vous pouvez le faire en utilisant des plugins comme plusieurs rôles. Après avoir installé et activé le plugin, vous pouvez attribuer plusieurs rôles à l'utilisateur à partir de la page de profil de l'utilisateur.
Pour restreindre l'accès au contenu en fonction des rôles utilisateur dans WordPress, vous pouvez utiliser des plugins comme les membres. Ce plugin vous permet de contrôler les rôles qui peuvent accéder au contenu spécifique sur votre site Web.
Pour créer des autorisations personnalisées dans WordPress, vous pouvez utiliser la fonction add_cap()
. Cette fonction accepte deux paramètres: l'autorisation et une valeur booléenne indiquant si le rôle a l'autorisation. Par exemple, pour ajouter une autorisation personnalisée nommée "Manage_custom" à "Custom_role", vous pouvez utiliser le code suivant:
$role = get_role('custom_role'); $role->add_cap('manage_custom', true);
Pour vérifier si un utilisateur dans WordPress a des autorisations spécifiques, vous pouvez utiliser la fonction current_user_can()
. Cette fonction accepte un paramètre: l'autorisation. Par exemple, pour vérifier si l'utilisateur actuel a une autorisation "manage_custom", vous pouvez utiliser le code suivant:
if (current_user_can('manage_custom')) { // 当前用户具有“manage_custom”权限 }
Toutes les images conservent leur format et leur emplacement d'origine.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!