自定义用户角色是否具有任何默认功能?

时间:2017-04-04 作者:iyrin

使用添加新用户角色时add_role(), 默认情况下,是否有属于角色(或角色允许)的功能?

可以在不定义任何功能的情况下创建角色。数据库中将没有为此角色设置任何功能。但是,您可以通过在创建角色时将功能设置为false来明确拒绝功能。

$capabilities
(数组)(可选)功能列表,例如数组(\'edit\\u posts\'=>true,\'delete\\u posts\'=>false);

我看到过这样的例子,但我想知道,除非WordPress假设新创建的角色具有某些功能,否则为什么这是必要的,除非另有排除。

例如,是否假设所有角色都具有read 功能,除非明确排除该功能?我可以使用get_role( $new_role )->capabilities; 获取显式设置的功能列表,但这并不能回答我关于WordPress如何处理新角色的问题。如果没有为新角色显式设置功能,则返回空。

我必须排除我不希望角色拥有的所有功能,还是WordPress假定所有功能都为false,直到它们设置为true?

编辑:这个问题的灵感来自an example 在开发人员站点上,将创建角色时的功能设置为false。我不明白为什么这是必要的。

$result = add_role(
    \'guest_author\',
    __( \'Guest Author\', \'testdomain\' ),
    array(
        \'read\'         => true,  // true allows this capability
        \'edit_posts\'   => true,
        \'delete_posts\' => false, // Use false to explicitly deny
    )
);

3 个回复
最合适的回答,由SO网友:iyrin 整理而成

我发现WordPresshas_cap() 函数,这些函数依赖于user_can()current_user_can, 对于空功能,显式返回false。

示例:如果功能作为参数传递,请使用current_user_can(), 此功能将把功能传递给has_cap() 并返回结果:

    return call_user_func_array( array( $current_user, \'has_cap\' ), $args
has_cap() 如果请求的功能不存在或值为false,将返回false:

foreach ( (array) $caps as $cap ) {
    if ( empty( $capabilities[ $cap ] ) )
        return false;
}
这是因为empty() 函数在任何一种情况下都返回true。

如果变量不存在或其值等于FALSE,则认为该变量为空。

除非我对这些函数的工作原理有误解,否则可以肯定地说no default capabilities are attributed to a new role unless explicitly set to true. 没有必要explicitly deny 使用创建新角色时的功能add_role() 我看不出有什么理由这么做。如果未列出某项功能,则用户将无法获得该功能。

SO网友:mmm

使用默认值(空数组),没有向角色添加任何功能(甚至read) 他们无法访问仪表板

然后,您可以使用以下代码创建角色:

add_role("on_the_door", "User with no access");
您可以使用此插件查看角色的功能:
https://wordpress.org/plugins/user-role-editor/

SO网友:Mark Kaplun

这是一种误导性的方式来看待wordpress功能是如何工作的。本质上,没有包含所有功能的结构,所有这些都归结为开发人员为has_cap 作用与核心相关的能力有一个核心结构,但这确实是可以做的事情的子集。

功能系统有一个默认值,管理员拥有所有功能,没有其他关于任何其他用户的假设。

因此,讨论应该是关于特定的能力,而不是关于一些一般的能力概念。

现在,当关注核心功能时,传统的做法是,无论存储功能的价值如何false 意味着用户不具备该能力,因此空存储应该意味着用户没有核心能力(也没有其他能力,但这些能力可能不依赖于核心能力结构)。

但重要的是要记住,功能只是一个API,代码不必使用API,因此,当您特别询问“具有空功能的用户将具有读取功能”时,这在很大程度上取决于特性的开发人员如何看待这种功能。例如,我可以看到对仪表板的访问可能是无条件的,并且可以在默认情况下访问自己的配置文件。更极端的是,据我所知,几乎没有主题在授予对前端内容的访问权限之前实现功能检查,因此,摆弄“读取”风格的功能是没有意义的。

相关推荐

正在尝试获取wp-includes/capabilities.php中非对象的属性

在调试中,我每分钟都会收到以下通知序列。日志:[23-Oct-2012 13:27:33 UTC] PHP Notice: Trying to get property of non-object in mysite/wp-includes/capabilities.php on line 1022 [23-Oct-2012 13:27:33 UTC] PHP Notice: Trying to get property of non-object in mysite/wp-includes/