diff --git a/src/js/_enqueues/admin/user-profile.js b/src/js/_enqueues/admin/user-profile.js index 23d10404129fe..dc56d48630191 100644 --- a/src/js/_enqueues/admin/user-profile.js +++ b/src/js/_enqueues/admin/user-profile.js @@ -512,13 +512,17 @@ if ( select.length ) { $('#first_name, #last_name, #nickname').on( 'blur.user_profile', function() { var dub = [], + isEmail = $('#user_login').attr( 'data-is-email' ) === 'true', inputs = { display_nickname : $('#nickname').val() || '', - display_username : $('#user_login').val() || '', display_firstname : $('#first_name').val() || '', display_lastname : $('#last_name').val() || '' }; + if ( ! isEmail ) { + inputs.display_username = $('#user_login').val() || ''; + } + if ( inputs.display_firstname && inputs.display_lastname ) { inputs.display_firstlast = inputs.display_firstname + ' ' + inputs.display_lastname; inputs.display_lastfirst = inputs.display_lastname + ' ' + inputs.display_firstname; diff --git a/src/wp-admin/includes/user.php b/src/wp-admin/includes/user.php index c6c08c4eaf76c..a260804ec5bf6 100644 --- a/src/wp-admin/includes/user.php +++ b/src/wp-admin/includes/user.php @@ -567,6 +567,56 @@ function default_password_nag() { ); } +/** + * Computes the public display name options for the user profile screen. + * + * Excludes the user login from display options when the username is an email address, + * preventing email exposure in public author links, feeds, and bylines. + * + * @since 7.2.0 + * @access private + * + * @param WP_User|int $user User object or user ID. + * @return string[] Array of unique display name choices. + */ +function _wp_get_user_profile_display_name_options( $user ) { + if ( ! $user instanceof WP_User ) { + $user = get_userdata( $user ); + } + + if ( ! $user ) { + return array(); + } + + $public_display = array(); + $public_display['display_nickname'] = $user->nickname; + + if ( ! is_email( $user->user_login ) ) { + $public_display['display_username'] = $user->user_login; + } + + if ( ! empty( $user->first_name ) ) { + $public_display['display_firstname'] = $user->first_name; + } + + if ( ! empty( $user->last_name ) ) { + $public_display['display_lastname'] = $user->last_name; + } + + if ( ! empty( $user->first_name ) && ! empty( $user->last_name ) ) { + $public_display['display_firstlast'] = $user->first_name . ' ' . $user->last_name; + $public_display['display_lastfirst'] = $user->last_name . ' ' . $user->first_name; + } + + if ( ! in_array( $user->display_name, $public_display, true ) ) { + $public_display = array( 'display_displayname' => $user->display_name ) + $public_display; + } + + $public_display = array_map( 'trim', $public_display ); + + return array_values( array_unique( $public_display ) ); +} + /** * Optional SSL preference that can be turned on by hooking to the 'personal_options' action. * diff --git a/src/wp-admin/user-edit.php b/src/wp-admin/user-edit.php index d1f99690b8451..cc81348f277e5 100644 --- a/src/wp-admin/user-edit.php +++ b/src/wp-admin/user-edit.php @@ -472,7 +472,7 @@ - + ID ) ) : ?> @@ -549,32 +549,9 @@