WordPress用户管理:角色与权限的深度解析
WordPress的用户管理系统基于角色和权限。角色是一个包含唯一名称和一组权限的实体,每个权限定义了该角色对平台特定功能的访问级别。让我们深入了解WordPress角色和权限的工作机制。
add_role()
、remove_role()
、add_cap()
和remove_cap()
等函数可用于管理角色和权限。但是,使用这些函数时必须注意数据库访问和性能。register_activation_hook()
函数。另一种方法是通过设置$wp_user_roles
全局变量来绕过WordPress数据库。默认角色和权限列表可在WordPress Codex上找到。
数据库将此列表存储在wp_options
表中。
它使用序列化后的wp_user_roles
键。
反序列化后的数据如下所示:
<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>
此元数据在安装新的WordPress站点时会自动设置。
WordPress启动时,WP_Roles
类会从数据库加载列表。
这发生在plugins_loaded
和init
钩子之间。
WordPress使用存储在wp_usermeta
表中的meta_key
将用户链接到其角色。
反序列化后,元数据如下所示:
<code>array( 'administrator' => true )</code>
请注意,WordPress使用数组,尽管用户一次只能拥有一个角色,我们稍后将看到原因。
另外,请记住wp_
是当前博客的前缀。
(我们可以使用$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;}
[...]
此规则也适用于我们之前在wp_options
表中看到的wp_user_roles
条目。
最后,我们可以看到wp_user_level
元数据以及角色。
它用于处理旧版WordPress中的角色,现在已弃用。
我们已经了解了角色是如何加载并链接到用户的;从那里,WordPress能够在需要时获取给定用户的权限。
一些默认权限在WordPress核心代码中是硬编码的。
例如,加载插件屏幕时,它将通过运行以下代码来检查当前用户是否可以管理插件:
<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>
角色永远不会被硬编码;角色只是一个权限包装器,它只存在于数据库中。
WordPress提供以下全局函数来帮助我们处理角色。
current_user_can()
检查当前用户是否拥有所需的权限。
<code>array( 'administrator' => true )</code>
WP_User::has_cap
检查特定用户是否拥有权限。
<code>if (!current_user_can('activate_plugins')) { wp_die(__('您没有足够的权限来管理此站点的插件。')); }</code>
我们可以注意到current_user_can
使用了此函数。
get_editable_roles()
返回可编辑的角色。
<code>add_action('init', function() { if (current_user_can('install_plugins')) { echo '您可以安装插件'; } else { echo '您不能安装插件'; } });</code>
此列表可能会被editable_roles
过滤器覆盖,因此我们不应依赖此函数来获取网站上的完整角色列表。
请注意admin_init
钩子的使用,因为该函数尚未在init
钩子中加载。
get_role()
根据其slug获取WP_Role
对象。
<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()
检查角色是否拥有所需的权限。
<code>add_action('admin_init', function() { $roles = get_editable_roles(); var_dump($roles); });</code>
WordPress还提供了一个完整的API来自定义角色及其权限。
add_role()
在数据库中注册一个新角色。
<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()
如果存在,则从数据库中删除所需的角色。
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role->has_cap('install_plugins')); // 打印 TRUE });</code>
WP_Role::add_cap()
向角色添加权限。
<code>add_action('init', function() { add_role('plugins_manager', '插件管理员', array( 'install_plugins', 'activate_plugins', 'edit_plugins' )); });</code>
这可以是核心权限(install_plugins
、edit_posts
……)或任何自定义字符串(my_awesome_plugin_cap
)。
它允许我们为我们的插件注册任意数量的自定义权限。
WP_Role::remove_cap()
如果存在,则从角色中删除权限。
<code>add_action('init', function() { remove_role('plugins_manager'); });</code>
WP_User::add_role()
向给定用户添加角色。
<code>add_action('init', function() { $role = get_role('contributor'); $role->add_cap('install_plugins'); });</code>
此函数允许您理论上为同一用户设置多个角色。
由于WordPress后端仅显示和管理每个用户一个角色,因此我们不应为用户添加多个角色,并且应始终在添加新角色之前使用WP_User::remove_role()
。
WP_User::remove_role()
从给定用户中删除角色。
<code>add_action('init', function() { $role = get_role('contributor'); $role->remove_cap('install_plugins'); });</code>
WP_User::add_cap()
向给定用户添加权限。
<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>
如果我们想向用户添加单个权限,而不必创建完整的角色,这将非常有用。
WP_User::remove_cap()
从给定用户中删除权限。
<code>array( 'administrator' => true )</code>
除了一个问题之外,我们看到的函数看起来都很好:数据库访问和性能。
我们在处理角色和权限时主要关注的是何时应该触发我们的代码?
为了解释这一点,让我们看看WordPress核心代码。
首先,我们要添加一个新的空角色:
<code>if (!current_user_can('activate_plugins')) { wp_die(__('您没有足够的权限来管理此站点的插件。')); }</code>
以下是add_role
函数(实际上重定向到WP_Roles::add_role
)的前几行:
<code>add_action('init', function() { if (current_user_can('install_plugins')) { echo '您可以安装插件'; } else { echo '您不能安装插件'; } });</code>
如果我们添加一个新角色,add_role
函数运行一次,然后什么也不做。
接下来,假设我们要向我们新创建的角色添加权限:
<code>add_action('init', function() { $user = get_user_by('slug', 'admin'); if ($user->has_cap('install_plugins')) { echo '管理员可以安装插件'; } else { echo '管理员不能安装插件'; } });</code>
WordPress 4.2.2中的WP_Role::add_cap()
函数如下所示:
<code>add_action('admin_init', function() { $roles = get_editable_roles(); var_dump($roles); });</code>
它更新了$this->roles
对象,但我们也可以看到数据库将每次我们的代码运行时都会更新,即使我们的新权限已经注册了!
这意味着如果我们关心性能,我们为自定义角色和权限而编写的全部代码不应在每个页面加载时运行。
有几种方法可以避免这些数据库问题。
WordPress允许插件作者使用register_activation_hook()
函数在后端启用插件时触发代码。
让我们创建一个示例插件:
<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>
此代码仅会在网站上启用插件时运行一次。
现在,我们必须记住,此解决方案取决于插件的激活和停用。
如果插件已经投入生产,或者在推送更新时省略了重新激活,会发生什么情况?
事实上,此解决方案也依赖于数据库,并且在推送代码时需要一个额外的步骤。
还有一种未公开的解决方案,在某些情况下可以很好地工作。
让我们最后看看WordPress核心代码,当WP_Roles
对象在WordPress启动时从数据库加载角色时:
<code>add_action('init', function() { $role = get_role('administrator'); var_dump($role->has_cap('install_plugins')); // 打印 TRUE });</code>
在从数据库获取数据之前,WordPress会检查$wp_user_roles
全局变量。
如果已设置,WordPress将使用其内容,并通过将$this->use_db
变量设置为false来阻止数据库使用。
让我们尝试一下,只保留一个新的、受限的管理员角色:
<code>add_action('init', function() { add_role('plugins_manager', '插件管理员', array( 'install_plugins', 'activate_plugins', 'edit_plugins' )); });</code>
加载后端时,我们可以看到它保留了我们自定义角色的定义:
此解决方案解决了数据库问题,但可能会引入其他一些问题:
但是,在构建需要自定义静态角色列表的自定义WordPress应用程序时,这可能是一种可行的解决方案:
在本文中,我介绍了WordPress中角色和权限使用的概述。
尽管其完整的API允许我们几乎做任何我们想做的事情,但与数据库的关系仍然是主要问题。
在开发我们的插件和主题时,我们必须牢记这一点。
您对WordPress管理角色的方式有何看法?期待您的反馈!
WordPress有六个默认用户角色:超级管理员、管理员、编辑、作者、投稿者和订阅者。每个角色都有一组特定的权限。例如,超级管理员可以访问多个站点的所有管理功能。管理员可以在单个站点上执行所有管理任务。编辑可以发布和管理帖子,包括其他用户的帖子。作者可以发布和管理他们自己的帖子。投稿者可以撰写和管理他们自己的帖子,但不能发布它们。订阅者只能管理他们的个人资料。
要在WordPress中添加新的用户角色,可以使用add_role()
函数。此函数接受三个参数:角色、显示名称和权限数组。例如,要添加一个名为“custom_role”的新角色,并具有读取和编辑帖子的权限,可以使用以下代码:
add_role( 'custom_role', __('自定义角色'), array( 'read' => true, // 可以读取帖子 'edit_posts' => true, // 可以编辑帖子 ) );
要在WordPress中删除用户角色,可以使用remove_role()
函数。此函数接受一个参数:角色。例如,要删除前面添加的“custom_role”,可以使用以下代码:
remove_role('custom_role');
要向WordPress中的用户角色添加权限,可以使用add_cap()
函数。此函数接受两个参数:权限和一个布尔值,指示角色是否具有该权限。例如,要向“custom_role”添加“publish_posts”权限,可以使用以下代码:
$role = get_role('custom_role'); $role->add_cap('publish_posts', true);
要从WordPress中的用户角色中删除权限,可以使用remove_cap()
函数。此函数接受一个参数:权限。例如,要从“custom_role”中删除“publish_posts”权限,可以使用以下代码:
$role = get_role('custom_role'); $role->remove_cap('publish_posts');
要更改WordPress中的默认用户角色,请在WordPress仪表板中导航到设置 > 常规。在“新用户默认角色”下,从下拉菜单中选择要设置为默认的角色。
WordPress默认不支持向用户分配多个角色。但是,您可以使用像Multiple Roles这样的插件来实现这一点。安装并激活插件后,您可以从用户的个人资料页面向用户分配多个角色。
要根据WordPress中的用户角色限制内容访问,可以使用像Members这样的插件。此插件允许您控制哪些角色可以访问您网站上的特定内容。
要在WordPress中创建自定义权限,可以使用add_cap()
函数。此函数接受两个参数:权限和一个布尔值,指示角色是否具有该权限。例如,要向“custom_role”添加名为“manage_custom”的自定义权限,可以使用以下代码:
$role = get_role('custom_role'); $role->add_cap('manage_custom', true);
要检查WordPress中的用户是否具有特定权限,可以使用current_user_can()
函数。此函数接受一个参数:权限。例如,要检查当前用户是否具有“manage_custom”权限,可以使用以下代码:
if (current_user_can('manage_custom')) { // 当前用户具有“manage_custom”权限 }
所有图片均保留原始格式和位置。
以上是掌握WordPress角色和功能的详细内容。更多信息请关注PHP中文网其他相关文章!