如何使WordPress的“编辑”角色仅列出/查看/添加/编辑具有“作者”角色的用户?

时间:2020-11-27 作者:sariDon

我为wordpress中现有的“编辑器”角色添加了一些额外功能,包括:

function add_uedit_caps() {
    $role = get_role(\'editor\');
    $role->add_cap(\'create_users\');
    $role->add_cap(\'list_users\');
    $role->add_cap(\'add_users\');
    $role->add_cap(\'edit_users\');
}
add_action(\'admin_init\', \'add_uedit_caps\');
这件作品很好。

ISSUE:

以上代码通过“编辑器”列出和查看所有类型的用户。但是,如果“编辑器”添加了新用户,它将使用wordpress中设置的“新用户默认角色”(reference), ie设置中设置的角色>;全体的在用户编辑模式下,也没有可用的角色更改选项。

我希望“编辑器”仅列出/查看/添加/编辑具有“作者”角色的用户。如何通过代码(一个带有动作的方法或类)实现这一点,而不需要任何插件或篡改核心文件?

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

除了问题中的代码外,

1. To display only the author roles in the user list page of editor:

add_action(\'pre_user_query\',\'editors_edit_author_list\');

function editors_edit_author_list($user_search) {
        $user = wp_get_current_user();
        if($user->ID != 1) {
            $user_meta=get_userdata($user->ID);
            //$user_roles= $user_meta->roles;
            global $wpdb;
            if(in_array(\'editor\', $user_meta->roles))
            {
                $user_search->query_where = str_replace(
            \'WHERE 1=1\', 
            "WHERE 1=1 AND {$wpdb->users}.ID IN (
                SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
                    WHERE {$wpdb->usermeta}.meta_key = \'{$wpdb->prefix}capabilities\'
                    AND {$wpdb->usermeta}.meta_value LIKE \'%author%\')", 
            $user_search->query_where
        );
            }
            else
                $user_search->query_where = str_replace(\'WHERE 1=1\', "WHERE 1=1 AND {$wpdb->users}.ID<>1", $user_search->query_where);
        }
    }
<小时/>

2. Make editors only edit the authors:

add_filter(\'editable_roles\', array($this, \'editor_editable_roles\'));

function editor_editable_roles($roles)
    {
        $user = wp_get_current_user();
        $user_meta=get_userdata($user->ID);
        if(in_array(\'editor\', $user_meta->roles)) {
            $tmp = array_keys($roles);
            foreach($tmp as $r) {
                if(\'author\' == $r)
                    continue;
                unset($roles[$r]);
            }
        }
        return $roles;
    }
<小时/>

3. Change the users added by the editor to author role (from the \'new user default role\'):

add_action( \'profile_update\', \'process_editor_added_user\', 10, 1 );
add_action( \'user_register\', \'process_editor_added_user\', 10, 1 );

function process_editor_added_user($user_id)
    {
        $user = wp_get_current_user();
        if($user->ID != $user_id)
        {
            $u = new WP_User($user_id);
            $u->remove_role(\'subscriber\');
            $u->add_role(\'author\');
        }
    }
第#3点有一个替代方案hijacking the default new user role. 我没有对此进行测试:

add_filter(\'pre_option_default_role\', function($default_role){
    return \'author\';
});
似乎就这些了。

相关推荐

Order users by user role

我在团队页面中显示的用户配置文件中有自定义字段。上面写着“主任”、“研究员”、“毕业生”、“实习生”等。添加新团队成员时,可以从带有选项的选择框中进行选择。现在,页面按创建日期顺序显示用户,但我需要按层次顺序显示他们(首先是所有董事,然后是研究人员,然后是毕业生,等等)。配置文件的新字段位于函数中。php,代码如下:<!-- ROLE --> <?php $role = get_user_meta($user->ID, \'member_role\', true)