BP_Core_User::get_users_by_letter( string $letter, int|null $limit = null, int $page = 1, bool $populate_extras = true, string $exclude = '' )
Fetch the details for all users whose usernames start with the given letter.
Description
Parameters
- $letter
-
(Required) The letter the users names are to start with.
- $limit
-
(Optional) The number of users we wish to retrive.
Default value: null
- $page
-
(Optional) The page number we are currently on, used in conjunction with $limit to get the start position for the limit.
Default value: 1
- $populate_extras
-
(Optional) If we should populate extra user fields.
Default value: true
- $exclude
-
(Optional) Comma-separated IDs of users whose results aren't to be fetched.
Default value: ''
Return
(false|array) False on error, otherwise associative array of results.
Source
File: bp-core/classes/class-bp-core-user.php
public static function get_users_by_letter( $letter, $limit = null, $page = 1, $populate_extras = true, $exclude = '' ) { global $wpdb; $pag_sql = ''; if ( $limit && $page ) { $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) ); } // Multibyte compliance. if ( function_exists( 'mb_strlen' ) ) { if ( mb_strlen( $letter, 'UTF-8' ) > 1 || is_numeric( $letter ) || !$letter ) { return false; } } else { if ( strlen( $letter ) > 1 || is_numeric( $letter ) || !$letter ) { return false; } } $bp = buddypress(); $letter_like = bp_esc_like( $letter ) . '%'; $status_sql = bp_core_get_status_sql( 'u.' ); if ( !empty( $exclude ) ) { $exclude = implode( ',', wp_parse_id_list( $exclude ) ); $exclude_sql = " AND u.id NOT IN ({$exclude})"; } else { $exclude_sql = ''; } /** * Filters the SQL used to query for total user count by first letter. * * @since BuddyPress 1.0.0 * * @param string $value SQL prepared statement for the user count query. */ $total_users_sql = apply_filters( 'bp_core_users_by_letter_count_sql', $wpdb->prepare( "SELECT COUNT(DISTINCT u.ID) FROM {$wpdb->users} u LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id LEFT JOIN {$bp->profile->table_name_fields} pf ON pd.field_id = pf.id WHERE {$status_sql} AND pf.name = %s {$exclude_sql} AND pd.value LIKE %s ORDER BY pd.value ASC", bp_xprofile_fullname_field_name(), $letter_like ) ); /** * Filters the SQL used to query for users by first letter. * * @since BuddyPress 1.0.0 * * @param string $value SQL prepared statement for the user query. */ $paged_users_sql = apply_filters( 'bp_core_users_by_letter_sql', $wpdb->prepare( "SELECT DISTINCT u.ID as id, u.user_registered, u.user_nicename, u.user_login, u.user_email FROM {$wpdb->users} u LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id LEFT JOIN {$bp->profile->table_name_fields} pf ON pd.field_id = pf.id WHERE {$status_sql} AND pf.name = %s {$exclude_sql} AND pd.value LIKE %s ORDER BY pd.value ASC{$pag_sql}", bp_xprofile_fullname_field_name(), $letter_like ) ); $total_users = $wpdb->get_var( $total_users_sql ); $paged_users = $wpdb->get_results( $paged_users_sql ); /** * Lets fetch some other useful data in a separate queries, this will be * faster than querying the data for every user in a list. We can't add * these to the main query above since only users who have this * information will be returned (since the much of the data is in * usermeta and won't support any type of directional join) */ $user_ids = array(); foreach ( (array) $paged_users as $user ) $user_ids[] = (int) $user->id; // Add additional data to the returned results. if ( $populate_extras ) { $paged_users = BP_Core_User::get_user_extras( $paged_users, $user_ids ); } return array( 'users' => $paged_users, 'total' => $total_users ); }
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.