搜索
首页CMS教程WordPress掌握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键。

Mastering WordPress Roles and Capabilities 反序列化后的数据如下所示:

<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_loadedinit钩子之间。

将用户链接到角色

WordPress使用存储在wp_usermeta表中的meta_key将用户链接到其角色。

Mastering WordPress Roles and Capabilities 反序列化后,元数据如下所示:

<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_pluginsedit_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>

Mastering WordPress Roles and Capabilities 如果我们想向用户添加单个权限,而不必创建完整的角色,这将非常有用。

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>

加载后端时,我们可以看到它保留了我们自定义角色的定义:

Mastering WordPress Roles and Capabilities 此解决方案解决了数据库问题,但可能会引入其他一些问题:

  • 使用原生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中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
WordPress的插件生态系统如何增强其CMS功能?WordPress的插件生态系统如何增强其CMS功能?May 14, 2025 am 12:20 AM

WordPressPluginsscmscmscapabilities byferingCustomization和Functionality.1)超过50,000pluginsallowuserstalostailortheortheortheortheirsiteirsiteforseo,e-Commerce和security.2)pluginScaneCanextendCorefeatures,likeaddingcustostostposttypes.3 bullycanc.3)

WordPress适合电子商务吗?WordPress适合电子商务吗?May 13, 2025 am 12:05 AM

是的,WordPress非常适合做电商。 1)通过WooCommerce插件,WordPress可以快速变成功能全面的在线商店。 2)需要关注性能优化和安全性,定期更新和使用缓存、安全插件是关键。 3)WordPress提供了丰富的定制选项,提升用户体验和SEO优化效果显着。

如何在 Yandex 网站管理员工具中添加您的 WordPress 网站如何在 Yandex 网站管理员工具中添加您的 WordPress 网站May 12, 2025 pm 09:06 PM

您想将您的网站连接到Yandex网站管理员工具吗?Google搜索控制台、Bing和Yandex等网站管理员工具可帮助您优化网站、监控流量、管理robots.txt、检查网站错误等。在本文中,我们将分享如何在Yandex网站管理员工具中添加您的WordPress网站来监控您的搜索引擎流量。什么是Yandex?Yandex是一个位于俄罗斯的流行搜索引擎,类似于Google和Bing。您可以在Yandex中优

如何修复 WordPress 中的 HTTP 图片上传错误(简单)如何修复 WordPress 中的 HTTP 图片上传错误(简单)May 12, 2025 pm 09:03 PM

您需要修复WordPress中的HTTP图片上传错误吗?当您在WordPress中创建内容时,此错误可能会特别令人沮丧。当您使用内置WordPress媒体库将图像或其他文件上传到CMS时,通常会发生这种情况。在本文中,我们将向您展示如何轻松修复WordPress中的HTTP图片上传错误。WordPress媒体上传过程中出现HTTP错误的原因是什么?当您尝试使用WordPress媒体上传器将文件上传到Wo

如何修复添加媒体按钮在 WordPress 中不起作用的问题如何修复添加媒体按钮在 WordPress 中不起作用的问题May 12, 2025 pm 09:00 PM

最近,我们的一位读者报告说,他们的WordPress网站上的“添加媒体”按钮突然停止工作。此经典编辑器问题不会显示任何错误或警告,这使用户不知道为什么他们的“添加媒体”按钮不起作用。在本文中,我们将向您展示如何轻松修复WordPress中的“添加媒体”按钮不起作用的问题。是什么导致WordPress“添加媒体”按钮停止工作?如果您仍在使用旧的经典WordPress编辑器,那么“添加媒体”按钮允许您将图像、视频等插入博客文章中。

如何设置、获取和删除 WordPress Cookie(像专业人士一样)如何设置、获取和删除 WordPress Cookie(像专业人士一样)May 12, 2025 pm 08:57 PM

您想了解如何在WordPress网站上使用cookie吗?Cookie是在用户浏览器中存储临时信息的有用工具。您可以使用此信息通过个性化和行为定位来增强用户体验。在本终极指南中,我们将向您展示如何像专业人士一样设置、获取和删除WordPresscookie。注意:这是一个高级教程。它要求您精通HTML、CSS、WordPress网站和PHP。什么是Cookie?Cookie是用户访问网站时创建并存储在用户浏览

如何修复 WordPress 429 请求过多错误如何修复 WordPress 429 请求过多错误May 12, 2025 pm 08:54 PM

您是否在WordPress网站上看到“429请求过多”错误?此错误消息意味着用户向您网站的服务器发送了太多HTTP请求。此错误可能会非常令人沮丧,因为很难找出导致该错误的原因。在本文中,我们将向您展示如何轻松修复“WordPress429TooManyRequests”错误。是什么原因导致WordPress429请求过多错误?“429TooManyRequests”错误的最常见原因是用户、机器人或脚本尝试向网站

WordPress作为大型网站的CMS有多可扩展?WordPress作为大型网站的CMS有多可扩展?May 12, 2025 am 12:08 AM

WordPressCanHandLeLArgeWebsitesWithCareFulplanningAndOptimization.1)USECACHINGTOREDUCESERVERVERLOAD.2)优化YourdataBaseRegularly.3)actizeyourdatabaseregularly.3)ackdntododistibutecontent.4))

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能