掌握WordPress角色和功能
WordPress用户管理:角色与权限的深度解析
WordPress的用户管理系统基于角色和权限。角色是一个包含唯一名称和一组权限的实体,每个权限定义了该角色对平台特定功能的访问级别。让我们深入了解WordPress角色和权限的工作机制。
关键要点
- WordPress的用户管理基于角色和权限。角色拥有唯一名称和一组权限,这些权限定义了角色对平台不同功能的访问级别。
- WordPress提供了一个全面的API来定制角色及其权限。
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 API
访问API
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>
自定义API
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 API的一些问题
除了一个问题之外,我们看到的函数看起来都很好:数据库访问和性能。
我们在处理角色和权限时主要关注的是何时应该触发我们的代码?
为了解释这一点,让我们看看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数据库
还有一种未公开的解决方案,在某些情况下可以很好地工作。
让我们最后看看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>
加载后端时,我们可以看到它保留了我们自定义角色的定义:
此解决方案解决了数据库问题,但可能会引入其他一些问题:
- 使用原生API的插件可能无法正常工作。
- 我们必须手动设置每个角色的定义,即使是我们不想更改的角色。
但是,在构建需要自定义静态角色列表的自定义WordPress应用程序时,这可能是一种可行的解决方案:
- 角色定义可以与代码一起版本化。
- 将新代码推送到环境将自动更新定义。
- 不再需要考虑数据库问题。
结论
在本文中,我介绍了WordPress中角色和权限使用的概述。
尽管其完整的API允许我们几乎做任何我们想做的事情,但与数据库的关系仍然是主要问题。
在开发我们的插件和主题时,我们必须牢记这一点。
您对WordPress管理角色的方式有何看法?期待您的反馈!
掌握WordPress角色和权限的常见问题解答
WordPress中的默认用户角色是什么?它们的权限是什么?
WordPress有六个默认用户角色:超级管理员、管理员、编辑、作者、投稿者和订阅者。每个角色都有一组特定的权限。例如,超级管理员可以访问多个站点的所有管理功能。管理员可以在单个站点上执行所有管理任务。编辑可以发布和管理帖子,包括其他用户的帖子。作者可以发布和管理他们自己的帖子。投稿者可以撰写和管理他们自己的帖子,但不能发布它们。订阅者只能管理他们的个人资料。
如何在WordPress中添加新的用户角色?
要在WordPress中添加新的用户角色,可以使用add_role()
函数。此函数接受三个参数:角色、显示名称和权限数组。例如,要添加一个名为“custom_role”的新角色,并具有读取和编辑帖子的权限,可以使用以下代码:
add_role( 'custom_role', __('自定义角色'), array( 'read' => true, // 可以读取帖子 'edit_posts' => true, // 可以编辑帖子 ) );
如何在WordPress中删除用户角色?
要在WordPress中删除用户角色,可以使用remove_role()
函数。此函数接受一个参数:角色。例如,要删除前面添加的“custom_role”,可以使用以下代码:
remove_role('custom_role');
如何向WordPress中的用户角色添加权限?
要向WordPress中的用户角色添加权限,可以使用add_cap()
函数。此函数接受两个参数:权限和一个布尔值,指示角色是否具有该权限。例如,要向“custom_role”添加“publish_posts”权限,可以使用以下代码:
$role = get_role('custom_role'); $role->add_cap('publish_posts', true);
如何从WordPress中的用户角色中删除权限?
要从WordPress中的用户角色中删除权限,可以使用remove_cap()
函数。此函数接受一个参数:权限。例如,要从“custom_role”中删除“publish_posts”权限,可以使用以下代码:
$role = get_role('custom_role'); $role->remove_cap('publish_posts');
如何更改WordPress中的默认用户角色?
要更改WordPress中的默认用户角色,请在WordPress仪表板中导航到设置 > 常规。在“新用户默认角色”下,从下拉菜单中选择要设置为默认的角色。
如何向WordPress中的用户分配多个角色?
WordPress默认不支持向用户分配多个角色。但是,您可以使用像Multiple Roles这样的插件来实现这一点。安装并激活插件后,您可以从用户的个人资料页面向用户分配多个角色。
如何根据WordPress中的用户角色限制内容访问?
要根据WordPress中的用户角色限制内容访问,可以使用像Members这样的插件。此插件允许您控制哪些角色可以访问您网站上的特定内容。
如何在WordPress中创建自定义权限?
要在WordPress中创建自定义权限,可以使用add_cap()
函数。此函数接受两个参数:权限和一个布尔值,指示角色是否具有该权限。例如,要向“custom_role”添加名为“manage_custom”的自定义权限,可以使用以下代码:
$role = get_role('custom_role'); $role->add_cap('manage_custom', true);
如何检查WordPress中的用户是否具有特定权限?
要检查WordPress中的用户是否具有特定权限,可以使用current_user_can()
函数。此函数接受一个参数:权限。例如,要检查当前用户是否具有“manage_custom”权限,可以使用以下代码:
if (current_user_can('manage_custom')) { // 当前用户具有“manage_custom”权限 }
所有图片均保留原始格式和位置。
以上是掌握WordPress角色和功能的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

博客是人们在网上表达观点、意见和见解的理想平台。许多新手渴望建立自己的网站,却因担心技术障碍或成本问题而犹豫不决。然而,随着平台不断发展以满足初学者的能力和需求,现在开始变得比以往任何时候都更容易。 本文将逐步指导您如何建立一个WordPress博客,从主题选择到使用插件提升安全性和性能,助您轻松创建自己的网站。 选择博客主题和方向 在购买域名或注册主机之前,最好先确定您计划涵盖的主题。个人网站可以围绕旅行、烹饪、产品评论、音乐或任何激发您兴趣的爱好展开。专注于您真正感兴趣的领域可以鼓励持续写作

有四种方法可以调整 WordPress 文章列表:使用主题选项、使用插件(如 Post Types Order、WP Post List、Boxy Stuff)、使用代码(在 functions.php 文件中添加设置)或直接修改 WordPress 数据库。

您想了解如何在父分类存档页面上显示子分类吗?在自定义分类存档页面时,您可能需要执行此操作,以使其对访问者更有用。在本文中,我们将向您展示如何在父分类存档页面上轻松显示子分类。为什么在父分类存档页面上显示子分类?通过在父分类存档页面上显示所有子分类,您可以使其不那么通用,对访问者更有用。例如,如果您运行一个关于书籍的WordPress博客,并且有一个名为“主题”的分类法,那么您可以添加“小说”、“非小说”等子分类法,以便您的读者可以

最近,我们向您展示了如何通过允许用户将自己喜欢的帖子保存在个性化库中来为用户创建个性化体验。您可以通过在某些地方(即欢迎屏幕)使用他们的名字,将个性化结果提升到另一个水平。幸运的是,WordPress使获取登录用户的信息变得非常容易。在本文中,我们将向您展示如何检索与当前登录用户相关的信息。我们将利用get_currentuserinfo(); 功能。这可以在主题中的任何地方使用(页眉、页脚、侧边栏、页面模板等)。为了使其工作,用户必须登录。因此我们需要使用

过去,我们分享过如何使用PostExpirator插件使WordPress中的帖子过期。好吧,在创建活动列表网站时,我们发现这个插件非常有用。我们可以轻松删除过期的活动列表。其次,多亏了这个插件,按帖子过期日期对帖子进行排序也非常容易。在本文中,我们将向您展示如何在WordPress中按帖子过期日期对帖子进行排序。更新了代码以反映插件中更改自定义字段名称的更改。感谢Tajim在评论中让我们知道。在我们的特定项目中,我们将事件作为自定义帖子类型。现在

WordPress对初学者来说容易上手。1.登录后台后,用户界面直观,简洁的仪表板提供所有必要功能链接。2.基本操作包括创建和编辑内容,所见即所得的编辑器简化了内容创建。3.初学者可以通过插件和主题扩展网站功能,学习曲线存在但可以通过实践掌握。

我们的一位用户询问其他网站如何在页脚中显示查询数量和页面加载时间。您经常会在网站的页脚中看到这一点,它可能会显示类似以下内容:“1.248秒内64个查询”。在本文中,我们将向您展示如何在WordPress中显示查询数量和页面加载时间。只需将以下代码粘贴到主题文件中您喜欢的任何位置(例如footer.php)。queriesin

您是否正在寻找自动化 WordPress 网站和社交媒体帐户的方法? 通过自动化,您将能够在 Facebook、Twitter、LinkedIn、Instagram 等平台上自动分享您的 WordPress 博客文章或更新。 在本文中,我们将向您展示如何使用 IFTTT、Zapier 和 Uncanny Automator 轻松实现 WordPress 和社交媒体的自动化。 为什么要自动化 WordPress 和社交媒体? 自动化您的WordPre
