2019-03-12 09:27:46 +00:00
< ? php
/**
* List Table API : WP_Users_List_Table class
*
* @ package WordPress
* @ subpackage Administration
* @ since 3.1 . 0
*/
/**
* Core class used to implement displaying users in a list table .
*
* @ since 3.1 . 0
* @ access private
*
* @ see WP_List_Table
*/
class WP_Users_List_Table extends WP_List_Table {
/**
* Site ID to generate the Users list table for .
*
* @ since 3.1 . 0
* @ var int
*/
public $site_id ;
/**
* Whether or not the current Users list table is for Multisite .
*
* @ since 3.1 . 0
* @ var bool
*/
public $is_site_users ;
/**
* Constructor .
*
* @ since 3.1 . 0
*
* @ see WP_List_Table :: __construct () for more information on default arguments .
*
* @ param array $args An associative array of arguments .
*/
public function __construct ( $args = array () ) {
2019-04-16 19:56:22 +00:00
parent :: __construct (
array (
'singular' => 'user' ,
'plural' => 'users' ,
'screen' => isset ( $args [ 'screen' ] ) ? $args [ 'screen' ] : null ,
)
);
2019-03-12 09:27:46 +00:00
$this -> is_site_users = 'site-users-network' === $this -> screen -> id ;
2019-04-16 19:56:22 +00:00
if ( $this -> is_site_users ) {
2019-03-12 09:27:46 +00:00
$this -> site_id = isset ( $_REQUEST [ 'id' ] ) ? intval ( $_REQUEST [ 'id' ] ) : 0 ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
}
/**
* Check the current user ' s permissions .
*
2019-04-16 19:56:22 +00:00
* @ since 3.1 . 0
2019-03-12 09:27:46 +00:00
*
* @ return bool
*/
public function ajax_user_can () {
2019-04-16 19:56:22 +00:00
if ( $this -> is_site_users ) {
2019-03-12 09:27:46 +00:00
return current_user_can ( 'manage_sites' );
2019-04-16 19:56:22 +00:00
} else {
2019-03-12 09:27:46 +00:00
return current_user_can ( 'list_users' );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
}
/**
* Prepare the users list for display .
*
* @ since 3.1 . 0
*
* @ global string $role
* @ global string $usersearch
*/
public function prepare_items () {
global $role , $usersearch ;
$usersearch = isset ( $_REQUEST [ 's' ] ) ? wp_unslash ( trim ( $_REQUEST [ 's' ] ) ) : '' ;
$role = isset ( $_REQUEST [ 'role' ] ) ? $_REQUEST [ 'role' ] : '' ;
2019-04-16 19:56:22 +00:00
$per_page = ( $this -> is_site_users ) ? 'site_users_network_per_page' : 'users_per_page' ;
2019-03-12 09:27:46 +00:00
$users_per_page = $this -> get_items_per_page ( $per_page );
$paged = $this -> get_pagenum ();
if ( 'none' === $role ) {
$args = array (
2019-04-16 19:56:22 +00:00
'number' => $users_per_page ,
'offset' => ( $paged - 1 ) * $users_per_page ,
2019-03-12 09:27:46 +00:00
'include' => wp_get_users_with_no_role ( $this -> site_id ),
2019-04-16 19:56:22 +00:00
'search' => $usersearch ,
'fields' => 'all_with_meta' ,
2019-03-12 09:27:46 +00:00
);
} else {
$args = array (
'number' => $users_per_page ,
2019-04-16 19:56:22 +00:00
'offset' => ( $paged - 1 ) * $users_per_page ,
'role' => $role ,
2019-03-12 09:27:46 +00:00
'search' => $usersearch ,
2019-04-16 19:56:22 +00:00
'fields' => 'all_with_meta' ,
2019-03-12 09:27:46 +00:00
);
}
2019-04-16 19:56:22 +00:00
if ( '' !== $args [ 'search' ] ) {
2019-03-12 09:27:46 +00:00
$args [ 'search' ] = '*' . $args [ 'search' ] . '*' ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( $this -> is_site_users ) {
2019-03-12 09:27:46 +00:00
$args [ 'blog_id' ] = $this -> site_id ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( isset ( $_REQUEST [ 'orderby' ] ) ) {
2019-03-12 09:27:46 +00:00
$args [ 'orderby' ] = $_REQUEST [ 'orderby' ];
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( isset ( $_REQUEST [ 'order' ] ) ) {
2019-03-12 09:27:46 +00:00
$args [ 'order' ] = $_REQUEST [ 'order' ];
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
/**
* Filters the query arguments used to retrieve users for the current users list table .
*
* @ since 4.4 . 0
*
* @ param array $args Arguments passed to WP_User_Query to retrieve items for the current
* users list table .
*/
$args = apply_filters ( 'users_list_table_query_args' , $args );
// Query the user IDs for this page
$wp_user_search = new WP_User_Query ( $args );
$this -> items = $wp_user_search -> get_results ();
2019-04-16 19:56:22 +00:00
$this -> set_pagination_args (
array (
'total_items' => $wp_user_search -> get_total (),
'per_page' => $users_per_page ,
)
);
2019-03-12 09:27:46 +00:00
}
/**
* Output 'no users' message .
*
* @ since 3.1 . 0
*/
public function no_items () {
_e ( 'No users found.' );
}
/**
* Return an associative array listing all the views that can be used
* with this table .
*
* Provides a list of roles and user count for that role for easy
* Filtersing of the user table .
*
* @ since 3.1 . 0
*
* @ global string $role
*
* @ return array An array of HTML links , one for each view .
*/
protected function get_views () {
global $role ;
$wp_roles = wp_roles ();
if ( $this -> is_site_users ) {
$url = 'site-users.php?id=' . $this -> site_id ;
switch_to_blog ( $this -> site_id );
$users_of_blog = count_users ( 'time' , $this -> site_id );
restore_current_blog ();
} else {
2019-04-16 19:56:22 +00:00
$url = 'users.php' ;
2019-03-12 09:27:46 +00:00
$users_of_blog = count_users ();
}
$total_users = $users_of_blog [ 'total_users' ];
$avail_roles =& $users_of_blog [ 'avail_roles' ];
2019-04-16 19:56:22 +00:00
unset ( $users_of_blog );
2019-03-12 09:27:46 +00:00
$current_link_attributes = empty ( $role ) ? ' class="current" aria-current="page"' : '' ;
2019-04-16 19:56:22 +00:00
$role_links = array ();
2019-03-12 09:27:46 +00:00
$role_links [ 'all' ] = " <a href=' $url ' $current_link_attributes > " . sprintf ( _nx ( 'All <span class="count">(%s)</span>' , 'All <span class="count">(%s)</span>' , $total_users , 'users' ), number_format_i18n ( $total_users ) ) . '</a>' ;
foreach ( $wp_roles -> get_names () as $this_role => $name ) {
2019-04-16 19:56:22 +00:00
if ( ! isset ( $avail_roles [ $this_role ] ) ) {
2019-03-12 09:27:46 +00:00
continue ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$current_link_attributes = '' ;
if ( $this_role === $role ) {
$current_link_attributes = ' class="current" aria-current="page"' ;
}
$name = translate_user_role ( $name );
/* translators: User role name with count */
2019-04-16 19:56:22 +00:00
$name = sprintf ( __ ( '%1$s <span class="count">(%2$s)</span>' ), $name , number_format_i18n ( $avail_roles [ $this_role ] ) );
$role_links [ $this_role ] = " <a href=' " . esc_url ( add_query_arg ( 'role' , $this_role , $url ) ) . " ' $current_link_attributes > $name </a> " ;
2019-03-12 09:27:46 +00:00
}
2019-04-16 19:56:22 +00:00
if ( ! empty ( $avail_roles [ 'none' ] ) ) {
2019-03-12 09:27:46 +00:00
$current_link_attributes = '' ;
if ( 'none' === $role ) {
$current_link_attributes = ' class="current" aria-current="page"' ;
}
$name = __ ( 'No role' );
/* translators: User role name with count */
2019-04-16 19:56:22 +00:00
$name = sprintf ( __ ( '%1$s <span class="count">(%2$s)</span>' ), $name , number_format_i18n ( $avail_roles [ 'none' ] ) );
2019-03-12 09:27:46 +00:00
$role_links [ 'none' ] = " <a href=' " . esc_url ( add_query_arg ( 'role' , 'none' , $url ) ) . " ' $current_link_attributes > $name </a> " ;
}
return $role_links ;
}
/**
* Retrieve an associative array of bulk actions available on this table .
*
* @ since 3.1 . 0
*
* @ return array Array of bulk actions .
*/
protected function get_bulk_actions () {
$actions = array ();
if ( is_multisite () ) {
2019-04-16 19:56:22 +00:00
if ( current_user_can ( 'remove_users' ) ) {
2019-03-12 09:27:46 +00:00
$actions [ 'remove' ] = __ ( 'Remove' );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
} else {
2019-04-16 19:56:22 +00:00
if ( current_user_can ( 'delete_users' ) ) {
2019-03-12 09:27:46 +00:00
$actions [ 'delete' ] = __ ( 'Delete' );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
}
return $actions ;
}
/**
* Output the controls to allow user roles to be changed in bulk .
*
* @ since 3.1 . 0
*
* @ param string $which Whether this is being invoked above ( " top " )
* or below the table ( " bottom " ) .
*/
protected function extra_tablenav ( $which ) {
2019-04-16 19:56:22 +00:00
$id = 'bottom' === $which ? 'new_role2' : 'new_role' ;
2019-03-12 09:27:46 +00:00
$button_id = 'bottom' === $which ? 'changeit2' : 'changeit' ;
2019-04-16 19:56:22 +00:00
?>
2019-03-12 09:27:46 +00:00
< div class = " alignleft actions " >
< ? php if ( current_user_can ( 'promote_users' ) && $this -> has_items () ) : ?>
2019-04-16 19:56:22 +00:00
< label class = " screen-reader-text " for = " <?php echo $id ; ?> " >< ? php _e ( 'Change role to…' ); ?> </label>
< select name = " <?php echo $id ; ?> " id = " <?php echo $id ; ?> " >
< option value = " " >< ? php _e ( 'Change role to…' ); ?> </option>
2019-03-12 09:27:46 +00:00
< ? php wp_dropdown_roles (); ?>
</ select >
2019-04-16 19:56:22 +00:00
< ? php
2019-03-12 09:27:46 +00:00
submit_button ( __ ( 'Change' ), '' , $button_id , false );
endif ;
/**
* Fires just before the closing div containing the bulk role - change controls
* in the Users list table .
*
* @ since 3.5 . 0
* @ since 4.6 . 0 The `$which` parameter was added .
*
* @ param string $which The location of the extra table nav markup : 'top' or 'bottom' .
*/
do_action ( 'restrict_manage_users' , $which );
2019-04-16 19:56:22 +00:00
?>
2019-03-12 09:27:46 +00:00
</ div >
2019-04-16 19:56:22 +00:00
< ? php
2019-03-12 09:27:46 +00:00
/**
* Fires immediately following the closing " actions " div in the tablenav for the users
* list table .
*
* @ since 4.9 . 0
*
* @ param string $which The location of the extra table nav markup : 'top' or 'bottom' .
*/
do_action ( 'manage_users_extra_tablenav' , $which );
}
/**
* Capture the bulk action required , and return it .
*
* Overridden from the base class implementation to capture
* the role change drop - down .
*
* @ since 3.1 . 0
*
* @ return string The bulk action required .
*/
public function current_action () {
if ( ( isset ( $_REQUEST [ 'changeit' ] ) || isset ( $_REQUEST [ 'changeit2' ] ) ) &&
( ! empty ( $_REQUEST [ 'new_role' ] ) || ! empty ( $_REQUEST [ 'new_role2' ] ) ) ) {
return 'promote' ;
}
return parent :: current_action ();
}
/**
* Get a list of columns for the list table .
*
* @ since 3.1 . 0
*
* @ return array Array in which the key is the ID of the column ,
* and the value is the description .
*/
public function get_columns () {
$c = array (
'cb' => '<input type="checkbox" />' ,
'username' => __ ( 'Username' ),
'name' => __ ( 'Name' ),
'email' => __ ( 'Email' ),
'role' => __ ( 'Role' ),
2019-04-16 19:56:22 +00:00
'posts' => __ ( 'Posts' ),
2019-03-12 09:27:46 +00:00
);
2019-04-16 19:56:22 +00:00
if ( $this -> is_site_users ) {
2019-03-12 09:27:46 +00:00
unset ( $c [ 'posts' ] );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
return $c ;
}
/**
* Get a list of sortable columns for the list table .
*
* @ since 3.1 . 0
*
* @ return array Array of sortable columns .
*/
protected function get_sortable_columns () {
$c = array (
'username' => 'login' ,
'email' => 'email' ,
);
return $c ;
}
/**
* Generate the list table rows .
*
* @ since 3.1 . 0
*/
public function display_rows () {
// Query the post counts for this page
2019-04-16 19:56:22 +00:00
if ( ! $this -> is_site_users ) {
2019-03-12 09:27:46 +00:00
$post_counts = count_many_users_posts ( array_keys ( $this -> items ) );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
foreach ( $this -> items as $userid => $user_object ) {
echo " \n \t " . $this -> single_row ( $user_object , '' , '' , isset ( $post_counts ) ? $post_counts [ $userid ] : 0 );
}
}
/**
* Generate HTML for a single row on the users . php admin panel .
*
* @ since 3.1 . 0
* @ since 4.2 . 0 The `$style` parameter was deprecated .
* @ since 4.4 . 0 The `$role` parameter was deprecated .
*
* @ param WP_User $user_object The current user object .
* @ param string $style Deprecated . Not used .
* @ param string $role Deprecated . Not used .
* @ param int $numposts Optional . Post count to display for this user . Defaults
* to zero , as in , a new user has made zero posts .
* @ return string Output for a single row .
*/
public function single_row ( $user_object , $style = '' , $role = '' , $numposts = 0 ) {
if ( ! ( $user_object instanceof WP_User ) ) {
$user_object = get_userdata ( ( int ) $user_object );
}
$user_object -> filter = 'display' ;
2019-04-16 19:56:22 +00:00
$email = $user_object -> user_email ;
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( $this -> is_site_users ) {
2019-03-12 09:27:46 +00:00
$url = " site-users.php?id= { $this -> site_id } & " ;
2019-04-16 19:56:22 +00:00
} else {
2019-03-12 09:27:46 +00:00
$url = 'users.php?' ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$user_roles = $this -> get_role_list ( $user_object );
// Set up the hover actions for this user
2019-04-16 19:56:22 +00:00
$actions = array ();
$checkbox = '' ;
2019-03-12 09:27:46 +00:00
$super_admin = '' ;
if ( is_multisite () && current_user_can ( 'manage_network_users' ) ) {
if ( in_array ( $user_object -> user_login , get_super_admins (), true ) ) {
$super_admin = ' — ' . __ ( 'Super Admin' );
}
}
// Check if the user for this row is editable
if ( current_user_can ( 'list_users' ) ) {
// Set up the user editing link
$edit_link = esc_url ( add_query_arg ( 'wp_http_referer' , urlencode ( wp_unslash ( $_SERVER [ 'REQUEST_URI' ] ) ), get_edit_user_link ( $user_object -> ID ) ) );
2019-04-16 19:56:22 +00:00
if ( current_user_can ( 'edit_user' , $user_object -> ID ) ) {
$edit = " <strong><a href= \" { $edit_link } \" > { $user_object -> user_login } </a> { $super_admin } </strong><br /> " ;
2019-03-12 09:27:46 +00:00
$actions [ 'edit' ] = '<a href="' . $edit_link . '">' . __ ( 'Edit' ) . '</a>' ;
} else {
$edit = " <strong> { $user_object -> user_login } { $super_admin } </strong><br /> " ;
}
2019-04-16 19:56:22 +00:00
if ( ! is_multisite () && get_current_user_id () != $user_object -> ID && current_user_can ( 'delete_user' , $user_object -> ID ) ) {
$actions [ 'delete' ] = " <a class='submitdelete' href=' " . wp_nonce_url ( " users.php?action=delete&user= $user_object->ID " , 'bulk-users' ) . " '> " . __ ( 'Delete' ) . '</a>' ;
}
if ( is_multisite () && get_current_user_id () != $user_object -> ID && current_user_can ( 'remove_user' , $user_object -> ID ) ) {
$actions [ 'remove' ] = " <a class='submitdelete' href=' " . wp_nonce_url ( $url . " action=remove&user= $user_object->ID " , 'bulk-users' ) . " '> " . __ ( 'Remove' ) . '</a>' ;
}
2019-03-12 09:27:46 +00:00
// Add a link to the user's author archive, if not empty.
$author_posts_url = get_author_posts_url ( $user_object -> ID );
if ( $author_posts_url ) {
$actions [ 'view' ] = sprintf (
'<a href="%s" aria-label="%s">%s</a>' ,
esc_url ( $author_posts_url ),
/* translators: %s: author's display name */
esc_attr ( sprintf ( __ ( 'View posts by %s' ), $user_object -> display_name ) ),
__ ( 'View' )
);
}
/**
* Filters the action links displayed under each user in the Users list table .
*
* @ since 2.8 . 0
*
2019-04-16 19:56:22 +00:00
* @ param string [] $actions An array of action links to be displayed .
* Default 'Edit' , 'Delete' for single site , and
* 'Edit' , 'Remove' for Multisite .
* @ param WP_User $user_object WP_User object for the currently listed user .
2019-03-12 09:27:46 +00:00
*/
$actions = apply_filters ( 'user_row_actions' , $actions , $user_object );
// Role classes.
$role_classes = esc_attr ( implode ( ' ' , array_keys ( $user_roles ) ) );
// Set up the checkbox ( because the user is editable, otherwise it's empty )
$checkbox = '<label class="screen-reader-text" for="user_' . $user_object -> ID . '">' . sprintf ( __ ( 'Select %s' ), $user_object -> user_login ) . '</label>'
. " <input type='checkbox' name='users[]' id='user_ { $user_object -> ID } ' class=' { $role_classes } ' value=' { $user_object -> ID } ' /> " ;
} else {
$edit = " <strong> { $user_object -> user_login } { $super_admin } </strong> " ;
}
$avatar = get_avatar ( $user_object -> ID , 32 );
// Comma-separated list of user roles.
$roles_list = implode ( ', ' , $user_roles );
$r = " <tr id='user- $user_object->ID '> " ;
list ( $columns , $hidden , $sortable , $primary ) = $this -> get_column_info ();
foreach ( $columns as $column_name => $column_display_name ) {
$classes = " $column_name column- $column_name " ;
if ( $primary === $column_name ) {
$classes .= ' has-row-actions column-primary' ;
}
if ( 'posts' === $column_name ) {
$classes .= ' num' ; // Special case for that column
}
if ( in_array ( $column_name , $hidden ) ) {
$classes .= ' hidden' ;
}
$data = 'data-colname="' . wp_strip_all_tags ( $column_display_name ) . '"' ;
$attributes = " class=' $classes ' $data " ;
if ( 'cb' === $column_name ) {
$r .= " <th scope='row' class='check-column'> $checkbox </th> " ;
} else {
$r .= " <td $attributes > " ;
switch ( $column_name ) {
case 'username' :
$r .= " $avatar $edit " ;
break ;
case 'name' :
if ( $user_object -> first_name && $user_object -> last_name ) {
$r .= " $user_object->first_name $user_object->last_name " ;
} elseif ( $user_object -> first_name ) {
$r .= $user_object -> first_name ;
} elseif ( $user_object -> last_name ) {
$r .= $user_object -> last_name ;
} else {
$r .= '<span aria-hidden="true">—</span><span class="screen-reader-text">' . _x ( 'Unknown' , 'name' ) . '</span>' ;
}
break ;
case 'email' :
$r .= " <a href=' " . esc_url ( " mailto: $email " ) . " '> $email </a> " ;
break ;
case 'role' :
$r .= esc_html ( $roles_list );
break ;
case 'posts' :
if ( $numposts > 0 ) {
$r .= " <a href='edit.php?author= $user_object->ID ' class='edit'> " ;
$r .= '<span aria-hidden="true">' . $numposts . '</span>' ;
$r .= '<span class="screen-reader-text">' . sprintf ( _n ( '%s post by this author' , '%s posts by this author' , $numposts ), number_format_i18n ( $numposts ) ) . '</span>' ;
$r .= '</a>' ;
} else {
$r .= 0 ;
}
break ;
default :
/**
* Filters the display output of custom columns in the Users list table .
*
* @ since 2.8 . 0
*
* @ param string $output Custom column output . Default empty .
* @ param string $column_name Column name .
* @ param int $user_id ID of the currently - listed user .
*/
$r .= apply_filters ( 'manage_users_custom_column' , '' , $column_name , $user_object -> ID );
}
if ( $primary === $column_name ) {
$r .= $this -> row_actions ( $actions );
}
2019-04-16 19:56:22 +00:00
$r .= '</td>' ;
2019-03-12 09:27:46 +00:00
}
}
$r .= '</tr>' ;
return $r ;
}
/**
* Gets the name of the default primary column .
*
* @ since 4.3 . 0
*
* @ return string Name of the default primary column , in this case , 'username' .
*/
protected function get_default_primary_column_name () {
return 'username' ;
}
/**
* Returns an array of user roles for a given user object .
*
* @ since 4.4 . 0
*
* @ param WP_User $user_object The WP_User object .
2019-04-16 19:56:22 +00:00
* @ return string [] An array of user roles .
2019-03-12 09:27:46 +00:00
*/
protected function get_role_list ( $user_object ) {
$wp_roles = wp_roles ();
$role_list = array ();
foreach ( $user_object -> roles as $role ) {
if ( isset ( $wp_roles -> role_names [ $role ] ) ) {
$role_list [ $role ] = translate_user_role ( $wp_roles -> role_names [ $role ] );
}
}
if ( empty ( $role_list ) ) {
$role_list [ 'none' ] = _x ( 'None' , 'no user roles' );
}
/**
* Filters the returned array of roles for a user .
*
* @ since 4.4 . 0
*
2019-04-16 19:56:22 +00:00
* @ param string [] $role_list An array of user roles .
* @ param WP_User $user_object A WP_User object .
2019-03-12 09:27:46 +00:00
*/
return apply_filters ( 'get_role_list' , $role_list , $user_object );
}
}