$caps Raw capabilities (`{prefix}capabilities` meta). * @param array> $roles Roles: slug => array( 'name', 'capabilities' ). * @return string[] */ public static function roles_of( array $caps, array $roles ): array { $found = array(); foreach ( array_keys( $caps ) as $key ) { if ( isset( $roles[ $key ] ) ) { $found[] = (string) $key; } } return $found; } /** * Effective capabilities: role capabilities merged in role order, then the user's own capabilities on top (core's * `$allcaps`). * * @param array $caps Raw capabilities. * @param array> $roles Roles. * @return array */ public static function effective( array $caps, array $roles ): array { $all = array(); foreach ( self::roles_of( $caps, $roles ) as $role ) { $all = array_merge( $all, isset( $roles[ $role ]['capabilities'] ) ? (array) $roles[ $role ]['capabilities'] : array() ); } return array_merge( $all, $caps ); } /** * Whether effective capabilities make an administrator (manage_options and promote_users). * * @param array $effective Effective capabilities. * @return bool */ public static function is_administrator( array $effective ): bool { foreach ( self::ADMINISTRATOR as $cap ) { if ( empty( $effective[ $cap ] ) ) { return false; } } return true; } /** * Administrator-equivalent capabilities granted, sorted. * * @param array $caps Capabilities (effective, role or user). * @return string[] */ public static function admin_caps( array $caps ): array { return array_values( array_intersect( self::granted( $caps ), self::ADMIN_CAPS ) ); } /** * Names of the granted (truthy) capabilities, sorted. * * @param array $caps Capabilities. * @return string[] */ public static function granted( array $caps ): array { $granted = array(); foreach ( $caps as $cap => $grant ) { if ( ! empty( $grant ) ) { $granted[] = (string) $cap; } } sort( $granted, SORT_STRING ); return $granted; } /** * Whether FlitAgent refuses to write a user meta key. * * @param string $key Meta key. * @return bool */ public static function is_protected_meta_key( string $key ): bool { return 1 === preg_match( self::PROTECTED_META, $key ) || Redactor::is_secret_key( $key ) || in_array( strtolower( $key ), self::USER_FIELDS, true ); } }