/** * Outputs the role level meta box. * * @since 1.0.0 * @access public * @param object $role * @return void */ public function meta_box($role) { // If the role isn't editable, the field should be read-only. $is_editable = $role ? members_is_role_editable($role->name) : true; $readonly = $is_editable ? '' : ' disabled="disabled" readonly="readonly"'; // Get the role level. $role_level = mrl_get_role_level($role); // If there is no role level, check if cloning or error. if (!$role_level) { // If there was a posted level (error). if (isset($_POST['mrl-role-level']) && mrl_is_valid_level($_POST['mrl-role-level'])) { $role_level = $_POST['mrl-role-level']; } else { if (isset($_GET['page']) && 'role-new' === $_GET['page'] && !empty($_GET['clone'])) { $role_level = mrl_get_role_level(members_sanitize_role($_GET['clone'])); } } } // If still no level, set it to `level_0`. $role_level = $role_level ? $role_level : 'level_0'; wp_nonce_field('role_level', 'mrl_role_level_nonce'); ?> <p> <select class="widefat" name="mrl-role-level"<?php echo $readonly; ?> > <?php foreach (mrl_get_role_levels() as $level => $label) { ?> <option value="<?php echo esc_attr($level); ?> " <?php selected($level, $role_level); ?> ><?php echo esc_html($label); ?> </option> <?php } ?> </select> </p> <?php }
/** * Sets a new role level. This function also updates all users of the given role to update * their user level. * * Note: WP will always set the user level to the highest level when calling the * `WP_User:update_user_level_from_caps()` method, so there's no need to check for the * highest role when dealing with users with multiple roles. * * @since 1.0.0 * @access public * @param string|object $role * @return void */ function mrl_set_role_level($role, $new_level = 'level_0') { // Make sure we have the role object. if (!is_object($role)) { $role = get_role($role); } // Get the allowed levels. $levels = array_keys(mrl_get_role_levels()); // Get the posted level without the `level` prefix. $new_level_numeric = absint(mrl_remove_level_prefix($new_level)); // Get the levels to add and remove. $add = array_slice($levels, 0, $new_level_numeric + 1, true); $remove = array_diff($levels, $add); // Add new levels. foreach ($add as $add_level) { $role->add_cap($add_level); } // Remove levels. foreach ($remove as $remove_level) { $role->remove_cap($remove_level); } // Get the users with the current role. $users = get_users(array('role' => $role->name)); // If there are users with the role, update their user level from caps. if ($users) { foreach ($users as $user) { $user->update_user_level_from_caps(); } } }