2010-10-24 22:57:43 -04:00
< ? php
/**
2010-10-25 00:04:18 -04:00
* Users List Table class .
2010-10-24 22:57:43 -04:00
*
2010-10-25 00:04:18 -04:00
* @ since 3.1 . 0
2011-01-16 16:47:24 -05:00
* @ access private
2014-02-26 17:20:17 -05:00
*
* @ package WordPress
* @ subpackage List_Table
2010-10-24 22:57:43 -04:00
*/
2010-11-04 04:07:03 -04:00
class WP_Users_List_Table extends WP_List_Table {
2010-12-13 16:21:50 -05:00
2014-02-26 17:20:17 -05:00
/**
* Site ID to generate the Users list table for .
*
* @ since 3.1 . 0
* @ access public
* @ var int
*/
2014-05-18 21:19:14 -04:00
public $site_id ;
2014-02-26 17:20:17 -05:00
/**
* Whether or not the current Users list table is for Multisite .
*
* @ since 3.1 . 0
* @ access public
* @ var bool
*/
2014-05-18 21:19:14 -04:00
public $is_site_users ;
2010-12-13 16:21:50 -05:00
2014-02-26 17:20:17 -05:00
/**
* Constructor .
2014-09-04 11:23:16 -04:00
*
2014-02-26 17:20:17 -05:00
* @ since 3.1 . 0
2014-08-09 22:22:16 -04:00
* @ access public
2014-08-09 22:18:17 -04:00
*
* @ see WP_List_Table :: __construct () for more information on default arguments .
*
* @ param array $args An associative array of arguments .
2014-09-04 11:23:16 -04:00
*/
2014-05-18 21:19:14 -04:00
public function __construct ( $args = array () ) {
2011-04-29 16:05:12 -04:00
parent :: __construct ( array (
2010-11-24 00:31:25 -05:00
'singular' => 'user' ,
2012-09-19 08:43:31 -04:00
'plural' => 'users' ,
'screen' => isset ( $args [ 'screen' ] ) ? $args [ 'screen' ] : null ,
2010-11-24 00:31:25 -05:00
) );
2012-09-19 08:43:31 -04:00
$this -> is_site_users = 'site-users-network' == $this -> screen -> id ;
if ( $this -> is_site_users )
$this -> site_id = isset ( $_REQUEST [ 'id' ] ) ? intval ( $_REQUEST [ 'id' ] ) : 0 ;
2010-11-24 00:31:25 -05:00
}
2010-10-24 22:57:43 -04:00
2014-02-26 17:20:17 -05:00
/**
* Check the current user ' s permissions .
*
* @ since 3.1 . 0
* @ access public
2015-05-29 16:17:26 -04:00
*
* @ return bool
2014-02-26 17:20:17 -05:00
*/
2014-05-18 21:19:14 -04:00
public function ajax_user_can () {
2010-12-16 04:18:28 -05:00
if ( $this -> is_site_users )
return current_user_can ( 'manage_sites' );
else
return current_user_can ( 'list_users' );
2010-10-24 22:57:43 -04:00
}
2014-02-26 17:20:17 -05:00
/**
* Prepare the users list for display .
*
* @ since 3.1 . 0
* @ access public
2015-05-28 17:41:30 -04:00
*
* @ global string $role
* @ global string $usersearch
2014-02-26 17:20:17 -05:00
*/
2014-05-18 21:19:14 -04:00
public function prepare_items () {
2010-10-24 22:57:43 -04:00
global $role , $usersearch ;
2014-02-02 17:10:12 -05:00
$usersearch = isset ( $_REQUEST [ 's' ] ) ? wp_unslash ( trim ( $_REQUEST [ 's' ] ) ) : '' ;
2010-10-24 22:57:43 -04:00
$role = isset ( $_REQUEST [ 'role' ] ) ? $_REQUEST [ 'role' ] : '' ;
2010-11-24 11:54:53 -05:00
$per_page = ( $this -> is_site_users ) ? 'site_users_network_per_page' : 'users_per_page' ;
$users_per_page = $this -> get_items_per_page ( $per_page );
2010-10-24 22:57:43 -04:00
$paged = $this -> get_pagenum ();
$args = array (
'number' => $users_per_page ,
'offset' => ( $paged - 1 ) * $users_per_page ,
'role' => $role ,
2010-12-16 19:38:15 -05:00
'search' => $usersearch ,
'fields' => 'all_with_meta'
2010-10-24 22:57:43 -04:00
);
2010-12-13 16:21:50 -05:00
2011-06-07 12:05:04 -04:00
if ( '' !== $args [ 'search' ] )
$args [ 'search' ] = '*' . $args [ 'search' ] . '*' ;
2010-12-30 18:38:21 -05:00
2010-11-24 00:31:25 -05:00
if ( $this -> is_site_users )
$args [ 'blog_id' ] = $this -> site_id ;
2010-10-24 22:57:43 -04:00
if ( isset ( $_REQUEST [ 'orderby' ] ) )
$args [ 'orderby' ] = $_REQUEST [ 'orderby' ];
if ( isset ( $_REQUEST [ 'order' ] ) )
$args [ 'order' ] = $_REQUEST [ 'order' ];
// Query the user IDs for this page
$wp_user_search = new WP_User_Query ( $args );
$this -> items = $wp_user_search -> get_results ();
$this -> set_pagination_args ( array (
'total_items' => $wp_user_search -> get_total (),
'per_page' => $users_per_page ,
) );
}
2014-02-26 17:20:17 -05:00
/**
* Output 'no users' message .
*
* @ since 3.1 . 0
* @ access public
*/
2014-05-18 21:19:14 -04:00
public function no_items () {
2015-03-11 11:25:28 -04:00
_e ( 'No users found.' );
2010-10-24 22:57:43 -04:00
}
2014-02-26 17:20:17 -05:00
/**
* 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
* filtering of the user table .
*
* @ since 3.1 . 0
2014-07-13 18:09:16 -04:00
* @ access protected
2014-02-26 17:20:17 -05:00
*
2015-05-28 17:41:30 -04:00
* @ global string $role
*
2014-02-26 17:20:17 -05:00
* @ return array An array of HTML links , one for each view .
*/
2014-07-13 18:09:16 -04:00
protected function get_views () {
2015-05-28 17:41:30 -04:00
global $role ;
$wp_roles = wp_roles ();
2010-10-24 22:57:43 -04:00
2010-11-24 00:31:25 -05:00
if ( $this -> is_site_users ) {
2010-12-13 16:21:50 -05:00
$url = 'site-users.php?id=' . $this -> site_id ;
2010-11-24 00:31:25 -05:00
switch_to_blog ( $this -> site_id );
$users_of_blog = count_users ();
restore_current_blog ();
} else {
$url = 'users.php' ;
$users_of_blog = count_users ();
}
2010-10-24 22:57:43 -04:00
$total_users = $users_of_blog [ 'total_users' ];
$avail_roles =& $users_of_blog [ 'avail_roles' ];
unset ( $users_of_blog );
$class = empty ( $role ) ? ' class="current"' : '' ;
$role_links = array ();
2010-11-24 00:31:25 -05:00
$role_links [ 'all' ] = " <a href=' $url ' $class > " . sprintf ( _nx ( 'All <span class="count">(%s)</span>' , 'All <span class="count">(%s)</span>' , $total_users , 'users' ), number_format_i18n ( $total_users ) ) . '</a>' ;
2010-10-24 22:57:43 -04:00
foreach ( $wp_roles -> get_names () as $this_role => $name ) {
if ( ! isset ( $avail_roles [ $this_role ]) )
continue ;
$class = '' ;
if ( $this_role == $role ) {
$class = ' class="current"' ;
}
$name = translate_user_role ( $name );
/* translators: User role name with count */
2011-09-21 01:35:57 -04:00
$name = sprintf ( __ ( '%1$s <span class="count">(%2$s)</span>' ), $name , number_format_i18n ( $avail_roles [ $this_role ] ) );
2011-06-02 13:05:55 -04:00
$role_links [ $this_role ] = " <a href=' " . esc_url ( add_query_arg ( 'role' , $this_role , $url ) ) . " ' $class > $name </a> " ;
2010-10-24 22:57:43 -04:00
}
return $role_links ;
}
2014-02-26 17:20:17 -05:00
/**
* Retrieve an associative array of bulk actions available on this table .
*
* @ since 3.1 . 0
2014-07-13 18:09:16 -04:00
* @ access protected
2014-02-26 17:20:17 -05:00
*
* @ return array Array of bulk actions .
*/
2014-07-13 18:09:16 -04:00
protected function get_bulk_actions () {
2010-10-24 22:57:43 -04:00
$actions = array ();
2011-02-10 15:37:26 -05:00
if ( is_multisite () ) {
if ( current_user_can ( 'remove_users' ) )
$actions [ 'remove' ] = __ ( 'Remove' );
} else {
if ( current_user_can ( 'delete_users' ) )
$actions [ 'delete' ] = __ ( 'Delete' );
}
2010-10-24 22:57:43 -04:00
return $actions ;
}
2014-02-26 17:20:17 -05:00
/**
* Output the controls to allow user roles to be changed in bulk .
*
* @ since 3.1 . 0
2014-07-13 18:09:16 -04:00
* @ access protected
2014-02-26 17:20:17 -05:00
*
* @ param string $which Whether this is being invoked above ( " top " )
* or below the table ( " bottom " ) .
*/
2014-07-13 18:09:16 -04:00
protected function extra_tablenav ( $which ) {
2010-10-24 22:57:43 -04:00
if ( 'top' != $which )
return ;
2012-11-07 02:59:46 -05:00
?>
2010-10-24 22:57:43 -04:00
< div class = " alignleft actions " >
2012-11-07 02:59:46 -05:00
< ? php if ( current_user_can ( 'promote_users' ) ) : ?>
2010-10-24 22:57:43 -04:00
< label class = " screen-reader-text " for = " new_role " >< ? php _e ( 'Change role to…' ) ?> </label>
< select name = " new_role " id = " new_role " >
2014-05-18 21:59:15 -04:00
< option value = " " >< ? php _e ( 'Change role to…' ) ?> </option>
2010-10-24 22:57:43 -04:00
< ? php wp_dropdown_roles (); ?>
</ select >
2012-11-07 02:59:46 -05:00
< ? php
2012-11-07 13:34:46 -05:00
submit_button ( __ ( 'Change' ), 'button' , 'changeit' , false );
2012-11-07 02:59:46 -05:00
endif ;
2014-03-01 10:00:15 -05:00
/**
2014-03-02 15:32:15 -05:00
* Fires just before the closing div containing the bulk role - change controls
2014-03-01 10:00:15 -05:00
* in the Users list table .
*
* @ since 3.5 . 0
*/
2012-11-07 02:59:46 -05:00
do_action ( 'restrict_manage_users' );
echo '</div>' ;
2010-10-24 22:57:43 -04:00
}
2014-02-26 17:20:17 -05:00
/**
* 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
* @ access public
*
* @ return string The bulk action required .
*/
2014-05-18 21:19:14 -04:00
public function current_action () {
2010-10-24 22:57:43 -04:00
if ( isset ( $_REQUEST [ 'changeit' ]) && ! empty ( $_REQUEST [ 'new_role' ]) )
return 'promote' ;
return parent :: current_action ();
}
2014-02-26 17:20:17 -05:00
/**
* Get a list of columns for the list table .
*
* @ since 3.1 . 0
* @ access public
*
* @ return array Array in which the key is the ID of the column ,
* and the value is the description .
*/
2014-05-18 21:19:14 -04:00
public function get_columns () {
2010-11-24 14:51:36 -05:00
$c = array (
2010-10-24 22:57:43 -04:00
'cb' => '<input type="checkbox" />' ,
2010-11-17 11:58:15 -05:00
'username' => __ ( 'Username' ),
2010-10-24 22:57:43 -04:00
'name' => __ ( 'Name' ),
'email' => __ ( 'E-mail' ),
'role' => __ ( 'Role' ),
'posts' => __ ( 'Posts' )
);
2010-11-24 14:51:36 -05:00
if ( $this -> is_site_users )
unset ( $c [ 'posts' ] );
2010-12-13 16:21:50 -05:00
2010-11-24 14:51:36 -05:00
return $c ;
2010-10-24 22:57:43 -04:00
}
2014-02-26 17:20:17 -05:00
/**
* Get a list of sortable columns for the list table .
*
* @ since 3.1 . 0
2014-07-13 18:09:16 -04:00
* @ access protected
2014-02-26 17:20:17 -05:00
*
* @ return array Array of sortable columns .
*/
2014-07-13 18:09:16 -04:00
protected function get_sortable_columns () {
2010-11-24 14:51:36 -05:00
$c = array (
2010-10-24 22:57:43 -04:00
'username' => 'login' ,
'name' => 'name' ,
'email' => 'email' ,
);
2010-12-13 16:21:50 -05:00
2010-11-24 14:51:36 -05:00
if ( $this -> is_site_users )
unset ( $c [ 'posts' ] );
return $c ;
2010-10-24 22:57:43 -04:00
}
2014-02-26 17:20:17 -05:00
/**
* Generate the list table rows .
*
* @ since 3.1 . 0
* @ access public
*/
2014-05-18 21:19:14 -04:00
public function display_rows () {
2010-10-24 22:57:43 -04:00
// Query the post counts for this page
2010-12-08 04:28:20 -05:00
if ( ! $this -> is_site_users )
2010-12-07 15:54:04 -05:00
$post_counts = count_many_users_posts ( array_keys ( $this -> items ) );
2010-10-24 22:57:43 -04:00
Less insane multiple role handling in the users list table.
If the user has more than one role, opt to show the first role that is
'editable', if present. Otherwise, fall back to the remaining roles.
In the future, we should show a comma-separated list of all roles,
editable or otherwise, and this list should be filterable, either by user,
or by the roles which can appear. Probably both.
In multisite, only hide users that have no capabilities (in case they
possess a leftover, empty wp_xx_capabilities key from the MU days),
not users that have no role, as they may have a cap but no role.
see #22361. fixes #17860.
git-svn-id: http://core.svn.wordpress.org/trunk@22686 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-11-19 14:16:31 -05:00
$editable_roles = array_keys ( get_editable_roles () );
2010-10-24 22:57:43 -04:00
foreach ( $this -> items as $userid => $user_object ) {
Less insane multiple role handling in the users list table.
If the user has more than one role, opt to show the first role that is
'editable', if present. Otherwise, fall back to the remaining roles.
In the future, we should show a comma-separated list of all roles,
editable or otherwise, and this list should be filterable, either by user,
or by the roles which can appear. Probably both.
In multisite, only hide users that have no capabilities (in case they
possess a leftover, empty wp_xx_capabilities key from the MU days),
not users that have no role, as they may have a cap but no role.
see #22361. fixes #17860.
git-svn-id: http://core.svn.wordpress.org/trunk@22686 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-11-19 14:16:31 -05:00
if ( count ( $user_object -> roles ) <= 1 ) {
$role = reset ( $user_object -> roles );
} elseif ( $roles = array_intersect ( array_values ( $user_object -> roles ), $editable_roles ) ) {
$role = reset ( $roles );
} else {
$role = reset ( $user_object -> roles );
}
2010-10-24 22:57:43 -04:00
2012-11-19 16:43:47 -05:00
if ( is_multisite () && empty ( $user_object -> allcaps ) )
2010-10-24 22:57:43 -04:00
continue ;
2015-01-14 17:14:22 -05:00
echo " \n \t " . $this -> single_row ( $user_object , $style = '' , $role , isset ( $post_counts ) ? $post_counts [ $userid ] : 0 );
2010-10-24 22:57:43 -04:00
}
}
/**
* Generate HTML for a single row on the users . php admin panel .
*
2014-02-26 17:20:17 -05:00
* @ since 3.1 . 0
2015-04-04 17:09:27 -04:00
* @ since 4.2 . 0 The `$style` argument was deprecated .
2014-02-26 17:20:17 -05:00
* @ access public
2010-10-24 22:57:43 -04:00
*
2014-02-26 17:20:17 -05:00
* @ param object $user_object The current user object .
2015-01-14 17:14:22 -05:00
* @ param string $style Deprecated . Not used .
2014-02-26 17:20:17 -05:00
* @ param string $role Optional . Key for the $wp_roles array . Default empty .
* @ 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 .
2010-10-24 22:57:43 -04:00
*/
2014-05-18 21:19:14 -04:00
public function single_row ( $user_object , $style = '' , $role = '' , $numposts = 0 ) {
2015-05-28 17:41:30 -04:00
$wp_roles = wp_roles ();
2010-10-24 22:57:43 -04:00
2015-01-15 20:06:24 -05:00
if ( ! ( $user_object instanceof WP_User ) ) {
2012-08-02 21:06:05 -04:00
$user_object = get_userdata ( ( int ) $user_object );
2015-01-15 20:06:24 -05:00
}
2011-08-24 15:32:59 -04:00
$user_object -> filter = 'display' ;
2010-10-24 22:57:43 -04:00
$email = $user_object -> user_email ;
2010-12-13 16:21:50 -05:00
2010-11-24 00:31:25 -05:00
if ( $this -> is_site_users )
$url = " site-users.php?id= { $this -> site_id } & " ;
else
$url = 'users.php?' ;
2010-11-22 12:17:31 -05:00
2010-10-24 22:57:43 -04:00
$checkbox = '' ;
// Check if the user for this row is editable
if ( current_user_can ( 'list_users' ) ) {
// Set up the user editing link
2013-03-01 12:00:25 -05:00
$edit_link = esc_url ( add_query_arg ( 'wp_http_referer' , urlencode ( wp_unslash ( $_SERVER [ 'REQUEST_URI' ] ) ), get_edit_user_link ( $user_object -> ID ) ) );
2010-10-24 22:57:43 -04:00
// Set up the hover actions for this user
$actions = array ();
if ( current_user_can ( 'edit_user' , $user_object -> ID ) ) {
$edit = " <strong><a href= \" $edit_link\ " > $user_object -> user_login </ a ></ strong >< br /> " ;
$actions [ 'edit' ] = '<a href="' . $edit_link . '">' . __ ( 'Edit' ) . '</a>' ;
} else {
$edit = " <strong> $user_object->user_login </strong><br /> " ;
}
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 ) )
2010-11-24 00:31:25 -05:00
$actions [ 'remove' ] = " <a class='submitdelete' href=' " . wp_nonce_url ( $url . " action=remove&user= $user_object->ID " , 'bulk-users' ) . " '> " . __ ( 'Remove' ) . " </a> " ;
2014-03-01 10:00:15 -05:00
/**
2014-03-02 15:32:15 -05:00
* Filter the action links displayed under each user in the Users list table .
2014-03-01 10:00:15 -05:00
*
* @ since 2.8 . 0
*
2014-03-02 15:32:15 -05:00
* @ param array $actions An array of action links to be displayed .
* Default 'Edit' , 'Delete' for single site , and
* 'Edit' , 'Remove' for Multisite .
2014-03-01 10:00:15 -05:00
* @ param WP_User $user_object WP_User object for the currently - listed user .
*/
2010-10-24 22:57:43 -04:00
$actions = apply_filters ( 'user_row_actions' , $actions , $user_object );
2012-12-20 10:55:32 -05:00
// Set up the checkbox ( because the user is editable, otherwise it's empty )
2015-02-22 21:29:26 -05:00
$checkbox = '<label class="screen-reader-text" for="user_' . $user_object -> ID . '">' . sprintf ( __ ( 'Select %s' ), $user_object -> user_login ) . '</label>'
2012-07-25 12:18:14 -04:00
. " <input type='checkbox' name='users[]' id='user_ { $user_object -> ID } ' class=' $role ' value=' { $user_object -> ID } ' /> " ;
2010-10-24 22:57:43 -04:00
} else {
$edit = '<strong>' . $user_object -> user_login . '</strong>' ;
}
$role_name = isset ( $wp_roles -> role_names [ $role ] ) ? translate_user_role ( $wp_roles -> role_names [ $role ] ) : __ ( 'None' );
$avatar = get_avatar ( $user_object -> ID , 32 );
2015-01-14 17:14:22 -05:00
$r = " <tr id='user- $user_object->ID '> " ;
2010-11-13 15:47:34 -05:00
2015-05-28 22:41:25 -04:00
list ( $columns , $hidden , $sortable , $primary ) = $this -> get_column_info ();
2010-10-24 22:57:43 -04:00
foreach ( $columns as $column_name => $column_display_name ) {
2015-05-28 22:41:25 -04:00
$classes = " $column_name column- $column_name " ;
if ( $primary === $column_name ) {
$classes .= ' has-row-actions column-primary' ;
}
2015-06-09 21:46:27 -04:00
if ( 'posts' === $column_name ) {
$classes .= ' num' ; // Special case for that column
}
2010-10-24 22:57:43 -04:00
2015-05-28 22:41:25 -04:00
if ( in_array ( $column_name , $hidden ) ) {
2015-06-10 15:47:27 -04:00
$classes .= ' hidden' ;
2015-05-28 22:41:25 -04:00
}
2015-06-10 15:47:27 -04:00
$attributes = " class=' $classes ' " ;
2010-10-24 22:57:43 -04:00
2015-05-28 22:41:25 -04:00
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' :
$r .= " $user_object->first_name $user_object->last_name " ;
break ;
case 'email' :
2015-06-05 04:40:26 -04:00
$r .= " <a href='mailto: $email '> $email </a> " ;
2015-05-28 22:41:25 -04:00
break ;
case 'role' :
$r .= $role_name ;
break ;
case 'posts' :
if ( $numposts > 0 ) {
2015-06-05 04:40:26 -04:00
$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>' ;
2015-05-28 22:41:25 -04:00
$r .= '</a>' ;
} else {
$r .= 0 ;
}
break ;
default :
/**
* Filter 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 );
}
$r .= " </td> " ;
2010-10-24 22:57:43 -04:00
}
}
$r .= '</tr>' ;
return $r ;
}
2015-05-28 22:41:25 -04:00
/**
2015-05-30 21:45:27 -04:00
* Get the name of the default primary column .
2015-05-28 22:41:25 -04:00
*
* @ since 4.3 . 0
* @ access protected
*
2015-05-30 21:45:27 -04:00
* @ return string Name of the default primary column , in this case , 'username' .
2015-05-28 22:41:25 -04:00
*/
protected function get_default_primary_column_name () {
return 'username' ;
}
2010-10-24 22:57:43 -04:00
}