Helix_Website/wp-content/plugins/members/addons/members-role-levels/admin/functions-helpers.php

159 lines
4.2 KiB
PHP

<?php
/**
* Helper functions for dealing with role levels.
*
* @package MembersRoleLevels
* @subpackage Admin
* @author Justin Tadlock <justin@justintadlock.com>
* @copyright Copyright (c) 2015, Justin Tadlock
* @link http://themehybrid.com/plugins/members-role-levels
* @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/
/**
* Removes the `level_` prefix from a role level to return the numeric version.
*
* @since 1.0.0
* @access public
* @param string $level
* @return string
*/
function mrl_remove_level_prefix( $level ) {
return str_replace( 'level_', '', $level );
}
/**
* Adds the `level_` prefix from a role level to return the non-numeric version.
*
* @since 1.0.0
* @access public
* @param string $level
* @return string
*/
function mrl_add_level_prefix( $level ) {
return "level_{$level}";
}
/**
* Checks the role level against a white-list of allowed role levels.
*
* @since 1.0.0
* @access public
* @param string $level
* @return bool
*/
function mrl_is_valid_level( $level ) {
return in_array( $level, array_keys( mrl_get_role_levels() ) );
}
/**
* Returns an array of role levels. The array keys are the levels. The array values are the
* internationalized level labels.
*
* @since 1.0.0
* @access public
* @return array
*/
function mrl_get_role_levels() {
return array(
'level_0' => __( 'Level 0', 'members' ),
'level_1' => __( 'Level 1', 'members' ),
'level_2' => __( 'Level 2', 'members' ),
'level_3' => __( 'Level 3', 'members' ),
'level_4' => __( 'Level 4', 'members' ),
'level_5' => __( 'Level 5', 'members' ),
'level_6' => __( 'Level 6', 'members' ),
'level_7' => __( 'Level 7', 'members' ),
'level_8' => __( 'Level 8', 'members' ),
'level_9' => __( 'Level 9', 'members' ),
'level_10' => __( 'Level 10', 'members' )
);
}
/**
* Returns the highest level a role has. Technically, roles have multiple levels. For example,
* if a role has `level_7`, it will also have `level_0` - `level_6`. This function will simply
* return the highest.
*
* @since 1.0.0
* @access public
* @param string|object $role
* @return string
*/
function mrl_get_role_level( $role ) {
// Bail if the role is empty.
if ( ! $role )
return '';
// Make sure we have the role object.
if ( ! is_object( $role ) )
$role = get_role( $role );
// Get all the role's levels.
$levels = array_intersect( array_keys( $role->capabilities ), array_keys( mrl_get_role_levels() ) );
// Return an empty string if the role doesn't have any levels.
if ( ! $levels )
return '';
// Get the numeric versions of the levels.
$numeric_levels = array_map( 'mrl_remove_level_prefix', $levels );
// Sort the levels in descending order (high to low).
rsort( $numeric_levels );
// Return the highest level and re-add the `level_` prefix.
return mrl_add_level_prefix( array_shift( $numeric_levels ) );
}
/**
* 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();
}
}