向超级管理员添加功能

时间:2013-01-17 作者:shea

我正在开发一个使用自定义功能的插件。其中一些功能需要添加到所有超级管理员用户中。目前,我正在使用以下代码:

$supers = get_super_admins();
foreach ( $supers as $admin ) {
    $user = new WP_User( 0, $admin );
    $user->add_cap( \'my_cap\' );
    $user->add_cap( \'my_second_cap\' );
}
然而,我担心的是,这段代码只是向单个用户添加功能,而不是像我通常所做的那样添加角色。如果创建了一个新的超级管理员,他们将没有这些功能,因为此功能仅在插件激活时运行。

有没有更好的方法向超级管理员添加自定义功能?

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

虽然这没有很好的文档记录,“超级管理员”不是一个角色(因为它不是实际的角色对象)。这更像是一种特殊的“身份”。

超级管理员(也称为“网络管理员”或“站点管理员”)的用户列表存储在名为site_admins. 一般来说,向管理员角色添加一个功能就足够了,因为超级管理员实际上也是管理员角色的成员,拥有所有的功能。

也就是说,如果您特别需要只向超级管理员(而不是“普通”管理员)添加功能,那么最好只使用WordPress的is_super_admin() 函数而不是使用功能,因为假定超级管理员没有任何限制。

如果确实需要使用功能,则应使用grant_super_adminremove_super_admin 钩子可以在超级管理员用户的超级管理员状态更改时(分别)向超级管理员用户添加或从超级管理员用户中删除功能。

现在,就更改现有超级管理员用户的功能而言,您的方法是最好的……获取一个超级管理员用户列表,循环浏览,并为每个超级管理员用户添加功能(尽管如果使用上述挂钩,只需运行一次)。

SO网友:Lucas Bustamante

这取决于它是单站点还是多站点。

Multisite:

超级管理员拥有所有功能,除非明确拒绝。从核心class-wp-user.php::has_cap:

if ( is_multisite() && is_super_admin( $this->ID ) ) {
    if ( in_array( \'do_not_allow\', $caps ) ) {
        return false;
    }
    return true;
}

Single site

无法在单个站点上添加超级管理员。从核心capabilities.php::grant_super_admin():

function grant_super_admin( $user_id ) {
    if ( isset( $GLOBALS[\'super_admins\'] ) || ! is_multisite() ) {
        return false;
    }
如果出于某种原因,用户在单个站点上具有超级管理员状态,则不会改变用户所具有的功能。

SO网友:Mike Madern

要做的事情:

获取作者角色

function add_theme_caps() {
    // gets the author role
    $role = get_role( \'author\' );

    // This only works, because it accesses the class instance.
    // would allow the author to edit others\' posts for current theme only
    $role->add_cap( \'edit_others_posts\' ); 
}

add_action( \'admin_init\', \'add_theme_caps\');
上面的代码是Function Reference/add_cap.

结束

相关推荐

在插件中对MultiSite使用Add_Option而不是Add_Blog_Option有什么错

我正在开发一个新插件,但这是我第一次保存它,它将把一个选项保存到数据库中。目前我正在使用add_option 我假设,-激活会失败,或者-将错误的值保存到wp_blogID_options表中因为我没有使用add_blog_option. 所有的posts / 我读过的文献(Wrox、Apress等)说我需要习惯add_blog_option. 但我所有的测试(和检查SQL表)都证明我错了。所以在制作插件(可以是单点安装或多站点安装)时,使用add\\u选项而不是add\\u blog\\u选项有什么错