Make WordPress Core

Changeset 34965


Ignore:
Timestamp:
10/08/2015 10:06:46 PM (9 years ago)
Author:
johnbillion
Message:

Introduce the ability to filter the Users admin listing screen by users with no role, if such users exist.

Fixes #22993
Props spmlucas, johnbillion

Location:
trunk
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/class-wp-users-list-table.php

    r34963 r34965  
    8888        $paged = $this->get_pagenum();
    8989
    90         $args = array(
    91             'number' => $users_per_page,
    92             'offset' => ( $paged-1 ) * $users_per_page,
    93             'role' => $role,
    94             'search' => $usersearch,
    95             'fields' => 'all_with_meta'
    96         );
     90        if ( 'none' === $role ) {
     91            $args = array(
     92                'number' => $users_per_page,
     93                'offset' => ( $paged-1 ) * $users_per_page,
     94                'include' => wp_get_users_with_no_role(),
     95                'search' => $usersearch,
     96                'fields' => 'all_with_meta'
     97            );
     98        } else {
     99            $args = array(
     100                'number' => $users_per_page,
     101                'offset' => ( $paged-1 ) * $users_per_page,
     102                'role' => $role,
     103                'search' => $usersearch,
     104                'fields' => 'all_with_meta'
     105            );
     106        }
    97107
    98108        if ( '' !== $args['search'] )
     
    167177            $users_of_blog = count_users();
    168178        }
     179
    169180        $total_users = $users_of_blog['total_users'];
    170181        $avail_roles =& $users_of_blog['avail_roles'];
     
    188199            $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, number_format_i18n( $avail_roles[$this_role] ) );
    189200            $role_links[$this_role] = "<a href='" . esc_url( add_query_arg( 'role', $this_role, $url ) ) . "'$class>$name</a>";
     201        }
     202
     203        if ( ! empty( $avail_roles['none' ] ) ) {
     204
     205            $class = '';
     206
     207            if ( 'none' === $role ) {
     208                $class = ' class="current"';
     209            }
     210
     211            $name = __( 'No role' );
     212            /* translators: User role name with count */
     213            $name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, number_format_i18n( $avail_roles['none' ] ) );
     214            $role_links['none'] = "<a href='" . esc_url( add_query_arg( 'role', 'none', $url ) ) . "'$class>$name</a>";
     215
    190216        }
    191217
  • trunk/src/wp-includes/user-functions.php

    r34923 r34965  
    736736 *
    737737 * @since 3.0.0
     738 * @since 4.4.0 The number of users with no role is now included in the `none` element.
    738739 *
    739740 * @global wpdb $wpdb
     
    776777        $total_users = (int) $row[$col];
    777778
     779        $role_counts['none'] = ( $total_users - array_sum( $role_counts ) );
     780
    778781        $result['total_users'] = $total_users;
    779782        $result['avail_roles'] =& $role_counts;
    780783    } else {
    781         $avail_roles = array();
     784        $avail_roles = array(
     785            'none' => 0,
     786        );
    782787
    783788        $users_of_blog = $wpdb->get_col( "SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'" );
     
    787792            if ( ! is_array( $b_roles ) )
    788793                continue;
     794            if ( empty( $b_roles ) ) {
     795                $avail_roles['none']++;
     796            }
    789797            foreach ( $b_roles as $b_role => $val ) {
    790798                if ( isset($avail_roles[$b_role]) ) {
     
    798806        $result['total_users'] = count( $users_of_blog );
    799807        $result['avail_roles'] =& $avail_roles;
     808    }
     809
     810    if ( is_multisite() ) {
     811        $result['avail_roles']['none'] = 0;
    800812    }
    801813
     
    22322244    $manager->destroy_all();
    22332245}
     2246
     2247/**
     2248 * Get the user IDs of all users with no role on this site.
     2249 *
     2250 * This function returns an empty array when used on Multisite.
     2251 *
     2252 * @since 4.4.0
     2253 *
     2254 * @return array Array of user IDs.
     2255 */
     2256function wp_get_users_with_no_role() {
     2257    global $wpdb;
     2258
     2259    if ( is_multisite() ) {
     2260        return array();
     2261    }
     2262
     2263    $prefix = $wpdb->get_blog_prefix();
     2264    $regex  = implode( '|', wp_roles()->get_names() );
     2265    $regex  = preg_replace( '/[^a-zA-Z_\|-]/', '', $regex );
     2266    $users  = $wpdb->get_col( $wpdb->prepare( "
     2267        SELECT user_id
     2268        FROM $wpdb->usermeta
     2269        WHERE meta_key = '{$prefix}capabilities'
     2270        AND meta_value NOT REGEXP %s
     2271    ", $regex ) );
     2272
     2273    return $users;
     2274}
Note: See TracChangeset for help on using the changeset viewer.