问题描述

所以我一直在通过自定义角色进行处理。我会尝试尽可能的描述,以突出我的问题。在任何人提及之前 – 我想避免使用插件,因为对我来说,我认为是一个简单的问题是过分的。

我想要的:3 角色 – 管理员,较小的管理员,用户

我最初尝试的是:我删除了两个角色 Author& 贡献者,离开管理员,编辑和订阅者。这没有问题。我有下一个问题 – 重命名剩下的角色。

我本来只是做了最常见的建议

global $wp_roles;
$wp_roles->roles['editor']['name'] = 'Lesser Admin';
$wp_roles->role_names['editor'] = 'Lesser 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');

好消息:它确实成功地重命名了角色,老角色已经消失了。

坏消息:发生了一个非常奇怪的错误。我在 Capabilities.php 到处都有 「Undefined Index:Name」 错误。我搜索数据库 (有 phpMyAdmin 访问),并发现在其中一个站点 – 订户角色仍然存在!我认为这可能与默认角色有关,因此,由于注册被禁止,我将其设置为管理员进行测试,但仍然没有骰子 (尽管它确实将其设置为默认角色) 。

查看网络管理员用户面板显示一个”empty” 空间,角色应该在哪里,如果您检查该元素,则该值具有值订阅者。所以我很确定用户角色的名字被删除,这是错误来自哪里。

现在,有趣的部分 – 我随身穿过这个代码,print_r 随处可见,用户角色确实被删除了。但是我不知道它是如何被添加回来的。我不知道这是否与这个多站点 wordpress 的事实有关,因为用户角色只存在于一个表中。但是我仍然有点迷失如何解决它。

任何意见将不胜感激。

最佳解决方案

所以,感谢凯撒,我得到了解。我不得不做两件事来做这个工作。

首先,我注意到禁用 WP 用户头像插件导致错误消失。我看到并意识到已经检查了一个设置,「允许订阅者和贡献者编辑他们的化身」 。取消选中并保存每个站点,使错误消失。

我必须做的另一件事是,改变不会传递到其他网站 (即使错误消失),所以我将整个功能从主题转移到 mu-plugins 文件夹中的插件。这使得它一直运行 (对于每个站点),所以所有的更改都是无错误地发生。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。