* @copyright Copyright (c) 2017, Justin Tadlock * @link http://themehybrid.com/plugins/members-role-hierarchy * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html */ /** * Returns an array of role positions. * * @since 1.0.0 * @access public * @return array */ function mrh_get_role_positions() { $defaults = mrh_get_default_role_positions(); $positions = get_option( 'members_role_hierarchy', $defaults ); return apply_filters( 'mrh_get_role_positions', wp_parse_args( $positions, $defaults ) ); } /** * Returns the default role positions. We're just setting defaults the core roles. * * @since 1.0.0 * @access public * @return array */ function mrh_get_default_role_positions() { $defaults = array( 'administrator' => 100, 'editor' => 80, 'author' => 60, 'contributor' => 40, 'subscriber' => 20 ); return apply_filters( 'mrh_get_default_role_positions', $defaults ); } /** * Returns a role's position in the hierarchy. * * @since 1.0.0 * @access public * @param string $role * @return int */ function mrh_get_role_position( $role ) { $positions = mrh_get_role_positions(); $position = isset( $positions[ $role ] ) ? $positions[ $role ] : mrh_get_default_role_position(); return apply_filters( 'mrh_get_role_position', $position, $role ); } /** * Returns the fallback role position when none is set for a particular role. * * @since 1.0.0 * @access public * @return int */ function mrh_get_default_role_position() { return apply_filters( 'mrh_get_default_role_position', 0 ); } /** * Sets a role position. * * @since 1.0.0 * @access public * @param string $role * @param int $position * @return bool */ function mrh_set_role_position( $role, $position = 0 ) { $positions = mrh_get_role_positions(); $positions[ $role ] = $position; return update_option( 'members_role_hierarchy', $positions ); } /** * Function for comparing roles by their position. * * @since 1.0.0 * @access public * @param int $role_a * @param int $role_b * @param string $operator * @return bool */ function mrh_compare_role( $role_a, $role_b, $operator = '==' ) { $pos_a = mrh_get_role_position( $role_a ); $pos_b = mrh_get_role_position( $role_b ); return mrh_compare( $pos_a, $pos_b, $operator ); } /** * Helper function for comparing numbers with a dynamic operator. * * @since 1.0.0 * @access public * @param int $a * @param int $b * @param string $operator * @return bool */ function mrh_compare( $a, $b, $operator = '==' ) { switch ( $operator ) { case '==' : return $a == $b; case '===' : return $a === $b; case '!=' : return $a !== $b; case '<>' : return $a <> $b; case '!==' : return $a !== $b; case '>=' : return $a >= $b; case '<=' : return $a <= $b; case '>' : return $a > $b; case '<' : return $a < $b; // case '<=>' : return $a <=> $b; // PHP7 default : return false; } } /** * Conditional function to check if a role is higher than another. * * @since 1.0.0 * @access public * @param string $role_a * @param string $role_b * @return bool */ function mrh_is_role_higher( $role_a, $role_b ) { $role_a_pos = mrh_get_role_position( $role_a ); $role_b_pos = mrh_get_role_position( $role_b ); return $role_a_pos > $role_b_pos; } /** * Returns an array with the highest roles by position. It's very possible for * the two or more roles to have the same position. That's why we're returning * an array of roles rather than a single "highest" role. * * @since 1.0.0 * @access public * @return array */ function mrh_get_highest_roles() { $highest = array(); $roles = mrh_get_role_positions(); // Sort numbers in descending order. arsort( $roles, SORT_NUMERIC ); // Reset the array pointer. reset( $roles ); // Get the first key, which is the highest role. $key = key( $roles ); // Loop through the sorted roles and add any that match the highest role's position. foreach ( $roles as $role => $position ) { // Bail if we hit a role that doesn't match. No others will after either. if ( $roles[ $key ] != $position ) break; $highest[] = $role; } return $highest; } /** * Gets a user's highest role based on its position in the hierarchy. * * @since 1.0.0 * @access public * @param int $user_id * @return string */ function mrh_get_user_highest_role( $user_id ) { $positions = mrh_get_role_positions(); $user = new WP_User( $user_id ); $highest_role = ''; if ( $user->roles ) { foreach ( $user->roles as $role ) { if ( ! $highest_role ) { $highest_role = $role; } else if ( $highest_role ) { // Get the position of the highest role. $h_role_pos = mrh_get_role_position( $highest_role ); // Get the position of the current role. $c_role_pos = mrh_get_role_position( $role ); // If the current role is higher than the highest role, it becomes // the new highest role. if ( $c_role_pos > $h_role_pos ) $highest_role = $role; } } } return $highest_role; }