Users: Ensure that users with no role on a site are taken into consideration when listing users on Multisite.

This ensures that users who are a member of a site but have no role are correctly listed on the Users screen and can be filtered from the 'None' role filter.

Props tobi823, flixos90, scottlee

Fixes #36196

Built from https://develop.svn.wordpress.org/trunk@41138


git-svn-id: http://core.svn.wordpress.org/trunk@40978 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
John Blackbourn 2017-07-25 00:24:43 +00:00
parent 8648fc0bff
commit b4c2f16d01
3 changed files with 18 additions and 20 deletions

View File

@ -98,7 +98,7 @@ class WP_Users_List_Table extends WP_List_Table {
$args = array(
'number' => $users_per_page,
'offset' => ( $paged-1 ) * $users_per_page,
'include' => wp_get_users_with_no_role(),
'include' => wp_get_users_with_no_role( $this->site_id ),
'search' => $usersearch,
'fields' => 'all_with_meta'
);
@ -177,7 +177,7 @@ class WP_Users_List_Table extends WP_List_Table {
if ( $this->is_site_users ) {
$url = 'site-users.php?id=' . $this->site_id;
switch_to_blog( $this->site_id );
$users_of_blog = count_users();
$users_of_blog = count_users( 'time', $this->site_id );
restore_current_blog();
} else {
$url = 'users.php';
@ -369,9 +369,6 @@ class WP_Users_List_Table extends WP_List_Table {
$post_counts = count_many_users_posts( array_keys( $this->items ) );
foreach ( $this->items as $userid => $user_object ) {
if ( is_multisite() && empty( $user_object->allcaps ) )
continue;
echo "\n\t" . $this->single_row( $user_object, '', '', isset( $post_counts ) ? $post_counts[ $userid ] : 0 );
}
}

View File

@ -838,18 +838,23 @@ function update_user_meta($user_id, $meta_key, $meta_value, $prev_value = '') {
*
* @since 3.0.0
* @since 4.4.0 The number of users with no role is now included in the `none` element.
* @since 4.9.0 The `$site_id` parameter was added to support multisite.
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param string $strategy 'time' or 'memory'
* @param string $strategy Optional. The computational strategy to use when counting the users.
* Accepts either 'time' or 'memory'. Default 'time'.
* @param int|null $site_id Optional. The site ID to count users for. Defaults to the current site.
* @return array Includes a grand total and an array of counts indexed by role strings.
*/
function count_users($strategy = 'time') {
function count_users( $strategy = 'time', $site_id = null ) {
global $wpdb;
// Initialize
$id = get_current_blog_id();
$blog_prefix = $wpdb->get_blog_prefix($id);
if ( ! $site_id ) {
$site_id = get_current_blog_id();
}
$blog_prefix = $wpdb->get_blog_prefix( $site_id );
$result = array();
if ( 'time' == $strategy ) {
@ -920,10 +925,6 @@ function count_users($strategy = 'time') {
$result['avail_roles'] =& $avail_roles;
}
if ( is_multisite() ) {
$result['avail_roles']['none'] = 0;
}
return $result;
}
@ -2483,20 +2484,20 @@ function wp_destroy_all_sessions() {
/**
* Get the user IDs of all users with no role on this site.
*
* This function returns an empty array when used on Multisite.
*
* @since 4.4.0
* @since 4.9.0 The `$site_id` parameter was added to support multisite.
*
* @param int|null $site_id Optional. The site ID to get users with no role for. Defaults to the current site.
* @return array Array of user IDs.
*/
function wp_get_users_with_no_role() {
function wp_get_users_with_no_role( $site_id = null ) {
global $wpdb;
if ( is_multisite() ) {
return array();
if ( ! $site_id ) {
$site_id = get_current_blog_id();
}
$prefix = $wpdb->get_blog_prefix();
$prefix = $wpdb->get_blog_prefix( $site_id );
$regex = implode( '|', array_keys( wp_roles()->get_names() ) );
$regex = preg_replace( '/[^a-zA-Z_\|-]/', '', $regex );
$users = $wpdb->get_col( $wpdb->prepare( "

View File

@ -4,7 +4,7 @@
*
* @global string $wp_version
*/
$wp_version = '4.9-alpha-41136';
$wp_version = '4.9-alpha-41138';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.