roles; } public static function get($role){ $data = self::get_all()[$role] ?? []; if($data){ $counts = count_users()['avail_roles']; $data['role'] = $role; $data['capabilities'] = array_keys($data['capabilities']); $data['cap_count'] = count($data['capabilities']); $data['user_count'] = isset($counts[$role]) ? ''.$counts[$role].'' : 0; } return $data; } public static function set($data, $role=''){ $data['capabilities'] = array_filter($data['capabilities']); $data['capabilities'] = array_fill_keys($data['capabilities'], 1); if($role){ remove_role($role); $label = '修改'; }else{ $role = $data['role']; $label = '新建'; } $result = add_role($role, $data['name'], $data['capabilities']); return is_null($result) ? new WP_Error('error', $label.'失败,可能重名或者其他原因。') : $role; } public static function insert($data){ return self::set($data); } public static function update($role, $data){ return self::set($data, $role); } public static function delete($role){ $role == 'administrator' && wp_die('不能删除超级管理员角色。'); return remove_role($role); } public static function reset(){ require_once ABSPATH . 'wp-admin/includes/schema.php'; wpjam_map(self::get_all(), fn($v, $k)=> remove_role($k)); populate_roles(); } public static function query_items($args){ $counts = count_users()['avail_roles']; return array_values(wpjam_map(self::get_all(), fn($v, $k)=> array_merge($v, [ 'role' => $k, 'name' => translate_user_role($v['name']), 'user_count' => isset($counts[$k]) ? ''.$counts[$k].'' : 0, 'cap_count' => count($v['capabilities']), ]))); } public static function map_meta_cap($user_id, $args){ if(isset($args[0]) && $args[0] === 'administrator' && (empty($args[1]) || $args[1] == 'delete')){ return ['do_not_allow']; } return is_multisite() ? ['manage_site'] : ['manage_options']; } public static function get_fields($action_key='', $id=0){ return [ 'role' => ['title'=>'角色', 'type'=>'text', 'show_admin_column'=>true], 'name' => ['title'=>'名称', 'type'=>'text', 'show_admin_column'=>true], 'capabilities' => ['title'=>'权限', 'type'=>'mu-text'], 'user_count' => ['title'=>'用户数', 'type'=>'view', 'show_admin_column'=>'only'], 'cap_count' => ['title'=>'权限', 'type'=>'view', 'show_admin_column'=>'only'], ]; } public static function get_actions(){ return [ 'add' => ['title'=>'新建', 'last'=>true], 'edit' => ['title'=>'编辑'], 'delete' => ['title'=>'删除', 'direct'=>true, 'confirm'=>true, 'bulk'=>true], 'reset' => ['title'=>'重置', 'direct'=>true, 'confirm'=>true, 'overall'=>true] ]; } public static function get_additional($user, $output=''){ $user = is_object($user) ? $user : get_userdata($user); $caps = array_keys(wpjam_filter($user->caps, fn($v, $k)=> $v && !$GLOBALS['wp_roles']->is_role($k))); return $output == 'fields' ? wpjam_fields(['capabilities'=>['title'=>'权限', 'type'=>'mu-text', 'value'=>$caps]]) : $caps; } public static function set_additional($user, $caps){ $user = is_object($user) ? $user : get_userdata($user); $exists = self::get_additional($user); $caps = array_diff($caps, ['manage_sites', 'manage_options']); wpjam_map(array_diff($exists, $caps), fn($cap)=> $user->remove_cap($cap)); wpjam_map(array_diff($caps, $exists), fn($cap)=> $user->add_cap($cap)); } public static function builtin_page_load(){ current_user_can(is_multisite() ? 'manage_sites' : 'manage_options') && wpjam_hooks([ ['additional_capabilities_display', false], ['show_user_profile, edit_user_profile', fn($user)=> wpjam_echo('

额外权限

'.self::get_additional($user, 'fields'))], ['personal_options_update, edit_user_profile_update', fn($v)=> add_action($v, fn($id)=> self::set_additional($id, $_POST['capabilities'] ?? []))] ]); } } function wpjam_get_additional_capabilities($user){ return WPJAM_Role::get_additional($user); } function wpjam_set_additional_capabilities($user, $caps){ return WPJAM_Role::set_additional($user, $caps); } if(is_admin()){ wpjam_add_menu_page('roles', [ 'plugin_page' => 'wpjam-user', 'tab_slug' => 'roles', 'title' => '角色管理', 'order' => 8, 'capability' => 'edit_roles', 'model' => 'WPJAM_Role', 'function' => 'list', 'list_table' => ['singular'=>'role', 'plural'=>'roles', 'primary_key'=>'role'] ]); wpjam_add_admin_load([ 'base' => ['user-edit', 'profile'], 'model' => 'WPJAM_Role' ]); }