This repository has been archived on 2026-10-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
aktiv-web/wp-content/plugins/user-role-editor/includes/class-ure-lib.php
T
2014-11-20 21:01:19 +01:00

2519 lines
91 KiB
PHP

<?php
/*
* Stuff specific for User Role Editor WordPress plugin
* Author: Vladimir Garagulya
* Author email: vladimir@shinephp.com
* Author URI: http://shinephp.com
*
*/
/**
* This class contains general stuff for usage at WordPress plugins
*/
class Ure_Lib extends Garvs_WP_Lib {
public $roles = null;
public $notification = ''; // notification message to show on page
public $apply_to_all = 0;
public $user_to_check = array(); // cached list of user IDs, who has Administrator role
protected $capabilities_to_save = null;
protected $current_role = '';
protected $wp_default_role = '';
protected $current_role_name = '';
protected $user_to_edit = '';
protected $show_deprecated_caps = false;
protected $caps_readable = false;
protected $hide_pro_banner = false;
protected $full_capabilities = false;
protected $ure_object = 'role'; // what to process, 'role' or 'user'
public $role_default_html = '';
protected $role_to_copy_html = '';
protected $role_select_html = '';
protected $role_delete_html = '';
protected $capability_remove_html = '';
protected $advert = null;
/** class constructor
*
* @param string $option_name
*
*/
public function __construct($options_id) {
parent::__construct($options_id);
}
// end of __construct()
/**
* Is this the Pro version?
* @return boolean
*/
public function is_pro() {
return false;
}
// end of is_pro()
/**
* get options for User Role Editor plugin
* User Role Editor stores its options at the main blog/site only and applies them to the all network
*
*/
protected function init_options($options_id) {
global $wpdb;
if ($this->multisite) {
if ( ! function_exists( 'is_plugin_active_for_network' ) ) { // Be sure the function is defined before trying to use it
require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
}
$this->active_for_network = is_plugin_active_for_network(URE_PLUGIN_BASE_NAME);
}
$current_blog = $wpdb->blogid;
if ($this->multisite && $current_blog!=$this->main_blog_id) {
if ($this->active_for_network) { // plugin is active for whole network, so get URE options from the main blog
switch_to_blog($this->main_blog_id);
}
}
$this->options_id = $options_id;
$this->options = get_option($options_id);
if ($this->multisite && $current_blog!=$this->main_blog_id) {
if ($this->active_for_network) { // plugin is active for whole network, so return back to the current blog
restore_current_blog();
}
}
}
// end of init_options()
/**
* saves options array into WordPress database wp_options table
*/
public function flush_options() {
global $wpdb;
$current_blog = $wpdb->blogid;
if ($this->multisite && $current_blog!==$this->main_blog_id) {
if ($this->active_for_network) { // plugin is active for whole network, so get URE options from the main blog
switch_to_blog($this->main_blog_id); // in order to save URE options to the main blog
}
}
update_option($this->options_id, $this->options);
if ($this->multisite && $current_blog!==$this->main_blog_id) {
if ($this->active_for_network) { // plugin is active for whole network, so return back to the current blog
restore_current_blog();
}
}
}
// end of flush_options()
public function get_main_blog_id() {
return $this->main_blog_id;
}
/**
* return key capability to have access to User Role Editor Plugin
*
* @return string
*/
public function get_key_capability() {
if (!$this->multisite) {
$key_capability = URE_KEY_CAPABILITY;
} else {
$enable_simple_admin_for_multisite = $this->get_option('enable_simple_admin_for_multisite', 0);
if ( (defined('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE') && URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE == 1) ||
$enable_simple_admin_for_multisite) {
$key_capability = URE_KEY_CAPABILITY;
} else {
$key_capability = 'manage_network_users';
}
}
return $key_capability;
}
// end of get_key_capability()
/**
* return front-end according to the context - role or user editor
*/
public function editor() {
if (!$this->editor_init0()) {
$this->show_message(esc_html__('Error: wrong request', 'URE'));
return false;
}
$this->process_user_request();
$this->editor_init1();
$this->show_editor();
}
// end of editor()
protected function advertisement() {
if (!$this->is_pro()) {
$this->advert = new ure_Advertisement();
$this->advert->display();
}
}
// end of advertisement()
protected function output_role_edit_dialogs() {
?>
<script language="javascript" type="text/javascript">
var ure_current_role = '<?php echo $this->current_role; ?>';
var ure_current_role_name = '<?php echo $this->current_role_name; ?>';
</script>
<!-- popup dialogs markup -->
<div id="ure_add_role_dialog" class="ure-modal-dialog" style="padding: 10px;">
<form id="ure_add_role_form" name="ure_add_role_form" method="POST">
<div class="ure-label"><?php esc_html_e('Role name (ID): ', 'ure'); ?></div>
<div class="ure-input"><input type="text" name="user_role_id" id="user_role_id" size="25"/></div>
<div class="ure-label"><?php esc_html_e('Display Role Name: ', 'ure'); ?></div>
<div class="ure-input"><input type="text" name="user_role_name" id="user_role_name" size="25"/></div>
<div class="ure-label"><?php esc_html_e('Make copy of: ', 'ure'); ?></div>
<div class="ure-input"><?php echo $this->role_to_copy_html; ?></div>
</form>
</div>
<div id="ure_rename_role_dialog" class="ure-modal-dialog" style="padding: 10px;">
<form id="ure_rename_role_form" name="ure_rename_role_form" method="POST">
<div class="ure-label"><?php esc_html_e('Role name (ID): ', 'ure'); ?></div>
<div class="ure-input"><input type="text" name="ren_user_role_id" id="ren_user_role_id" size="25" disabled /></div>
<div class="ure-label"><?php esc_html_e('Display Role Name: ', 'ure'); ?></div>
<div class="ure-input"><input type="text" name="ren_user_role_name" id="ren_user_role_name" size="25"/></div>
</form>
</div>
<div id="ure_delete_role_dialog" class="ure-modal-dialog">
<div style="padding:10px;">
<div class="ure-label"><?php esc_html_e('Select Role:', 'ure');?></div>
<div class="ure-input"><?php echo $this->role_delete_html; ?></div>
</div>
</div>
<div id="ure_default_role_dialog" class="ure-modal-dialog">
<div style="padding:10px;">
<?php echo $this->role_default_html; ?>
</div>
</div>
<div id="ure_delete_capability_dialog" class="ure-modal-dialog">
<div style="padding:10px;">
<div class="ure-label"><?php esc_html_e('Delete:', 'ure');?></div>
<div class="ure-input"><?php echo $this->capability_remove_html; ?></div>
</div>
</div>
<div id="ure_add_capability_dialog" class="ure-modal-dialog">
<div style="padding:10px;">
<div class="ure-label"><?php esc_html_e('Capability name (ID): ', 'ure'); ?></div>
<div class="ure-input"><input type="text" name="capability_id" id="capability_id" size="25"/></div>
</div>
</div>
<?php
do_action('ure_dialogs_html');
}
// end of output_role_edit_dialogs()
protected function show_editor() {
$this->show_message($this->notification);
?>
<div class="wrap">
<div id="ure-icon" class="icon32"><br/></div>
<h2><?php _e('User Role Editor', 'ure'); ?></h2>
<div id="poststuff">
<div class="ure-sidebar" >
<?php
$this->advertisement();
?>
</div>
<div class="has-sidebar" >
<form id="ure_form" method="post" action="<?php echo URE_WP_ADMIN_URL . URE_PARENT.'?page=users-'.URE_PLUGIN_FILE;?>" >
<div id="ure_form_controls">
<?php
wp_nonce_field('user-role-editor', 'ure_nonce');
if ($this->ure_object == 'user') {
require_once(URE_PLUGIN_DIR . 'includes/ure-user-edit.php');
} else {
$this->set_current_role();
$this->role_edit_prepare_html();
require_once(URE_PLUGIN_DIR . 'includes/ure-role-edit.php');
}
?>
<input type="hidden" name="action" value="update" />
</div>
</form>
<?php
$this->advertise_pro_version();
if ($this->ure_object == 'role') {
$this->output_role_edit_dialogs();
}
?>
</div>
</div>
</div>
<?php
}
// end of show_editor()
// content of User Role Editor Pro advertisement slot - for direct call
protected function advertise_pro_version() {
if ($this->is_pro()) {
return;
}
?>
<div id="ure_pro_advertisement" style="clear:left;display:block; float: left;">
<a href="http://role-editor.com?utm_source=UserRoleEditor&utm_medium=banner&utm_campaign=Plugins " target="_new" >
<?php
if ($this->hide_pro_banner) {
echo 'User Role Editor Pro: extended functionality, no advertisement - from $29.</a>';
} else {
?>
<img src="<?php echo URE_PLUGIN_URL;?>images/user-role-editor-pro-728x90.jpg" alt="User Role Editor Pro"
title="More functionality and premium support with Pro version of User Role Editor."/>
</a><br />
<label for="ure_hide_pro_banner">
<input type="checkbox" name="ure_hide_pro_banner" id="ure_hide_pro_banner" onclick="ure_hide_pro_banner();"/>&nbsp;Thanks, hide this banner.
</label>
<?php
}
?>
</div>
<?php
}
// end of advertise_pro_version()
// validate information about user we intend to edit
protected function check_user_to_edit() {
if ($this->ure_object == 'user') {
if (!isset($_REQUEST['user_id'])) {
return false; // user_id value is missed
}
$user_id = $_REQUEST['user_id'];
if (!is_numeric($user_id)) {
return false;
}
if (!$user_id) {
return false;
}
$this->user_to_edit = get_user_to_edit($user_id);
if (empty($this->user_to_edit)) {
return false;
}
}
return true;
}
// end of check_user_to_edit()
protected function init_current_role_name() {
if (!isset($this->roles[$_POST['user_role']])) {
$mess = esc_html__('Error: ', 'ure') . esc_html__('Role', 'ure') . ' <em>' . esc_html($_POST['user_role']) . '</em> ' .
esc_html__('does not exist', 'ure');
$this->current_role = '';
$this->current_role_name = '';
} else {
$this->current_role = $_POST['user_role'];
$this->current_role_name = $this->roles[$this->current_role]['name'];
$mess = '';
}
return $mess;
}
// end of init_current_role_name()
/**
* prepare capabilities from user input to save at the database
*/
protected function prepare_capabilities_to_save() {
$this->capabilities_to_save = array();
foreach ($this->full_capabilities as $available_capability) {
$cap_id = str_replace(' ', URE_SPACE_REPLACER, $available_capability['inner']);
if (isset($_POST[$cap_id])) {
$this->capabilities_to_save[$available_capability['inner']] = true;
}
}
}
// end of prepare_capabilities_to_save()
/**
* save changes to the roles or user
* @param string $mess - notification message to the user
* @return string - notification message to the user
*/
protected function permissions_object_update($mess) {
if ($this->ure_object == 'role') { // save role changes to database
if ($this->update_roles()) {
if ($mess) {
$mess .= '<br/>';
}
if (!$this->apply_to_all) {
$mess = esc_html__('Role is updated successfully', 'ure');
} else {
$mess = esc_html__('Roles are updated for all network', 'ure');
}
} else {
if ($mess) {
$mess .= '<br/>';
}
$mess = esc_html__('Error occured during role(s) update', 'ure');
}
} else {
if ($this->update_user($this->user_to_edit)) {
if ($mess) {
$mess .= '<br/>';
}
$mess = esc_html__('User capabilities are updated successfully', 'ure');
} else {
if ($mess) {
$mess .= '<br/>';
}
$mess = esc_html__('Error occured during user update', 'ure');
}
}
return $mess;
}
// end of permissions_object_update()
/**
* Process user request
*/
protected function process_user_request() {
$this->notification = '';
if (isset($_POST['action'])) {
if (empty($_POST['ure_nonce']) || !wp_verify_nonce($_POST['ure_nonce'], 'user-role-editor')) {
echo '<h3>Wrong nonce. Action prohibitied.</h3>';
exit;
}
$action = $_POST['action'];
if ($action == 'reset') {
$this->reset_user_roles();
exit;
} else if ($action == 'add-new-role') {
// process new role create request
$this->notification = $this->add_new_role();
} else if ($action == 'rename-role') {
// process rename role request
$this->notification = $this->rename_role();
} else if ($action == 'delete-role') {
$this->notification = $this->delete_role();
} else if ($action == 'change-default-role') {
$this->notification = $this->change_default_role();
} else if ($action == 'caps-readable') {
if ($this->caps_readable) {
$this->caps_readable = 0;
} else {
$this->caps_readable = 1;
}
set_site_transient( 'ure_caps_readable', $this->caps_readable, 600 );
} else if ($action == 'show-deprecated-caps') {
if ($this->show_deprecated_caps) {
$this->show_deprecated_caps = 0;
} else {
$this->show_deprecated_caps = 1;
}
set_site_transient( 'ure_show_deprecated_caps', $this->show_deprecated_caps, 600 );
} else if ($action == 'hide-pro-banner') {
$this->hide_pro_banner = 1;
$this->put_option('ure_hide_pro_banner', 1);
$this->flush_options();
} else if ($action == 'add-new-capability') {
$this->notification = $this->add_new_capability();
} else if ($action == 'delete-user-capability') {
$this->notification = $this->delete_capability();
} else if ($action == 'roles_restore_note') {
$this->notification = esc_html__('User Roles are restored to WordPress default values. ', 'ure');
} else if ($action == 'update') {
$this->roles = $this->get_user_roles();
$this->init_full_capabilities();
if (isset($_POST['user_role'])) {
$this->notification = $this->init_current_role_name();
}
$this->prepare_capabilities_to_save();
$this->notification = $this->permissions_object_update($this->notification);
} else {
do_action('ure_process_user_request');
} // if ($action
}
}
// end of process_user_request()
protected function set_apply_to_all() {
if (isset($_POST['ure_apply_to_all'])) {
$this->apply_to_all = 1;
} else {
$this->apply_to_all = 0;
}
}
// end of set_apply_to_all()
public function get_default_role() {
$this->wp_default_role = get_option('default_role');
}
// end of get_default_role()
protected function editor_init0() {
$this->caps_readable = get_site_transient('ure_caps_readable');
if (false === $this->caps_readable) {
$this->caps_readable = $this->get_option('ure_caps_readable');
set_site_transient('ure_caps_readable', $this->caps_readable, 600);
}
$this->show_deprecated_caps = get_site_transient('ure_show_deprecated_caps');
if (false === $this->show_deprecated_caps) {
$this->show_deprecated_caps = $this->get_option('ure_show_deprecated_caps');
set_site_transient('ure_caps_readable', $this->caps_readable, 600);
}
$this->hide_pro_banner = $this->get_option('ure_hide_pro_banner', 0);
$this->get_default_role();
// could be sent as by POST, as by GET
if (isset($_REQUEST['object'])) {
$this->ure_object = $_REQUEST['object'];
if (!$this->check_user_to_edit()) {
return false;
}
} else {
$this->ure_object = 'role';
}
$this->set_apply_to_all();
return true;
}
// end of editor_init0()
public function editor_init1() {
if (!isset($this->roles) || !$this->roles) {
// get roles data from database
$this->roles = $this->get_user_roles();
}
$this->init_full_capabilities();
if (!$this->is_pro()) {
require_once(URE_PLUGIN_DIR . 'includes/class-advertisement.php');
}
}
// end of editor_init1()
/**
* return id of role last in the list of sorted roles
*
*/
protected function get_last_role_id() {
// get the key of the last element in roles array
$keys = array_keys($this->roles);
$last_role_id = array_pop($keys);
return $last_role_id;
}
// end of get_last_role_id()
/**
* Check if user has "Administrator" role assigned
*
* @global wpdb $wpdb
* @param int $user_id
* @return boolean returns true is user has Role "Administrator"
*/
public function has_administrator_role($user_id) {
global $wpdb;
if (empty($user_id) || !is_numeric($user_id)) {
return false;
}
$table_name = (!$this->multisite && defined('CUSTOM_USER_META_TABLE')) ? CUSTOM_USER_META_TABLE : $wpdb->usermeta;
$meta_key = $wpdb->prefix . 'capabilities';
$query = "SELECT count(*)
FROM $table_name
WHERE user_id=$user_id AND meta_key='$meta_key' AND meta_value like '%administrator%'";
$has_admin_role = $wpdb->get_var($query);
if ($has_admin_role > 0) {
$result = true;
} else {
$result = false;
}
// cache checking result for the future use
$this->lib->user_to_check[$user_id] = $result;
return $result;
}
// end of has_administrator_role()
/**
* Checks if user is allowed to user User Role Editor
*
* @global int $current_user
* @param int $user_id
* @return boolean true
*/
public function user_is_admin($user_id = false) {
global $current_user;
$ure_key_capability = $this->get_key_capability();
if (empty($user_id)) {
$user_id = $current_user->ID;
}
$result = user_can($user_id, $ure_key_capability);
return $result;
}
// end of user_is_admin()
/**
* return array with WordPress user roles
*
* @global WP_Roles $wp_roles
* @global type $wp_user_roles
* @return array
*/
public function get_user_roles() {
global $wp_roles;
if (!isset($wp_roles)) {
$wp_roles = new WP_Roles();
}
if (function_exists('bbp_filter_blog_editable_roles')) { // bbPress plugin is active
$this->roles = bbp_filter_blog_editable_roles($wp_roles->roles); // exclude bbPress roles
$bbp_full_caps = bbp_get_caps_for_role(bbp_get_keymaster_role());
// exclude capabilities automatically added by bbPress bbp_dynamic_role_caps() and not bbPress related: read, level_0, all s2Member levels, e.g. access_s2member_level_0, etc.
$built_in_wp_caps = $this->get_built_in_wp_caps();
$bbp_only_caps = array();
foreach ($bbp_full_caps as $bbp_cap => $val) {
if (isset($built_in_wp_caps[$bbp_cap]) || substr($bbp_cap, 0, 15) == 'access_s2member') {
continue;
}
$bbp_only_caps[$bbp_cap] = $val;
}
// remove bbPress dynamically created capabilities from WordPress persistent roles in order to not save them to database with any role update
$cap_removed = false;
foreach ($bbp_only_caps as $bbp_cap => $val) {
foreach ($this->roles as &$role) {
if (isset($role['capabilities'][$bbp_cap])) {
unset($role['capabilities'][$bbp_cap]);
$cap_removed = true;
}
}
}
} else {
$this->roles = $wp_roles->roles;
}
if (is_array($this->roles) && count($this->roles) > 0) {
asort($this->roles);
}
return $this->roles;
}
// end of get_user_roles()
/*
// restores User Roles from the backup record
protected function restore_user_roles()
{
global $wpdb, $wp_roles;
$error_message = 'Error! ' . __('Database operation error. Check log file.', 'ure');
$option_name = $wpdb->prefix . 'user_roles';
$backup_option_name = $wpdb->prefix . 'backup_user_roles';
$query = "select option_value
from $wpdb->options
where option_name='$backup_option_name'
limit 0, 1";
$option_value = $wpdb->get_var($query);
if ($wpdb->last_error) {
$this->log_event($wpdb->last_error, true);
return $error_message;
}
if ($option_value) {
$query = "update $wpdb->options
set option_value='$option_value'
where option_name='$option_name'
limit 1";
$record = $wpdb->query($query);
if ($wpdb->last_error) {
$this->log_event($wpdb->last_error, true);
return $error_message;
}
$wp_roles = new WP_Roles();
$reload_link = wp_get_referer();
$reload_link = remove_query_arg('action', $reload_link);
$reload_link = add_query_arg('action', 'roles_restore_note', $reload_link);
?>
<script type="text/javascript" >
document.location = '<?php echo $reload_link; ?>';
</script>
<?php
$mess = '';
} else {
$mess = __('No backup data. It is created automatically before the first role data update.', 'ure');
}
if (isset($_REQUEST['user_role'])) {
unset($_REQUEST['user_role']);
}
return $mess;
}
// end of restore_user_roles()
*/
protected function convert_caps_to_readable($caps_name)
{
$caps_name = str_replace('_', ' ', $caps_name);
$caps_name = ucfirst($caps_name);
return $caps_name;
}
// ure_ConvertCapsToReadable
public function make_roles_backup()
{
global $wpdb;
// check if backup user roles record exists already
$backup_option_name = $wpdb->prefix . 'backup_user_roles';
$query = "select option_id
from $wpdb->options
where option_name='$backup_option_name'
limit 0, 1";
$option_id = $wpdb->get_var($query);
if ($wpdb->last_error) {
$this->log_event($wpdb->last_error, true);
return false;
}
if (!$option_id) {
$roles_option_name = $wpdb->prefix.'user_roles';
$query = "select option_value
from $wpdb->options
where option_name like '$roles_option_name' limit 0,1";
$serialized_roles = $wpdb->get_var($query);
// create user roles record backup
$query = "insert into $wpdb->options
(option_name, option_value, autoload)
values ('$backup_option_name', '$serialized_roles', 'no')";
$record = $wpdb->query($query);
if ($wpdb->last_error) {
$this->log_event($wpdb->last_error, true);
return false;
}
}
return true;
}
// end of ure_make_roles_backup()
protected function role_contains_caps_not_allowed_for_simple_admin($role_id) {
$result = false;
$role = $this->roles[$role_id];
if (!is_array($role['capabilities'])) {
return false;
}
foreach (array_keys($role['capabilities']) as $cap) {
if ($this->block_cap_for_single_admin($cap)) {
$result = true;
break;
}
}
return $result;
}
// end of role_contains_caps_not_allowed_for_simple_admin()
/**
* return array with roles which we could delete, e.g self-created and not used with any blog user
*
* @global wpdb $wpdb - WP database object
* @return array
*/
protected function get_roles_can_delete()
{
global $wpdb;
$table_name = (!$this->multisite && defined('CUSTOM_USER_META_TABLE')) ? CUSTOM_USER_META_TABLE : $wpdb->usermeta;
$meta_key = $wpdb->prefix . 'capabilities';
$default_role = get_option('default_role');
$standard_roles = array('administrator', 'editor', 'author', 'contributor', 'subscriber');
$roles_can_delete = array();
foreach ($this->roles as $key => $role) {
$can_delete = true;
// check if it is default role for new users
if ($key == $default_role) {
$can_delete = false;
continue;
}
// check if it is standard role
if (in_array($key, $standard_roles)) {
continue;
}
// check if role has capabilities prohibited for the single site administrator
if ($this->role_contains_caps_not_allowed_for_simple_admin($key)) {
continue;
}
// check if user with such role exists
$query = "SELECT DISTINCT meta_value
FROM $table_name
WHERE meta_key='$meta_key' AND meta_value like '%$key%'";
$roles_used = $wpdb->get_results($query);
if ($roles_used && count($roles_used > 0)) {
foreach ($roles_used as $role_used) {
$role_name = unserialize($role_used->meta_value);
foreach ($role_name as $key1 => $value1) {
if ($key == $key1) {
$can_delete = false;
break;
}
}
if (!$can_delete) {
break;
}
}
}
if ($can_delete) {
$roles_can_delete[$key] = $role['name'] . ' (' . $key . ')';
}
}
return $roles_can_delete;
}
// end of get_roles_can_delete()
/**
* return array of built-in WP capabilities (WP 3.1 wp-admin/includes/schema.php)
*
* @return array
*/
public function get_built_in_wp_caps() {
$caps = array();
$caps['switch_themes'] = 1;
$caps['edit_themes'] = 1;
$caps['activate_plugins'] = 1;
$caps['edit_plugins'] = 1;
$caps['edit_users'] = 1;
$caps['edit_files'] = 1;
$caps['manage_options'] = 1;
$caps['moderate_comments'] = 1;
$caps['manage_categories'] = 1;
$caps['manage_links'] = 1;
$caps['upload_files'] = 1;
$caps['import'] = 1;
$caps['unfiltered_html'] = 1;
$caps['edit_posts'] = 1;
$caps['edit_others_posts'] = 1;
$caps['edit_published_posts'] = 1;
$caps['publish_posts'] = 1;
$caps['edit_pages'] = 1;
$caps['read'] = 1;
$caps['level_10'] = 1;
$caps['level_9'] = 1;
$caps['level_8'] = 1;
$caps['level_7'] = 1;
$caps['level_6'] = 1;
$caps['level_5'] = 1;
$caps['level_4'] = 1;
$caps['level_3'] = 1;
$caps['level_2'] = 1;
$caps['level_1'] = 1;
$caps['level_0'] = 1;
$caps['edit_others_pages'] = 1;
$caps['edit_published_pages'] = 1;
$caps['publish_pages'] = 1;
$caps['delete_pages'] = 1;
$caps['delete_others_pages'] = 1;
$caps['delete_published_pages'] = 1;
$caps['delete_posts'] = 1;
$caps['delete_others_posts'] = 1;
$caps['delete_published_posts'] = 1;
$caps['delete_private_posts'] = 1;
$caps['edit_private_posts'] = 1;
$caps['read_private_posts'] = 1;
$caps['delete_private_pages'] = 1;
$caps['edit_private_pages'] = 1;
$caps['read_private_pages'] = 1;
$caps['unfiltered_upload'] = 1;
$caps['edit_dashboard'] = 1;
$caps['update_plugins'] = 1;
$caps['delete_plugins'] = 1;
$caps['install_plugins'] = 1;
$caps['update_themes'] = 1;
$caps['install_themes'] = 1;
$caps['update_core'] = 1;
$caps['list_users'] = 1;
$caps['remove_users'] = 1;
$caps['add_users'] = 1;
$caps['promote_users'] = 1;
$caps['edit_theme_options'] = 1;
$caps['delete_themes'] = 1;
$caps['export'] = 1;
$caps['delete_users'] = 1;
$caps['create_users'] = 1;
if ($this->multisite) {
$caps['manage_network'] = 1;
$caps['manage_sites'] = 1;
$caps['create_sites'] = 1;
$caps['manage_network_users'] = 1;
$caps['manage_network_themes'] = 1;
$caps['manage_network_plugins'] = 1;
$caps['manage_network_options'] = 1;
}
return $caps;
}
// end of get_built_in_wp_caps()
/**
* return the array of unused user capabilities
*
* @global WP_Roles $wp_roles
* @global wpdb $wpdb
* @return array
*/
protected function get_caps_to_remove()
{
global $wp_roles;
// build full capabilities list from all roles except Administrator
$full_caps_list = array();
foreach ($wp_roles->roles as $role) {
// validate if capabilities is an array
if (isset($role['capabilities']) && is_array($role['capabilities'])) {
foreach ($role['capabilities'] as $capability => $value) {
if (!isset($full_caps_list[$capability])) {
$full_caps_list[$capability] = 1;
}
}
}
}
$caps_to_exclude = $this->get_built_in_wp_caps();
$caps_to_remove = array();
foreach ($full_caps_list as $capability => $value) {
if (!isset($caps_to_exclude[$capability])) { // do not touch built-in WP caps
// check roles
$cap_in_use = false;
foreach ($wp_roles->role_objects as $wp_role) {
if ($wp_role->name != 'administrator') {
if ($wp_role->has_cap($capability)) {
$cap_in_use = true;
break;
}
}
}
if (!$cap_in_use) {
$caps_to_remove[$capability] = 1;
}
}
}
return $caps_to_remove;
}
// end of get_caps_to_remove()
/**
* Build HTML for select drop-down list from capabilities we can remove
*
* @return string
*/
protected function get_caps_to_remove_html() {
$caps_to_remove = $this->get_caps_to_remove();
if (!empty($caps_to_remove) && is_array($caps_to_remove) && count($caps_to_remove) > 0) {
$html = '<select id="remove_user_capability" name="remove_user_capability" width="200" style="width: 200px">';
foreach ($caps_to_remove as $key => $value) {
$html .= '<option value="' . $key . '">' . $key . '</option>';
}
$html .= '</select>';
} else {
$html = '';
}
return $html;
}
// end of getCapsToRemoveHTML()
/**
* returns array of deprecated capabilities
*
* @return array
*/
protected function get_deprecated_caps()
{
$dep_caps = array(
'level_0' => 0,
'level_1' => 0,
'level_2' => 0,
'level_3' => 0,
'level_4' => 0,
'level_5' => 0,
'level_6' => 0,
'level_7' => 0,
'level_8' => 0,
'level_9' => 0,
'level_10' => 0,
'edit_files' => 0);
if ($this->multisite) {
$dep_caps['unfiltered_html'] = 0;
}
return $dep_caps;
}
// end of get_deprecated_caps()
/**
* Return true if $capability is included to the list of capabilities allowed for the single site administrator
* @param string $capability - capability ID
* @param boolean $ignore_super_admin - if
* @return boolean
*/
protected function block_cap_for_single_admin($capability, $ignore_super_admin=false) {
if (!$this->is_pro()) { // this functionality is for the Pro version only.
return false;
}
if (!$this->multisite) { // work for multisite only
return false;
}
if (!$ignore_super_admin && is_super_admin()) { // Do not block superadmin
return false;
}
$caps_access_restrict_for_simple_admin = $this->get_option('caps_access_restrict_for_simple_admin', 0);
if (!$caps_access_restrict_for_simple_admin) {
return false;
}
$allowed_caps = $this->get_option('caps_allowed_for_single_admin', array());
if (in_array($capability, $allowed_caps)) {
$block_this_cap = false;
} else {
$block_this_cap = true;
}
return $block_this_cap;
}
// end of block_cap_for_single_admin()
/**
* output HTML-code for capabilities list
* @param boolean $core - if true, then show WordPress core capabilities, else custom (plugins and themes created)
* @param boolean $for_role - if true, it is role capabilities list, else - user specific capabilities list
*/
protected function show_capabilities($core = true, $for_role = true) {
if ($this->multisite && !is_super_admin()) {
$help_links_enabled = $this->get_option('enable_help_links_for_simple_admin_ms', 1);
} else {
$help_links_enabled = true;
}
$onclick_for_admin = '';
if (!( $this->multisite && is_super_admin() )) { // do not limit SuperAdmin for multi-site
if ($core && 'administrator' == $this->current_role) {
$onclick_for_admin = 'onclick="turn_it_back(this)"';
}
}
if ($core) {
$quant = count($this->get_built_in_wp_caps());
$deprecated_caps = $this->get_deprecated_caps();
} else {
$quant = count($this->full_capabilities) - count($this->get_built_in_wp_caps());
$deprecated_caps = array();
}
$quant_in_column = (int) $quant / 3;
$printed_quant = 0;
foreach ($this->full_capabilities as $capability) {
if ($core) {
if (!$capability['wp_core']) { // show WP built-in capabilities 1st
continue;
}
} else {
if ($capability['wp_core']) { // show plugins and themes added capabilities
continue;
}
}
if (!$this->show_deprecated_caps && isset($deprecated_caps[$capability['inner']])) {
$hidden_class = 'class="hidden"';
} else {
$hidden_class = '';
}
if (isset($deprecated_caps[$capability['inner']])) {
$label_style = 'style="color:#BBBBBB;"';
} else {
$label_style = '';
}
if ($this->multisite && $this->block_cap_for_single_admin($capability['inner'], true)) {
if (is_super_admin()) {
if (!is_network_admin()) {
$label_style = 'style="color: red;"';
}
} else {
$hidden_class = 'class="hidden"';
}
}
$checked = '';
$disabled = '';
if ($for_role) {
if (isset($this->roles[$this->current_role]['capabilities'][$capability['inner']]) &&
!empty($this->roles[$this->current_role]['capabilities'][$capability['inner']])) {
$checked = 'checked="checked"';
}
} else {
if ($this->user_can($capability['inner'])) {
$checked = 'checked="checked"';
if (!isset($this->user_to_edit->caps[$capability['inner']])) {
$disabled = 'disabled="disabled"';
}
}
}
$cap_id = str_replace(' ', URE_SPACE_REPLACER, $capability['inner']);
echo '<div id="ure_div_cap_'. $cap_id.'" '. $hidden_class .'><input type="checkbox" name="' . $cap_id . '" id="' .
$cap_id . '" value="' . $capability['inner'] .'" '. $checked . ' ' . $disabled . ' ' . $onclick_for_admin . '>';
if (empty($hidden_class)) {
if ($this->caps_readable) {
$cap_ind = 'human';
$cap_ind_alt = 'inner';
} else {
$cap_ind = 'inner';
$cap_ind_alt = 'human';
}
$help_link = $help_links_enabled ? $this->capability_help_link($capability['inner']) : '';
echo '<label for="' . $cap_id . '" title="' . $capability[$cap_ind_alt] . '" ' . $label_style . ' > ' .
$capability[$cap_ind] . '</label> ' . $help_link . '</div>';
$printed_quant++;
if ($printed_quant >= $quant_in_column) {
$printed_quant = 0;
echo '</td>
<td style="vertical-align:top;">';
}
} else { // if (empty($hidden_class
echo '</div>';
} // if (empty($hidden_class
}
}
// end of show_capabilities()
/**
* output HTML code to create URE toolbar
*
* @param string $this->current_role
* @param boolean $role_delete
* @param boolean $capability_remove
*/
protected function toolbar($role_delete = false, $capability_remove = false) {
$caps_access_restrict_for_simple_admin = $this->get_option('caps_access_restrict_for_simple_admin', 0);
if ($caps_access_restrict_for_simple_admin) {
$add_del_role_for_simple_admin = $this->get_option('add_del_role_for_simple_admin', 1);
} else {
$add_del_role_for_simple_admin = 1;
}
$super_admin = is_super_admin();
?>
<div id="ure_toolbar" >
<button id="ure_select_all" class="ure_toolbar_button">Select All</button>
<?php
if ('administrator' != $this->current_role) {
?>
<button id="ure_unselect_all" class="ure_toolbar_button">Unselect All</button>
<button id="ure_reverse_selection" class="ure_toolbar_button">Reverse</button>
<?php
}
if ($this->ure_object == 'role') {
?>
<hr />
<div id="ure_update">
<button id="ure_update_role" class="ure_toolbar_button button-primary" >Update</button>
<?php
do_action('ure_role_edit_toolbar_update');
?>
</div>
<?php
if (!$this->multisite || $super_admin || $add_del_role_for_simple_admin) { // restrict single site admin
?>
<hr />
<button id="ure_add_role" class="ure_toolbar_button">Add Role</button>
<button id="ure_rename_role" class="ure_toolbar_button">Rename Role</button>
<?php
} // restrict single site admin
if (!$this->multisite || $super_admin || !$caps_access_restrict_for_simple_admin) { // restrict single site admin
?>
<button id="ure_add_capability" class="ure_toolbar_button">Add Capability</button>
<?php
} // restrict single site admin
if (!$this->multisite || $super_admin || $add_del_role_for_simple_admin) { // restrict single site admin
if (!empty($role_delete)) {
?>
<button id="ure_delete_role" class="ure_toolbar_button">Delete Role</button>
<?php
}
} // restrict single site admin
if (!$this->multisite || $super_admin || !$caps_access_restrict_for_simple_admin) { // restrict single site admin
if ($capability_remove) {
?>
<button id="ure_delete_capability" class="ure_toolbar_button">Delete Capability</button>
<?php
}
?>
<hr />
<button id="ure_default_role" class="ure_toolbar_button">Default Role</button>
<hr />
<div id="ure_service_tools">
<?php
do_action('ure_role_edit_toolbar_service');
if (!$this->multisite ||
(is_main_site( get_current_blog_id()) || (is_network_admin() && is_super_admin()))
) {
?>
<button id="ure_reset_roles" class="ure_toolbar_button" style="color: red;" title="Reset Roles to its original state">Reset</button>
<?php
}
?>
</div>
<?php
} // restrict single site admin
} else {
?>
<hr />
<div id="ure_update_user">
<button id="ure_update_role" class="ure_toolbar_button button-primary">Update</button>
<?php
do_action('ure_user_edit_toolbar_update');
?>
</div>
<?php
}
?>
</div>
<?php
}
// end of toolbar()
/**
* return link to the capability according its name in $capability parameter
*
* @param string $capability
* @return string
*/
protected function capability_help_link($capability) {
if (empty($capability)) {
return '';
}
switch ($capability) {
case 'activate_plugins':
$url = 'http://www.shinephp.com/activate_plugins-wordpress-capability/';
break;
case 'add_users':
$url = 'http://www.shinephp.com/add_users-wordpress-user-capability/';
break;
case 'create_users':
$url = 'http://www.shinephp.com/create_users-wordpress-user-capability/';
break;
case 'delete_others_pages':
case 'delete_others_posts':
case 'delete_pages':
case 'delete_posts':
case 'delete_protected_pages':
case 'delete_protected_posts':
case 'delete_published_pages':
case 'delete_published_posts':
$url = 'http://www.shinephp.com/delete-posts-and-pages-wordpress-user-capabilities-set/';
break;
case 'delete_plugins':
$url = 'http://www.shinephp.com/delete_plugins-wordpress-user-capability/';
break;
case 'delete_themes':
$url = 'http://www.shinephp.com/delete_themes-wordpress-user-capability/';
break;
case 'delete_users':
$url = 'http://www.shinephp.com/delete_users-wordpress-user-capability/';
break;
case 'edit_dashboard':
$url = 'http://www.shinephp.com/edit_dashboard-wordpress-capability/';
break;
case 'edit_files':
$url = 'http://www.shinephp.com/edit_files-wordpress-user-capability/';
break;
case 'edit_plugins':
$url = 'http://www.shinephp.com/edit_plugins-wordpress-user-capability';
break;
case 'moderate_comments':
$url = 'http://www.shinephp.com/moderate_comments-wordpress-user-capability/';
break;
case 'read':
$url = 'http://shinephp.com/wordpress-read-capability/';
break;
case 'update_core':
$url = 'http://www.shinephp.com/update_core-capability-for-wordpress-user/';
break;
default:
$url = '';
}
// end of switch
if (!empty($url)) {
$link = '<a href="' . $url . '" title="read about ' . $capability . ' user capability" target="new"><img src="' .
URE_PLUGIN_URL . 'images/help.png" alt="' . esc_html__('Help', 'ure') . '" /></a>';
} else {
$link = '';
}
return $link;
}
// end of capability_help_link()
/**
* Go through all users and if user has non-existing role lower him to Subscriber role
*
*/
protected function validate_user_roles() {
global $wp_roles;
$default_role = get_option('default_role');
if (empty($default_role)) {
$default_role = 'subscriber';
}
$users_query = new WP_User_Query(array('fields' => 'ID'));
$users = $users_query->get_results();
foreach ($users as $user_id) {
$user = get_user_by('id', $user_id);
if (is_array($user->roles) && count($user->roles) > 0) {
foreach ($user->roles as $role) {
$user_role = $role;
break;
}
} else {
$user_role = is_array($user->roles) ? '' : $user->roles;
}
if (!empty($user_role) && !isset($wp_roles->roles[$user_role])) { // role doesn't exists
$user->set_role($default_role); // set the lowest level role for this user
$user_role = '';
}
if (empty($user_role)) {
// Cleanup users level capabilities from non-existed roles
$cap_removed = true;
while (count($user->caps) > 0 && $cap_removed) {
foreach ($user->caps as $capability => $value) {
if (!isset($this->full_capabilities[$capability])) {
$user->remove_cap($capability);
$cap_removed = true;
break;
}
$cap_removed = false;
}
} // while ()
}
} // foreach()
}
// end of validate_user_roles()
protected function add_capability_to_full_caps_list($cap_id) {
if (!isset($this->full_capabilities[$cap_id])) {
$cap = array();
$cap['inner'] = $cap_id;
$cap['human'] = esc_html__($this->convert_caps_to_readable($cap_id), 'ure');
if (isset($this->built_in_wp_caps[$cap_id])) {
$cap['wp_core'] = true;
} else {
$cap['wp_core'] = false;
}
$this->full_capabilities[$cap_id] = $cap;
}
}
// end of add_capability_to_full_caps_list()
protected function init_full_capabilities() {
$this->built_in_wp_caps = $this->get_built_in_wp_caps();
$this->full_capabilities = array();
foreach ($this->roles as $role) {
// validate if capabilities is an array
if (isset($role['capabilities']) && is_array($role['capabilities'])) {
foreach ($role['capabilities'] as $key => $value) {
$this->add_capability_to_full_caps_list($key);
}
}
}
// Get Gravity Forms plugin capabilities, if available
if (class_exists('GFCommon')) {
$gf_caps = GFCommon::all_caps();
foreach ($gf_caps as $gf_cap) {
$this->add_capability_to_full_caps_list($gf_cap);
}
}
// provide compatibility with plugins and themes which use 'members_get_capabilities' filter from Members plugin to define their capabilities
$custom_caps = array();
$custom_caps = apply_filters( 'members_get_capabilities', $custom_caps );
foreach ($custom_caps as $cap) {
$this->add_capability_to_full_caps_list($cap);
}
if ($this->ure_object=='user') {
foreach($this->user_to_edit->caps as $key=>$value) {
if (!isset($this->roles[$key])) { // it is the user capability, not role
$this->add_capability_to_full_caps_list($key);
}
}
}
foreach ($this->built_in_wp_caps as $cap=>$val) {
if (!isset($this->full_capabilities[$cap])) {
$this->add_capability_to_full_caps_list($cap);
}
}
unset($this->built_in_wp_caps);
asort($this->full_capabilities);
}
// end of init_full_capabilities()
/**
* return WordPress user roles to its initial state, just like after installation
* @global WP_Roles $wp_roles
*/
protected function wp_roles_reinit() {
global $wp_roles;
$wp_roles->roles = array();
$wp_roles->role_objects = array();
$wp_roles->role_names = array();
$wp_roles->use_db = true;
require_once(ABSPATH . '/wp-admin/includes/schema.php');
populate_roles();
$wp_roles->reinit();
$this->roles = $this->get_user_roles();
}
// end of wp_roles_reinit()
/**
* reset user roles to WordPress default roles
*/
protected function reset_user_roles() {
$this->wp_roles_reinit();
if ($this->is_full_network_synch() || $this->apply_to_all) {
$this->current_role = '';
$this->direct_network_roles_update();
}
//$this->validate_user_roles(); // if user has non-existing role lower him to Subscriber role
$reload_link = wp_get_referer();
$reload_link = remove_query_arg('action', $reload_link);
?>
<script type="text/javascript" >
jQuery.ure_postGo('<?php echo $reload_link; ?>',
{ action: 'roles_restore_note',
ure_nonce: ure_data.wp_nonce} );
</script>
<?php
}
// end of reset_user_roles()
/**
* if returns true - make full syncronization of roles for all sites with roles from the main site
* else - only currently selected role update is replicated
*
* @return boolean
*/
public function is_full_network_synch() {
$result = defined('URE_MULTISITE_DIRECT_UPDATE') && URE_MULTISITE_DIRECT_UPDATE == 1;
return $result;
}
// end of is_full_network_synch()
protected function last_check_before_update() {
if (empty($this->roles) || !is_array($this->roles) || count($this->roles)==0) { // Nothing to save - something goes wrong - stop ...
return false;
}
return true;
}
// end of last_check_before_update()
// Save Roles to database
protected function save_roles() {
global $wpdb;
if (!$this->last_check_before_update()) {
return false;
}
if (!isset($this->roles[$this->current_role])) {
return false;
}
$this->capabilities_to_save = $this->remove_caps_not_allowed_for_single_admin($this->capabilities_to_save);
$this->roles[$this->current_role]['capabilities'] = $this->capabilities_to_save;
$option_name = $wpdb->prefix . 'user_roles';
update_option($option_name, $this->roles);
return true;
}
// end of save_roles()
/**
* Update roles for all network using direct database access - quicker in several times
*
* @global wpdb $wpdb
* @return boolean
*/
function direct_network_roles_update() {
global $wpdb;
if (!$this->last_check_before_update()) {
return false;
}
if (!empty($this->current_role)) {
if (!isset($this->roles[$this->current_role])) {
$this->roles[$this->current_role]['name'] = $this->current_role_name;
}
$this->roles[$this->current_role]['capabilities'] = $this->capabilities_to_save;
}
$serialized_roles = serialize($this->roles);
foreach ($this->blog_ids as $blog_id) {
$prefix = $wpdb->get_blog_prefix($blog_id);
$options_table_name = $prefix . 'options';
$option_name = $prefix . 'user_roles';
$query = "update $options_table_name
set option_value='$serialized_roles'
where option_name='$option_name'
limit 1";
$wpdb->query($query);
if ($wpdb->last_error) {
$this->log_event($wpdb->last_error, true);
return false;
}
}
return true;
}
// end of direct_network_roles_update()
public function restore_after_blog_switching($blog_id = 0) {
if (!empty($blog_id)) {
switch_to_blog($blog_id);
}
// cleanup blog switching data
$GLOBALS['_wp_switched_stack'] = array();
$GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] );
}
// end of restore_after_blog_switching(
protected function wp_api_network_roles_update() {
global $wpdb;
$result = true;
$old_blog = $wpdb->blogid;
foreach ($this->blog_ids as $blog_id) {
switch_to_blog($blog_id);
$this->roles = $this->get_user_roles();
if (!isset($this->roles[$this->current_role])) { // add new role to this blog
$this->roles[$this->current_role] = array('name' => $this->current_role_name, 'capabilities' => array('read' => true));
}
if (!$this->save_roles()) {
$result = false;
break;
}
}
$this->restore_after_blog_switching($old_blog);
$this->roles = $this->get_user_roles();
return $result;
}
// end of wp_api_network_roles_update()
/**
* Update role for all network using WordPress API
*
* @return boolean
*/
protected function multisite_update_roles() {
if (defined('URE_DEBUG') && URE_DEBUG) {
$time_shot = microtime();
}
if ($this->is_full_network_synch()) {
$result = $this->direct_network_roles_update();
} else {
$result = $this->wp_api_network_roles_update();
}
if (defined('URE_DEBUG') && URE_DEBUG) {
echo '<div class="updated fade below-h2">Roles updated for ' . ( microtime() - $time_shot ) . ' milliseconds</div>';
}
return $result;
}
// end of multisite_update_roles()
/**
* Process user request on update roles
*
* @global wpdb $wpdb
* @return boolean
*/
protected function update_roles() {
global $wpdb;
if ($this->multisite && is_super_admin() && $this->apply_to_all) { // update Role for the all blogs/sites in the network (permitted to superadmin only)
if (!$this->multisite_update_roles()) {
return false;
}
} else {
if (!$this->save_roles()) {
return false;
}
}
return true;
}
// end of update_roles()
/**
* Write message to the log file
*
* @global type $wp_version
* @param string $message
* @param boolean $show_message
*/
protected function log_event($message, $show_message = false) {
global $wp_version;
$file_name = URE_PLUGIN_DIR . 'user-role-editor.log';
$fh = fopen($file_name, 'a');
$cr = "\n";
$s = $cr . date("d-m-Y H:i:s") . $cr .
'WordPress version: ' . $wp_version . ', PHP version: ' . phpversion() . ', MySQL version: ' . mysql_get_server_info() . $cr;
fwrite($fh, $s);
fwrite($fh, $message . $cr);
fclose($fh);
if ($show_message) {
$this->show_message('Error! ' . esc_html__('Error is occur. Please check the log file.', 'ure'));
}
}
// end of log_event()
/**
* returns array without capabilities blocked for single site administrators
* @param array $capabilities
* @return array
*/
protected function remove_caps_not_allowed_for_single_admin($capabilities) {
foreach(array_keys($capabilities) as $cap) {
if ($this->block_cap_for_single_admin($cap)) {
unset($capabilities[$cap]);
}
}
return $capabilities;
}
// end of remove_caps_not_allowed_for_single_admin()
/**
* process new role create request
*
* @global WP_Roles $wp_roles
*
* @return string - message about operation result
*
*/
protected function add_new_role() {
global $wp_roles;
$mess = '';
$this->current_role = '';
if (isset($_POST['user_role_id']) && $_POST['user_role_id']) {
$user_role_id = utf8_decode($_POST['user_role_id']);
// sanitize user input for security
$valid_name = preg_match('/[A-Za-z0-9_\-]*/', $user_role_id, $match);
if (!$valid_name || ($valid_name && ($match[0] != $user_role_id))) { // some non-alphanumeric charactes found!
return esc_html__('Error: Role ID must contain latin characters, digits, hyphens or underscore only!', 'ure');
}
$numeric_name = preg_match('/[0-9]*/', $user_role_id, $match);
if ($numeric_name && ($match[0] == $user_role_id)) { // numeric name discovered
return esc_html__('Error: WordPress does not support numeric Role name (ID). Add latin characters to it.', 'ure');
}
if ($user_role_id) {
$user_role_name = isset($_POST['user_role_name']) ? $_POST['user_role_name'] : false;
if (!empty($user_role_name)) {
$user_role_name = sanitize_text_field($user_role_name);
} else {
$user_role_name = $user_role_id; // as user role name is empty, use user role ID instead
}
if (!isset($wp_roles)) {
$wp_roles = new WP_Roles();
}
if (isset($wp_roles->roles[$user_role_id])) {
return sprintf('Error! ' . esc_html__('Role %s exists already', 'ure'), $user_role_id);
}
$user_role_id = strtolower($user_role_id);
$this->current_role = $user_role_id;
$user_role_copy_from = isset($_POST['user_role_copy_from']) ? $_POST['user_role_copy_from'] : false;
if (!empty($user_role_copy_from) && $user_role_copy_from != 'none' && $wp_roles->is_role($user_role_copy_from)) {
$role = $wp_roles->get_role($user_role_copy_from);
$capabilities = $this->remove_caps_not_allowed_for_single_admin($role->capabilities);
} else {
$capabilities = array('read' => true, 'level_0' => true);
}
// add new role to the roles array
$result = add_role($user_role_id, $user_role_name, $capabilities);
if (!isset($result) || empty($result)) {
$mess = 'Error! ' . esc_html__('Error is encountered during new role create operation', 'ure');
} else {
$mess = sprintf(esc_html__('Role %s is created successfully', 'ure'), $user_role_name);
}
}
}
return $mess;
}
// end of new_role_create()
/**
* process rename role request
*
* @global WP_Roles $wp_roles
*
* @return string - message about operation result
*
*/
protected function rename_role() {
global $wp_roles;
$mess = '';
$user_role_id = filter_input(INPUT_POST, 'user_role_id', FILTER_SANITIZE_STRING);
if (empty($user_role_id)) {
return esc_html__('Error: Role ID is empty!', 'ure');
}
$user_role_id = utf8_decode($user_role_id);
// sanitize user input for security
$match = array();
$valid_name = preg_match('/[A-Za-z0-9_\-]*/', $user_role_id, $match);
if (!$valid_name || ($valid_name && ($match[0] != $user_role_id))) { // some non-alphanumeric charactes found!
return esc_html__('Error: Role ID must contain latin characters, digits, hyphens or underscore only!', 'ure');
}
$numeric_name = preg_match('/[0-9]*/', $user_role_id, $match);
if ($numeric_name && ($match[0] == $user_role_id)) { // numeric name discovered
return esc_html__('Error: WordPress does not support numeric Role name (ID). Add latin characters to it.', 'ure');
}
$new_role_name = filter_input(INPUT_POST, 'user_role_name', FILTER_SANITIZE_STRING);
if (!empty($new_role_name)) {
$new_role_name = sanitize_text_field($new_role_name);
} else {
return esc_html__('Error: Empty role display name is not allowed.', 'ure');
}
if (!isset($wp_roles)) {
$wp_roles = new WP_Roles();
}
if (!isset($wp_roles->roles[$user_role_id])) {
return sprintf('Error! ' . esc_html__('Role %s does not exists', 'ure'), $user_role_id);
}
$this->current_role = $user_role_id;
$this->current_role_name = $new_role_name;
$old_role_name = $wp_roles->roles[$user_role_id]['name'];
$wp_roles->roles[$user_role_id]['name'] = $new_role_name;
update_option( $wp_roles->role_key, $wp_roles->roles );
$mess = sprintf(esc_html__('Role %s is renamed to %s successfully', 'ure'), $old_role_name, $new_role_name);
return $mess;
}
// end of rename_role()
/**
* Deletes user role from the WP database
*/
protected function delete_wp_roles($roles_to_del) {
global $wp_roles;
if (!isset($wp_roles)) {
$wp_roles = new WP_Roles();
}
$result = false;
foreach($roles_to_del as $role_id) {
if (!isset($wp_roles->roles[$role_id])) {
$result = false;
break;
}
if ($this->role_contains_caps_not_allowed_for_simple_admin($role_id)) { // do not delete
continue;
}
unset($wp_roles->role_objects[$role_id]);
unset($wp_roles->role_names[$role_id]);
unset($wp_roles->roles[$role_id]);
$result = true;
} // foreach()
if ($result) {
update_option($wp_roles->role_key, $wp_roles->roles);
}
return $result;
}
// end of delete_wp_roles()
protected function delete_all_unused_roles() {
$this->roles = $this->get_user_roles();
$roles_to_del = array_keys($this->get_roles_can_delete());
$result = $this->delete_wp_roles($roles_to_del);
$this->roles = null; // to force roles refresh
return $result;
}
// end of delete_all_unused_roles()
/**
* process user request for user role deletion
* @global WP_Roles $wp_roles
* @return type
*/
protected function delete_role() {
$mess = '';
if (isset($_POST['user_role_id']) && $_POST['user_role_id']) {
$role = $_POST['user_role_id'];
if ($role==-1) { // delete all unused roles
$result = $this->delete_all_unused_roles();
} else {
$result = $this->delete_wp_roles(array($role));
}
if (empty($result)) {
$mess = 'Error! ' . esc_html__('Error encountered during role delete operation', 'ure');
} elseif ($role==-1) {
$mess = sprintf(esc_html__('Unused roles are deleted successfully', 'ure'), $role);
} else {
$mess = sprintf(esc_html__('Role %s is deleted successfully', 'ure'), $role);
}
unset($_POST['user_role']);
}
return $mess;
}
// end of ure_delete_role()
/**
* Change default WordPress role
* @global WP_Roles $wp_roles
* @return string
*/
protected function change_default_role() {
global $wp_roles;
$mess = '';
if (!isset($wp_roles)) {
$wp_roles = new WP_Roles();
}
if (!empty($_POST['user_role_id'])) {
$user_role_id = $_POST['user_role_id'];
unset($_POST['user_role_id']);
$errorMessage = 'Error! ' . esc_html__('Error encountered during default role change operation', 'ure');
if (isset($wp_roles->role_objects[$user_role_id]) && $user_role_id !== 'administrator') {
$result = update_option('default_role', $user_role_id);
if (empty($result)) {
$mess = $errorMessage;
} else {
$mess = sprintf(esc_html__('Default role for new users is set to %s successfully', 'ure'), $wp_roles->role_names[$user_role_id]);
}
} else {
$mess = $errorMessage;
}
}
return $mess;
}
// end of change_default_role()
/**
* Not really used in the plugin - just storage for the translation strings
*/
protected function translation_data() {
// for the translation purpose
if (false) {
// Standard WordPress roles
__('Editor', 'ure');
__('Author', 'ure');
__('Contributor', 'ure');
__('Subscriber', 'ure');
// Standard WordPress capabilities
__('Switch themes', 'ure');
__('Edit themes', 'ure');
__('Activate plugins', 'ure');
__('Edit plugins', 'ure');
__('Edit users', 'ure');
__('Edit files', 'ure');
__('Manage options', 'ure');
__('Moderate comments', 'ure');
__('Manage categories', 'ure');
__('Manage links', 'ure');
__('Upload files', 'ure');
__('Import', 'ure');
__('Unfiltered html', 'ure');
__('Edit posts', 'ure');
__('Edit others posts', 'ure');
__('Edit published posts', 'ure');
__('Publish posts', 'ure');
__('Edit pages', 'ure');
__('Read', 'ure');
__('Level 10', 'ure');
__('Level 9', 'ure');
__('Level 8', 'ure');
__('Level 7', 'ure');
__('Level 6', 'ure');
__('Level 5', 'ure');
__('Level 4', 'ure');
__('Level 3', 'ure');
__('Level 2', 'ure');
__('Level 1', 'ure');
__('Level 0', 'ure');
__('Edit others pages', 'ure');
__('Edit published pages', 'ure');
__('Publish pages', 'ure');
__('Delete pages', 'ure');
__('Delete others pages', 'ure');
__('Delete published pages', 'ure');
__('Delete posts', 'ure');
__('Delete others posts', 'ure');
__('Delete published posts', 'ure');
__('Delete private posts', 'ure');
__('Edit private posts', 'ure');
__('Read private posts', 'ure');
__('Delete private pages', 'ure');
__('Edit private pages', 'ure');
__('Read private pages', 'ure');
__('Delete users', 'ure');
__('Create users', 'ure');
__('Unfiltered upload', 'ure');
__('Edit dashboard', 'ure');
__('Update plugins', 'ure');
__('Delete plugins', 'ure');
__('Install plugins', 'ure');
__('Update themes', 'ure');
__('Install themes', 'ure');
__('Update core', 'ure');
__('List users', 'ure');
__('Remove users', 'ure');
__('Add users', 'ure');
__('Promote users', 'ure');
__('Edit theme options', 'ure');
__('Delete themes', 'ure');
__('Export', 'ure');
}
}
// end of ure_TranslationData()
/**
* placeholder - realized at the Pro version
*/
protected function check_blog_user($user) {
return true;
}
// end of check_blog_user()
/**
* placeholder - realized at the Pro version
*/
protected function network_update_user($user) {
return true;
}
// end of network_update_user()
/**
* Update user roles and capabilities
*
* @global WP_Roles $wp_roles
* @param WP_User $user
* @return boolean
*/
protected function update_user($user) {
global $wp_roles;
if ($this->multisite) {
if (!$this->check_blog_user($user)) {
return false;
}
}
$primary_role = $_POST['primary_role'];
if (empty($primary_role) || !isset($wp_roles->roles[$primary_role])) {
$primary_role = '';
}
if (function_exists('bbp_filter_blog_editable_roles')) { // bbPress plugin is active
$bbp_user_role = bbp_get_user_role($user->ID);
} else {
$bbp_user_role = '';
}
// revoke all roles and capabilities from this user
$user->roles = array();
$user->remove_all_caps();
// restore primary role
if (!empty($primary_role)) {
$user->add_role($primary_role);
}
// restore bbPress user role if she had one
if (!empty($bbp_user_role)) {
$user->add_role($bbp_user_role);
}
// add other roles to user
foreach ($_POST as $key => $value) {
$result = preg_match('/^wp_role_(.+)/', $key, $match);
if ($result === 1) {
$role = $match[1];
if (isset($wp_roles->roles[$role])) {
$user->add_role($role);
}
}
}
// add individual capabilities to user
if (count($this->capabilities_to_save) > 0) {
foreach ($this->capabilities_to_save as $key => $value) {
$user->add_cap($key);
}
}
$user->update_user_level_from_caps();
if ($this->apply_to_all) { // apply update to the all network
if (!$this->network_update_user($user)) {
return false;
}
}
return true;
}
// end of update_user()
/**
* Add new capability
*
* @global WP_Roles $wp_roles
* @return string
*/
protected function add_new_capability() {
global $wp_roles;
$mess = '';
if (isset($_POST['capability_id']) && $_POST['capability_id']) {
$user_capability = $_POST['capability_id'];
// sanitize user input for security
$valid_name = preg_match('/[A-Za-z0-9_\-]*/', $user_capability, $match);
if (!$valid_name || ($valid_name && ($match[0] != $user_capability))) { // some non-alphanumeric charactes found!
return 'Error! ' . esc_html__('Error: Capability name must contain latin characters and digits only!', 'ure');
;
}
if ($user_capability) {
$user_capability = strtolower($user_capability);
if (!isset($wp_roles)) {
$wp_roles = new WP_Roles();
}
$wp_roles->use_db = true;
$administrator = $wp_roles->get_role('administrator');
if (!$administrator->has_cap($user_capability)) {
$wp_roles->add_cap('administrator', $user_capability);
$mess = sprintf(esc_html__('Capability %s is added successfully', 'ure'), $user_capability);
} else {
$mess = sprintf('Error! ' . esc_html__('Capability %s exists already', 'ure'), $user_capability);
}
}
}
return $mess;
}
// end of add_new_capability()
/**
* Delete capability
*
* @global wpdb $wpdb
* @global WP_Roles $wp_roles
* @return string - information message
*/
protected function delete_capability() {
global $wpdb, $wp_roles;
$mess = '';
if (!empty($_POST['user_capability_id'])) {
$capability_id = $_POST['user_capability_id'];
$caps_to_remove = $this->get_caps_to_remove();
if (!is_array($caps_to_remove) || count($caps_to_remove) == 0 || !isset($caps_to_remove[$capability_id])) {
return sprintf(esc_html__('Error! You do not have permission to delete this capability: %s!', 'ure'), $capability_id);
}
// process users
$usersId = $wpdb->get_col("SELECT $wpdb->users.ID FROM $wpdb->users");
foreach ($usersId as $user_id) {
$user = get_user_to_edit($user_id);
if ($user->has_cap($capability_id)) {
$user->remove_cap($capability_id);
}
}
// process roles
foreach ($wp_roles->role_objects as $wp_role) {
if ($wp_role->has_cap($capability_id)) {
$wp_role->remove_cap($capability_id);
}
}
$mess = sprintf(esc_html__('Capability %s is removed successfully', 'ure'), $capability_id);
}
return $mess;
}
// end of remove_capability()
/**
* Returns list of user roles, except 1st one, and bbPress assigned as they are shown by WordPress and bbPress theirselves.
*
* @param type $user WP_User from wp-includes/capabilities.php
* @return array
*/
public function other_user_roles($user) {
global $wp_roles;
if (!is_array($user->roles) || count($user->roles) <= 1) {
return '';
}
// get bbPress assigned user role
if (function_exists('bbp_filter_blog_editable_roles')) {
$bb_press_role = bbp_get_user_role($user->ID);
} else {
$bb_press_role = '';
}
$roles = array();
foreach ($user->roles as $key => $value) {
if (!empty($bb_press_role) && $bb_press_role === $value) {
// exclude bbPress assigned role
continue;
}
$roles[] = $value;
}
array_shift($roles); // exclude primary role which is shown by WordPress itself
return $roles;
}
// end of ure_other_user_roles()
/**
* Returns text presentation of user roles
*
* @param type $roles user roles list
* @return string
*/
public function roles_text($roles) {
global $wp_roles;
if (is_array($roles) && count($roles) > 0) {
$role_names = array();
foreach ($roles as $role) {
$role_names[] = $wp_roles->roles[$role]['name'];
}
$output = implode(', ', $role_names);
} else {
$output = '';
}
return $output;
}
// end of roles_text()
/**
* display opening part of the HTML box with title and CSS style
*
* @param string $title
* @param string $style
*/
protected function display_box_start($title, $style = '') {
?>
<div class="postbox" style="float: left; <?php echo $style; ?>">
<h3 style="cursor:default;"><span><?php echo $title ?></span></h3>
<div class="inside">
<?php
}
// end of display_box_start()
/**
* close HTML box opened by display_box_start() call
*/
function display_box_end() {
?>
</div>
</div>
<?php
}
// end of display_box_end()
public function about() {
if ($this->is_pro()) {
return;
}
?>
<h2>User Role Editor</h2>
<strong><?php esc_html_e('Version:', 'ure');?></strong> <?php echo URE_VERSION; ?><br/><br/>
<a class="ure_rsb_link" style="background-image:url(<?php echo URE_PLUGIN_URL . 'images/vladimir.png'; ?>);" target="_blank" href="http://www.shinephp.com/"><?php _e("Author's website", 'ure'); ?></a><br/>
<a class="ure_rsb_link" style="background-image:url(<?php echo URE_PLUGIN_URL . 'images/user-role-editor-icon.png'; ?>);" target="_blank" href="https://www.role-editor.com"><?php _e('Plugin webpage', 'ure'); ?></a><br/>
<a class="ure_rsb_link" style="background-image:url(<?php echo URE_PLUGIN_URL . 'images/user-role-editor-icon.png'; ?>);" target="_blank" href="https://www.role-editor.com/download-plugin"><?php _e('Plugin download', 'ure'); ?></a><br/>
<a class="ure_rsb_link" style="background-image:url(<?php echo URE_PLUGIN_URL . 'images/changelog-icon.png'; ?>);" target="_blank" href="https://www.role-editor.com/changelog"><?php _e('Changelog', 'ure'); ?></a><br/>
<a class="ure_rsb_link" style="background-image:url(<?php echo URE_PLUGIN_URL . 'images/faq-icon.png'; ?>);" target="_blank" href="http://www.shinephp.com/user-role-editor-wordpress-plugin/#faq"><?php _e('FAQ', 'ure'); ?></a><br/>
<hr />
<div style="text-align: center;">
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="encrypted"
value="-----BEGIN PKCS7-----MIIHZwYJKoZIhvcNAQcEoIIHWDCCB1QCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYBME5QAQYFDddWBHA4YXI1x3dYmM77clH5s0CgokYnLVk0P8keOxMtYyNQo6xJs6pY1nJfE3tqNg8CZ3btJjmOUa6DsE+K8Nm6OxGHMQF45z8WAs+f/AvQWdSpPXD0eSMu9osNgmC3yv46hOT3B1J3rKkpeZzMThCdUfECqu+lluzELMAkGBSsOAwIaBQAwgeQGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIeMSZk/UuZnuAgcAort75TUUbtDhmdTi1N0tR9W75Ypuw5nBw01HkZFsFHoGezoT95c3ZesHAlVprhztPrizl1UzE9COQs+3p62a0o+BlxUolkqUT3AecE9qs9dNshqreSvmC8SOpirOroK3WE7DStUvViBfgoNAPTTyTIAKKX24uNXjfvx1jFGMQGBcFysbb3OTkc/B6OiU2G951U9R8dvotaE1RQu6JwaRgwA3FEY9d/P8M+XdproiC324nzFel5WlZ8vtDnMyuPxOgggOHMIIDgzCCAuygAwIBAgIBADANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wHhcNMDQwMjEzMTAxMzE1WhcNMzUwMjEzMTAxMzE1WjCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFHTt38RMxLXJyO2SmS+Ndl72T7oKJ4u4uw+6awntALWh03PewmIJuzbALScsTS4sZoS1fKciBGoh11gIfHzylvkdNe/hJl66/RGqrj5rFb08sAABNTzDTiqqNpJeBsYs/c2aiGozptX2RlnBktH+SUNpAajW724Nv2Wvhif6sFAgMBAAGjge4wgeswHQYDVR0OBBYEFJaffLvGbxe9WT9S1wob7BDWZJRrMIG7BgNVHSMEgbMwgbCAFJaffLvGbxe9WT9S1wob7BDWZJRroYGUpIGRMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAIFfOlaagFrl71+jq6OKidbWFSE+Q4FqROvdgIONth+8kSK//Y/4ihuE4Ymvzn5ceE3S/iBSQQMjyvb+s2TWbQYDwcp129OPIbD9epdr4tJOUNiSojw7BHwYRiPh58S1xGlFgHFXwrEBb3dgNbMUa+u4qectsMAXpVHnD9wIyfmHMYIBmjCCAZYCAQEwgZQwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tAgEAMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xMTEyMTAwODU3MjdaMCMGCSqGSIb3DQEJBDEWBBSFh6YmkoVtYdMaDd5G6EN0dGcPpzANBgkqhkiG9w0BAQEFAASBgAB91K/+gsmpbKxILdCVXCkiOg1zSG+tfq2EZSNzf8z/R1E3HH8qPdm68OToILsgWohKFwE+RCwcQ0iq77wd0alnWoknvhBBoFC/U0yJ3XmA3Hkgrcu6yhVijY/Odmf6WWcz79/uLGkvBSECbjTY0GLxvhRlsh2nAioCfxAr1cFo-----END PKCS7-----">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
</div>
<?php
}
// end of about()
protected function set_current_role() {
if (!isset($this->current_role) || !$this->current_role) {
if (isset($_REQUEST['user_role']) && $_REQUEST['user_role'] && isset($this->roles[$_REQUEST['user_role']])) {
$this->current_role = $_REQUEST['user_role'];
} else {
$this->current_role = $this->get_last_role_id();
}
$this->current_role_name = $this->roles[$this->current_role]['name'];
}
}
// end of set_current_role()
protected function show_admin_role_allowed() {
$show_admin_role = $this->get_option('show_admin_role', 0);
$show_admin_role = ((defined('URE_SHOW_ADMIN_ROLE') && URE_SHOW_ADMIN_ROLE==1) || $show_admin_role==1) && $this->user_is_admin();
return $show_admin_role;
}
// end of show_admin_role()
public function role_edit_prepare_html($select_width=200) {
$caps_access_restrict_for_simple_admin = $this->get_option('caps_access_restrict_for_simple_admin', 0);
$show_admin_role = $this->show_admin_role_allowed();
if ($select_width>0) {
$select_style = 'style="width: '. $select_width .'px"';
} else {
$select_style = '';
}
$this->role_default_html = '<select id="default_user_role" name="default_user_role" '. $select_style .'>';
$this->role_to_copy_html = '<select id="user_role_copy_from" name="user_role_copy_from" style="width: '. $select_width .'px">
<option value="none" selected="selected">' . esc_html__('None', 'ure') . '</option>';
$this->role_select_html = '<select id="user_role" name="user_role" onchange="ure_role_change(this.value);">';
foreach ($this->roles as $key => $value) {
$selected1 = $this->option_selected($key, $this->current_role);
$selected2 = $this->option_selected($key, $this->wp_default_role);
$disabled = ($key==='administrator' && $caps_access_restrict_for_simple_admin && !is_super_admin()) ? 'disabled' : '';
if ($show_admin_role || $key != 'administrator') {
$translated_name = esc_html__($value['name'], 'ure'); // get translation from URE language file, if exists
if ($translated_name === $value['name']) { // get WordPress internal translation
$translated_name = translate_user_role($translated_name);
}
$translated_name .= ' (' . $key . ')';
$this->role_select_html .= '<option value="' . $key . '" ' . $selected1 .' '. $disabled .'>' . $translated_name . '</option>';
$this->role_default_html .= '<option value="' . $key . '" ' . $selected2 .' '. $disabled .'>' . $translated_name . '</option>';
$this->role_to_copy_html .= '<option value="' . $key .'" '. $disabled .'>' . $translated_name . '</option>';
}
}
$this->role_select_html .= '</select>';
$this->role_default_html .= '</select>';
$this->role_to_copy_html .= '</select>';
$roles_can_delete = $this->get_roles_can_delete();
if ($roles_can_delete && count($roles_can_delete) > 0) {
$this->role_delete_html = '<select id="del_user_role" name="del_user_role" width="200" style="width: 200px">';
foreach ($roles_can_delete as $key => $value) {
$this->role_delete_html .= '<option value="' . $key . '">' . esc_html__($value, 'ure') . '</option>';
}
$this->role_delete_html .= '<option value="-1" style="color: red;">' . esc_html__('Delete All Unused Roles', 'ure') . '</option>';
$this->role_delete_html .= '</select>';
} else {
$this->role_delete_html = '';
}
$this->capability_remove_html = $this->get_caps_to_remove_html();
}
// end of role_edit_prepare_html()
public function user_primary_role_dropdown_list($user_roles) {
?>
<select name="primary_role" id="primary_role">
<?php
// Compare user role against currently editable roles
$user_roles = array_intersect( array_values( $user_roles ), array_keys( get_editable_roles() ) );
$user_primary_role = array_shift( $user_roles );
// print the full list of roles with the primary one selected.
wp_dropdown_roles($user_primary_role);
// print the 'no role' option. Make it selected if the user has no role yet.
$selected = ( empty($user_primary_role) ) ? 'selected="selected"' : '';
echo '<option value="" '. $selected.'>' . esc_html__('&mdash; No role for this site &mdash;') . '</option>';
?>
</select>
<?php
}
// end of user_primary_role_dropdown_list()
// returns true if $user has $capability assigned through the roles or directly
// returns true if user has role with name equal $capability
protected function user_can($capability) {
if (isset($this->user_to_edit->caps[$capability])) {
return true;
}
foreach ($this->user_to_edit->roles as $role) {
if ($role===$capability) {
return true;
}
if (!empty($this->roles[$role]['capabilities'][$capability])) {
return true;
}
}
return false;
}
// end of user_can()
// returns true if current user has $capability assigned through the roles or directly
// returns true if current user has role with name equal $cap
public function user_has_capability($user, $cap) {
global $wp_roles;
if (!is_object($user) || empty($user->ID)) {
return false;
}
if (is_multisite() && is_super_admin($user->ID)) {
return true;
}
if (isset($user->caps[$cap])) {
return true;
}
foreach ($user->roles as $role) {
if ($role === $cap) {
return true;
}
if (!empty($wp_roles->roles[$role]['capabilities'][$cap])) {
return true;
}
}
return false;
}
// end of user_has_capability()
public function show_other_default_roles() {
$other_default_roles = $this->get_option('other_default_roles', array());
foreach ($this->roles as $role_id => $role) {
if ( $role_id=='administrator' || $role_id==$this->wp_default_role ) {
continue;
}
if ( in_array($role_id, $other_default_roles) ) {
$checked = 'checked="checked"';
} else {
$checked = '';
}
echo '<label for="wp_role_' . $role_id .'"><input type="checkbox" id="wp_role_' . $role_id .
'" name="wp_role_' . $role_id . '" value="' . $role_id . '"' . $checked .' />&nbsp;' .
esc_html__($role['name'], 'ure') . '</label><br />';
}
}
// end of show_other_default_roles()
public function create_no_rights_role() {
global $wp_roles;
$role_id = 'no_rights';
$role_name = 'No rights';
if (!isset($wp_roles)) {
$wp_roles = new WP_Roles();
}
if (isset($wp_roles->roles[$role_name])) {
return;
}
add_role($role_id, $role_name, array());
}
// end of create_no_rights_role()
public function get_users_without_role() {
global $wpdb;
$id = get_current_blog_id();
$blog_prefix = $wpdb->get_blog_prefix($id);
$query = "select ID from {$wpdb->users} users
where not exists (select user_id from {$wpdb->usermeta}
where user_id=users.ID and meta_key='{$blog_prefix}capabilities') or
exists (select user_id from {$wpdb->usermeta}
where user_id=users.ID and meta_key='{$blog_prefix}capabilities' and meta_value='a:0:{}') ;";
$users = $wpdb->get_col($query);
return $users;
}
// end of get_users_without_role()
public function get_current_role() {
return $this->current_role;
}
// end of get_current_role()
}
// end of URE_Lib class