多站点中的自定义角色问题

时间:2014-04-10 作者:Marco

所以我一直在为自定义角色而苦恼。我将尽可能描述我的问题,以突出我的问题。在任何人提到它之前,我想避免使用插件,因为对我来说,这是对我认为是一个简单问题的过度杀伤力。

我想要的:3个角色-管理员、小管理员、用户

我最初尝试的是:我删除了两个角色Author&;Contributor,离开Administrator、Editor和Subscriber。这没问题。我对下一篇文章有一个问题——重命名其余的角色。

我最初只是做了最常见的建议

global $wp_roles;
$wp_roles->roles[\'editor\'][\'name\'] = \'Lesser Admin\';
$wp_roles->role_names[\'editor\'] = \'Lesser Admin\';
对于最后两个角色(我保持Admin不变,因为它足够接近)。但这不起作用。不管我用什么钩子钩住它(我把它放在下面add_action(\'init\',...) 但这并不奏效。

所以我试着装腔作势,编写了自己的代码来处理这个问题。

function permissionsModification(){
    $blogs = wp_get_sites();
    $current_blog = get_current_blog_id();

    foreach($blogs as $blog):

        switch_to_blog($blog[\'blog_id\']);

        if(get_role(\'author\') !== null)
            remove_role(\'author\');

        if(get_role(\'contributor\') !== null)
            remove_role(\'contributor\');

        $toChange = array(
            \'editor\' => array(\'lesser\', \'Lesser Admin\'), 
            \'subscriber\' => array(\'user\', \'User\')
        );
        foreach($toChange as $old => $new):

            $role = get_role($old);
            if($role !== null):

                if(get_role($new[0]) === null)
                    add_role($new[0], $new[1], $role->capabilities);

                $users = get_users(array(\'role\'=>$old));
                foreach($users as $user):
                    $user->remove_role($old);
                    $user->add_role($new[0]);
                endforeach;

                $opt = get_option(\'default_role\');
                if($opt === $old)
                    set_option(\'default_role\', \'administrator\');

                remove_role($old);
            endif;

        endforeach;

    endforeach;

    switch_to_blog($current_blog);
}
add_action(\'init\',\'permissionsModification\');
好消息是:它确实成功地重命名了角色,旧角色也消失了。

坏消息:一个非常奇怪的错误正在发生。在功能中,到处都会出现“未定义索引:名称”错误。php。我搜索了数据库(具有phpMyAdmin访问权限),发现在其中一个站点中,订阅者角色仍然存在!我认为这可能与默认角色有关,因此由于禁止注册,我将其设置为管理员进行测试,但仍然没有骰子(尽管它确实将其设置为默认角色)。

查看network admin user(网络管理用户)面板会显示一个“空”空间,用于放置角色,如果您检查元素,它的值为subscriber。所以我很确定订阅者角色的名称被删除了,这就是错误的来源。

现在,有趣的部分是,我用print_r 到处都是谜团——订阅者角色确实被删除了。但我不知道它是如何重新加入的。我想知道这是否与这是一个多站点wordpress有关,因为订阅者角色只存在于一个表中。但我仍然有点不知道如何修复它。

任何建议都将不胜感激。

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

所以,多亏了凯撒,我才能够找到答案。我必须做两件事才能做到这一点。

首先,我注意到禁用WP用户化身插件会导致错误消失。我看了看,发现有一个设置被选中“允许订阅者和贡献者编辑他们的头像”取消选中并为每个站点保存会使错误消失。

我必须做的另一件事是,更改不会传递到其他站点(即使错误已经消失),因此我将整个功能从主题移动到了mu plugins文件夹中的插件。这使得它可以一直运行(对于每个站点),因此所有更改都不会出错。

结束

相关推荐

MultiSite Get_Home_url();-获取当前站点的URL

使用多站点时,get\\u home\\u url()的替代品是什么?例如,如果我在多个站点上安装了一个主题,并且在该主题中有需要特定于当前站点的链接。在我的单次安装中,使用get\\u home\\u url();会给我http://domain.com/, 这很好,如果我把主题移到另一个领域,什么都不会受到影响。但是,当我在多站点上使用相同的主题时,get\\u home\\u url();给了我http://domain.com/ 无论我目前在哪个网站上。我需要的是每个域。com/sitename/