diff --git a/wp-includes/user.php b/wp-includes/user.php
index fb01d38dad..49f4f3fa7d 100644
--- a/wp-includes/user.php
+++ b/wp-includes/user.php
@@ -765,6 +765,126 @@ function get_users( $args = array() ) {
return (array) $user_search->get_results();
}
+/**
+ * List all the users of the site, with several options available.
+ *
+ * @since 5.9.0
+ *
+ * @param string|array $args {
+ * Optional. Array or string of default arguments.
+ *
+ * @type string $orderby How to sort the users. Accepts 'nicename', 'email', 'url', 'registered',
+ * 'user_nicename', 'user_email', 'user_url', 'user_registered', 'name',
+ * 'display_name', 'post_count', 'ID', 'meta_value', 'user_login'. Default 'name'.
+ * @type string $order Sorting direction for $orderby. Accepts 'ASC', 'DESC'. Default 'ASC'.
+ * @type int $number Maximum users to return or display. Default empty (all users).
+ * @type bool $exclude_admin Whether to exclude the 'admin' account, if it exists. Default false.
+ * @type bool $show_fullname Whether to show the user's full name. Default false.
+ * @type string $feed If not empty, show a link to the user's feed and use this text as the alt
+ * parameter of the link. Default empty.
+ * @type string $feed_image If not empty, show a link to the user's feed and use this image URL as
+ * clickable anchor. Default empty.
+ * @type string $feed_type The feed type to link to, such as 'rss2'. Defaults to default feed type.
+ * @type bool $echo Whether to output the result or instead return it. Default true.
+ * @type string $style If 'list', each user is wrapped in an `
` element, otherwise the users
+ * will be separated by commas.
+ * @type bool $html Whether to list the items in HTML form or plaintext. Default true.
+ * @type string $exclude An array, comma-, or space-separated list of user IDs to exclude. Default empty.
+ * @type string $include An array, comma-, or space-separated list of user IDs to include. Default empty.
+ * }
+ * @return string|null The output if echo is false. Otherwise null.
+ */
+function wp_list_users( $args = array() ) {
+ $defaults = array(
+ 'orderby' => 'name',
+ 'order' => 'ASC',
+ 'number' => '',
+ 'exclude_admin' => true,
+ 'show_fullname' => false,
+ 'feed' => '',
+ 'feed_image' => '',
+ 'feed_type' => '',
+ 'echo' => true,
+ 'style' => 'list',
+ 'html' => true,
+ 'exclude' => '',
+ 'include' => '',
+ );
+
+ $args = wp_parse_args( $args, $defaults );
+
+ $return = '';
+
+ $query_args = wp_array_slice_assoc( $args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) );
+ $query_args['fields'] = 'ids';
+ $users = get_users( $query_args );
+
+ foreach ( $users as $user_id ) {
+ $user = get_userdata( $user_id );
+
+ if ( $args['exclude_admin'] && 'admin' === $user->display_name ) {
+ continue;
+ }
+
+ if ( $args['show_fullname'] && '' !== $user->first_name && '' !== $user->last_name ) {
+ $name = "$user->first_name $user->last_name";
+ } else {
+ $name = $user->display_name;
+ }
+
+ if ( ! $args['html'] ) {
+ $return .= $name . ', ';
+
+ continue; // No need to go further to process HTML.
+ }
+
+ if ( 'list' === $args['style'] ) {
+ $return .= '';
+ }
+
+ $row = $name;
+
+ if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) {
+ $row .= ' ';
+ if ( empty( $args['feed_image'] ) ) {
+ $row .= '(';
+ }
+
+ $row .= '';
+ } else {
+ $row .= $name;
+ }
+
+ $row .= '';
+
+ if ( empty( $args['feed_image'] ) ) {
+ $row .= ')';
+ }
+ }
+
+ $return .= $row;
+ $return .= ( 'list' === $args['style'] ) ? '' : ', ';
+ }
+
+ $return = rtrim( $return, ', ' );
+
+ if ( ! $args['echo'] ) {
+ return $return;
+ }
+ echo $return;
+}
+
/**
* Get the sites a user belongs to.
*
diff --git a/wp-includes/version.php b/wp-includes/version.php
index 2332cc7d2d..2004144583 100644
--- a/wp-includes/version.php
+++ b/wp-includes/version.php
@@ -16,7 +16,7 @@
*
* @global string $wp_version
*/
-$wp_version = '5.9-alpha-52063';
+$wp_version = '5.9-alpha-52064';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.