首页 > CMS教程 > &#&按 > 掌握WordPress角色和功能

掌握WordPress角色和功能

Christopher Nolan
发布: 2025-02-16 11:49:08
原创
353 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板