HEX
Server: nginx/1.22.1
System: Linux VM-16-9-centos 3.10.0-1160.99.1.el7.x86_64 #1 SMP Wed Sep 13 14:19:20 UTC 2023 x86_64
User: www (1001)
PHP: 7.3.31
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/softfox.com.cn/wp-content/plugins/wpjam-basic/extends/wpjam-roles.php
<?php
/*
Name: 用户角色
URI: https://mp.weixin.qq.com/s/NOOjbhtg6l4YhXGYZ9lBWg
Description: 用户角色管理,以及用户额外权限设置。
Version: 1.0
*/
class WPJAM_Role{
	public static function get_all(){
		return $GLOBALS['wp_roles']->roles;
	}

	public static function get($role){
		$roles	= self::get_all();
		$data	= $roles[$role] ?? [];

		$user_counts	= count_users();
		$user_counts	= $user_counts['avail_roles'];

		if($data){
			$data['role']			= $role;
			$data['capabilities']	= array_keys($data['capabilities']);
			$data['cap_count']		= count($data['capabilities']);
			$data['user_count']		= isset($user_counts[$role]) ? '<a href="'.admin_url('users.php?role='.$role).'">'.$user_counts[$role].'</a>' : 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){
		if($role == 'administrator'){
			wp_die('不能删除超级管理员角色。');
		}

		return remove_role($role);
	}

	public static function reset(){
		require_once ABSPATH . 'wp-admin/includes/schema.php';

		foreach(self::get_all() as $role => $data){
			remove_role($role);
		}

		populate_roles();
	}

	public static function query_items($args){
		$items	= [];

		$user_counts	= count_users();
		$user_counts	= $user_counts['avail_roles'];

		foreach(self::get_all() as $key => $role){
			$role['role']		= $key;
			$role['name']		= translate_user_role($role['name']);
			$role['user_count']	= isset($user_counts[$key]) ? '<a href="'.admin_url('users.php?role='.$key).'">'.$user_counts[$key].'</a>' : 0;
			$role['cap_count']	= count($role['capabilities']);

			$items[]	= $role;
		}

		return ['items'=>$items, 'totla'=>count($items)];
	}

	public static function capability_callback($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_capabilities($user){
		$caps	= [];

		foreach($user->caps as $cap => $value){
			if($value && !$GLOBALS['wp_roles']->is_role($cap)){
				$caps[]	= $cap;
			}
		}

		return $caps;
	}

	public static function set_additional_capabilities($user, $caps){
		$caps		= array_diff($caps, ['manage_sites', 'manage_options']);
		$current	= self::get_additional_capabilities($user);
		$removed	= array_diff($current, $caps);
		$added		= array_diff($caps, $current);

		if($removed){
			foreach($removed as $cap){
				$user->remove_cap($cap);
			}
		}

		if($added){
			foreach($added as $cap){
				$user->add_cap($cap);
			}
		}

		return $caps;
	}

	public static function get_list_table(){
		return [
			'singular'		=> 'wpjam-role',
			'plural'		=> 'wpjam-roles',
			'primary_key'	=> 'role',
			'capability'	=> 'edit_roles',
			'model'			=> self::class,
		];
	}

	public static function on_user_profile($profileuser){
		$caps	= self::get_additional_capabilities($profileuser);

		echo '<h3>额外权限</h3>';

		echo wpjam_fields(['capabilities'=> ['title'=>'权限',	'type'=>'mu-text',	'value'=>$caps]]);
	}

	public static function on_user_profile_update($user_id){
		$user	= get_userdata($user_id);
		$caps	= wpjam_get_post_parameter('capabilities',	['default'=>[]]);
		$caps	= array_diff($caps, ['manage_sites', 'manage_options']);

		self::set_additional_capabilities($user, $caps);
	}

	public static function builtin_page_load($screen_base){
		add_filter('additional_capabilities_display', '__return_false' );

		$capability	= is_multisite() ? 'manage_sites' : 'manage_options';

		if(current_user_can($capability)){
			add_action('show_user_profile',			[self::class, 'on_user_profile']);
			add_action('edit_user_profile',			[self::class, 'on_user_profile']);
			add_action('personal_options_update',	[self::class, 'on_user_profile_update']);
			add_action('edit_user_profile_update',	[self::class, 'on_user_profile_update']);
		}
	}
}

function wpjam_get_additional_capabilities($user){
	return WPJAM_Role::get_additional_capabilities($user);
}

function wpjam_set_additional_capabilities($user, $caps){
	return WPJAM_Role::set_additional_capabilities($user, $caps);
}

if(is_admin()){
	wpjam_add_menu_page('roles', [
		'parent'		=> 'users',
		'menu_title'	=> '角色管理',
		'order'			=> 8,
		'function'		=> 'list',
		'list_table'	=> 'WPJAM_Role',
		'capability'	=> 'edit_roles',
		'map_meta_cap'	=> ['WPJAM_Role', 'capability_callback']
	]);

	wpjam_add_admin_load([
		'base'	=> ['user-edit', 'profile'], 
		'model'	=> 'WPJAM_Role' 
	]);
}