diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php index a83e57e099..22c2c1ea1d 100644 --- a/src/wp-includes/user.php +++ b/src/wp-includes/user.php @@ -2440,7 +2440,7 @@ function wp_get_users_with_no_role() { } $prefix = $wpdb->get_blog_prefix(); - $regex = implode( '|', wp_roles()->get_names() ); + $regex = implode( '|', array_keys( wp_roles()->get_names() ) ); $regex = preg_replace( '/[^a-zA-Z_\|-]/', '', $regex ); $users = $wpdb->get_col( $wpdb->prepare( " SELECT user_id diff --git a/tests/phpunit/tests/user/wpGetUsersWithNoRole.php b/tests/phpunit/tests/user/wpGetUsersWithNoRole.php index 6eb68234b5..cd7b118676 100644 --- a/tests/phpunit/tests/user/wpGetUsersWithNoRole.php +++ b/tests/phpunit/tests/user/wpGetUsersWithNoRole.php @@ -81,4 +81,25 @@ class Tests_User_GetUsersWithNoRole extends WP_UnitTestCase { } + /** + * Role comparison must be done on role name, not role display name. + * + * @ticket 38234 + */ + public function test_get_users_with_no_role_matches_on_role_name() { + // Create a role with a display name which would not match the role name + // in a case-insentive SQL query. + wp_roles()->add_role( 'somerole', 'Some role display name' ); + + $someuser = self::factory()->user->create( array( + 'role' => 'somerole', + ) ); + + $users = wp_get_users_with_no_role(); + + wp_roles()->remove_role( 'somerole' ); + + $this->assertEmpty( $users ); + } + }