justintadlock / members
一个用户和角色管理插件,让您完全控制您站点的权限。此插件允许您编辑角色及其功能,克隆现有角色,为每个用户分配多个角色,阻止帖子内容,甚至使您的站点完全私密。
Requires
- php: >=5.3.0
- composer/installers: ^1.0
README
Members是一个扩展您对博客控制的插件。它是一个用户、角色和功能管理插件,旨在使WordPress成为一个更强大的CMS。
它通过提供WordPress强大角色和功能系统的用户界面(UI),使您控制站点的权限,该系统传统上只对了解如何手动编码的开发者开放。
插件功能
- 角色管理器:允许您编辑、创建和删除角色及其功能。
- 多用户角色:给任何用户分配一个、两个甚至更多角色。
- 明确拒绝功能:拒绝特定用户角色的特定功能。
- 克隆角色:通过克隆现有角色来创建新的角色。
- 内容权限:控制哪些用户(按角色)可以访问帖子内容。
- 短代码:控制谁可以访问内容的短代码。
- 小部件:登录表单小部件和用户小部件,可以在您主题的侧边栏中显示。
- 私有站点:如果您想的话,可以使您的站点及其源完全私密。
专业支持
如果您需要从我,插件作者那里获取专业的插件支持,您可以访问Theme Hybrid的支持论坛,这是一个专业的WordPress帮助/支持网站,我在那里为75,000+用户(并且还在增长)的社区处理所有插件和主题的支持。
版权和许可
该项目根据GNU GPL,版本2或更高版本进行许可。
2009-2018 © Justin Tadlock。
文档
用户、角色和功能之间的关系
这是理解此插件最重要的内容。它如此重要,以至于我花了时间写了一篇完整的教程来理解这一点: WordPress中的用户、角色和功能。如果您不理解这个概念,您就不会理解此插件的功能。这不是插件创建的概念。这是WordPress中的操作方式。
我强烈建议阅读那篇博客文章,但以下是简短版本
- 用户是在您的网站上注册的人。我相信您已经知道了这一点。在WordPress中,用户会被分配一个特定的角色。这个角色定义了用户可以/不可以做什么。
- 角色是一种将用户分组的方式。您的网站上每个用户都会有一个特定的角色。角色是一组能力。重要的是要注意,角色不是分层的。例如,在WordPress中,“管理员”并不比“订阅者”更高。您甚至可以给“订阅者”角色赋予比“管理员”角色更多的能力。理解这个概念非常重要。
- 能力为角色赋予意义。它是一个权限系统。它们是表示一个角色可以做某事或一个角色不可以做某事(例如,角色A可以
edit_posts
,角色B不能activate_plugins
等)的方式。
如何使用插件
此插件配置为具有基于组件的系统。原因是我不想让每个人都使用一大堆他们不需要的功能。如果您只需要登录小工具和一些简码,那么使用“角色管理器”功能就没有意义。因此,它是一个按需使用的系统。
要激活某些功能,请在WordPress管理员中的“设置”菜单下找到“成员”链接。当您在新页面上时,您将能够选择您想要使用的功能。
我建议至少激活“角色管理器”功能。这是该插件的核心,许多其他功能可能需要以某种形式使用它。
角色管理
角色管理器功能允许您编辑和添加新角色,以及添加和从角色中删除默认能力和自定义能力。这是一个功能强大的系统。
您使用此功能对用户和角色所做的任何更改都是永久性的更改。我的意思是,如果您禁用或卸载此插件,更改将不会恢复到之前的状态。此插件仅提供用户界面,让您可以直接更改WordPress数据库。请明智地使用此功能。
编辑/添加角色
这个功能既可以是祝福,也可以是诅咒,所以我要求您明智地使用它。在分配新能力给角色时,请极为谨慎。例如,您不希望授予普通用户edit_plugins
能力。
您可以在“用户”菜单下找到此功能的设置页面。它将被标记为“角色”。当点击菜单项时,您将被带到类似于编辑帖子/页面屏幕的屏幕,只是它是用于编辑角色的。
在该屏幕上的“编辑能力”框中,您只需勾选要授予或拒绝的能力旁边的复选框。
授予、拒绝或都不
每个能力都可以为角色有三种“状态”。角色可以是授予、拒绝,或者根本不具备该能力。
- 授予一个能力给角色意味着该角色的用户将有权执行给定的能力。
- 拒绝一个能力意味着该角色的用户被明确拒绝权限。
- 既未被授予也未被拒绝能力的角色根本不具备该能力。
注意:当将具有冲突能力(例如,授予 publish_posts
和拒绝 published_posts
能力)的多个角色分配给单个用户时,最好通过成员设置屏幕启用拒绝能力覆盖。这将始终确保拒绝的能力总是覆盖授予的能力。禁用此设置时,WordPress 将根据用户获得的最后一个角色来决定,这可能导致用户角色的极端不一致行为。
拒绝的能力如何工作
假设 超级用户 角色被 授予 以下能力
edit_posts
然后,假设 双重用户 角色被 授予 以下能力
publish_posts
edit_products
现在,进一步假设 用户A 因为你想让他们编辑帖子,所以有 超级用户 角色然而,你还想让 用户A 能够编辑产品,所以分配给他们 双重用户 角色突然,用户A 被授予以下能力
edit_posts
publish_posts
edit_products
由于某种原因,你永远不希望具有 超级用户 角色的用户能够发布帖子。现在你有一个问题。解决这个问题的方法之一是创建一个只包含你想要的能力的第三个角色,并只将这个单一角色授予 用户A。然而,在拥有许多角色的较大网站上,这会变得很繁琐。
相反,你可以明确地 拒绝 对 超级用户 角色的发布帖子能力。当你这样做时,用户A 只被 授予 以下能力
edit_posts
edit_products
并且被拒绝以下能力
publish_posts
多个用户角色
您可以通过转到管理中的编辑用户屏幕并定位“角色”部分来给用户分配多个角色。将会有每个角色的复选框。
您还可以从添加新用户屏幕向用户添加多个角色。
在管理中的“用户”屏幕上,您可以向多个用户批量添加或删除单一角色。
内容权限功能
内容权限功能在帖子编辑屏幕上添加了一个额外的元框。
对于任何公开的帖子类型(帖子、页面等),您将在帖子编辑屏幕上看到“内容权限”元框。此元框允许您选择哪些角色可以查看帖子/页面的内容。如果没有选择角色,任何人都可以查看内容。帖子作者、可以编辑帖子的用户以及具有 restrict_content
能力的任何角色的用户可以 始终 查看帖子,无论他们的角色如何。
您可以为单个帖子添加自定义错误消息。否则,错误消息将默认为您在插件设置下设置的任何内容。
重要提示:此功能仅阻止帖子内容(这是您在帖子编辑器中编写的)、帖子摘要和帖子评论。它不会阻止其他任何内容。
简码
您可以在帖子编辑器或任何简码准备区域中使用以下简码。
[members_access]
[members_access]
简码用于隐藏特定角色和能力的内容。您需要在使用此简码时包裹您的内容
[members_access role="editor"]Hide this content from everyone but editors.[/members_access]
插件接受以下参数(混合和匹配将不会工作)
role
- 单个或以逗号分隔的角色列表。capability
- 单个或以逗号分隔的能力列表。user_name
- 单个或以逗号分隔的用户名列表。user_id
- 单个或以逗号分隔的用户ID列表。user_email
- 单个或以逗号分隔的用户电子邮件地址列表。
参数
capability
:分配给角色的能力。role
:WordPress中的用户角色或您创建的角色。operator
:接受!
来否定角色或能力。
请注意,capability
和role
参数不会一起使用。代码首先检查能力(如果有输入),然后检查角色(如果有输入)。
要检查多个能力或多个角色,只需在每个能力/角色之间添加一个逗号。例如,以下代码检查编辑器或管理员
[members_access role="administrator,editor"]Show this content to administrators or editors only.[/members_access]
检查用户是否没有角色
[members_access role="administrator" operator="!"]Show this content to anyone who is not an administrator.[/members_access]
[members_logged_in]
应使用[members_logged_in]
短代码来检查用户是否当前已登录到网站。如果没有,则内容将隐藏。
[members_logged_in]This content is only shown to logged-in users.[/members_logged_in]
此短代码没有参数。
[members_not_logged_in]
应使用[members_not_logged_in]
短代码来向未登录网站的用户提供内容。如果用户已登录,则内容将隐藏。
[members_not_logged_in]This content is only shown to logged-out visitors.[/members_not_logged_in]
[members_login_form]
[members_login_form]
短代码用于在页面上显示登录表单。
[members_login_form /]
此短代码没有参数。
小部件
小部件组件为您提供了易于使用的小部件。它们可以在任何WordPress小部件区域(由您的主题提供)中使用。目前有登录表单和小部件。
登录表单小部件
登录表单提供登录表单。它是一个文本小部件和登录表单的混合体。它还可以显示您的头像。
用户小部件
用户小部件允许您在任何小部件区域中列出用户。它是基于get_users()
函数的,因此所有参数都相同。
私有网站
私有网站功能确保只有登录用户才能看到您网站上的任何内容。如果用户访问您的网站且未登录,他们将被立即重定向到您的wp-login.php
(WordPress登录)页面。
您还可以选择禁用查看内容源和为内容源设置错误消息。
检查当前用户是否有能力
在插件和您的主题模板文件中,您有时可能需要检查当前登录用户是否有执行某事的权限。我们通过使用WordPress函数current_user_can()
来完成此操作。基本格式如下
<?php if ( current_user_can( 'capability_name' ) ) echo 'This user can do something'; ?>
对于更实际的情况,假设您创建了一个名为read_pages
的新能力。那么,您可能想通过添加以下内容来隐藏page.php
模板中的内容
<?php if ( current_user_can( 'read_pages ' ) ) : ?>
<?php the_content(); ?>
<?php endif; ?>
只有具有read_pages
能力的角色用户才能看到内容。
检查用户是否具有角色
在开始之前,我想说明您真的不应该这么做。最好是检查能力。然而,在需要打破规则的时候,您可以这样做
if ( members_user_has_role( $user_id, $role ) )
或者,您可以检查当前用户
if ( members_current_user_has_role( $role ) )
需要旧的用户级别系统吗?
一些插件和主题可能依赖于WordPress中的旧用户级别系统。这些在WordPress版本2.1中被弃用,不应再使用。WordPress仍然对这些提供有限的向后兼容支持,但我强烈建议如果正在使用用户级别,请联系您的主题/插件作者。
默认情况下,级别不会显示。它们仍然存在,但隐藏在幕后。虽然不建议,但如果需要控制谁有什么级别(级别只是能力),请将其添加到您的插件或主题的 functions.php
add_filter( 'members_remove_old_levels', '__return_false' );
注册能力
如果您是拥有自定义能力的插件开发者,从Members的2.0.0版本开始,您可以将能力注册到Members中。本质上,这允许用户以格式良好、易于阅读的文本形式(例如,发布文章
而不是 publish_posts
)查看您的能力。这也意味着它可以进行翻译,以便非英语使用者更容易理解。
add_action( 'members_register_caps', 'th_register_caps' );
function th_register_caps() {
members_register_cap(
'your_cap_name',
array(
'label' => __( 'Your Capability Label', 'example-textdomain' ),
'group' => 'example'
)
);
}
参数 group
不是必需的,但它允许您将能力分配给能力组。
注册能力组
Members将能力分组,以便用户在编辑角色时更容易找到它们。如果您的插件有多个能力,您应该考虑创建自定义能力组。
add_action( 'members_register_cap_groups', 'th_register_cap_groups' );
function th_register_cap_groups() {
members_register_cap_group(
'your_group_name',
array(
'label' => __( 'Your Group Label', 'example-textdomain' ),
'caps' => array(),
'icon' => 'dashicons-admin-generic',
'priority' => 10
)
);
}
数组参数为
label
- 您组的国际化文本标签。caps
- 要添加到您组中的初始能力数组。icon
- 核心WP的 dashicons 之一或自定义类(在这种情况下需要由您的插件进行样式化)。priority
- 您的组与其他组相比的优先级。10
是默认值。
请注意,自定义文章类型会自动作为组注册到Members中。因此,如果您想对它们做些自定义操作,只需在注册自己的组之前注销该组即可。
members_unregister_cap_group( "type-{$post_type}" );