capabilities as $cap => $granted ) { if ( $granted && self::is_power_cap( (string) $cap ) ) { $out[] = (string) $cap; } } return $out; } public static function is_safe( $role ) { return array() === self::why_not( $role ); } public static function roles() { $out = array(); foreach ( wp_roles()->roles as $slug => $data ) { if ( self::is_safe( (string) $slug ) ) { $out[ (string) $slug ] = translate_user_role( (string) ( $data['name'] ?? $slug ) ); } } return $out; } public static function is_customer_account( $user ) { $user = $user instanceof WP_User ? $user : get_userdata( (int) $user ); if ( ! $user instanceof WP_User || ! $user->exists() ) { return false; } if ( is_multisite() && is_super_admin( $user->ID ) ) { return false; } foreach ( (array) $user->caps as $key => $granted ) { if ( ! $granted ) { continue; } if ( wp_roles()->is_role( (string) $key ) ? ! self::is_safe( (string) $key ) : self::is_power_cap( (string) $key ) ) { return false; } } return true; } public static function grant( $user_id, $role, $source ) { $user = get_userdata( (int) $user_id ); if ( ! $user instanceof WP_User || ! self::may_hand_out( (string) $role ) ) { return false; } if ( ! in_array( (string) $role, (array) $user->roles, true ) ) { $before = self::$source; self::$source = (string) $source; $user->add_role( (string) $role ); self::$source = $before; } return true; } public static function fallback_role() { foreach ( array( (string) get_option( 'default_role', '' ), 'customer', 'subscriber' ) as $role ) { if ( '' !== $role && self::may_hand_out( $role ) ) { return $role; } } return ''; } public static function revoke( $user_id, $role, $source ) { $user = get_userdata( (int) $user_id ); if ( ! $user instanceof WP_User ) { return false; } if ( ! in_array( (string) $role, (array) $user->roles, true ) ) { return true; } if ( ! self::may_hand_out( (string) $role ) ) { return false; } $fallback = array( (string) $role ) === array_values( (array) $user->roles ) ? self::fallback_role() : ''; if ( $fallback === (string) $role ) { return false; } $before = self::$source; self::$source = (string) $source; if ( '' !== $fallback ) { $user->add_role( $fallback ); } $user->remove_role( (string) $role ); self::$source = $before; return true; } } }