2010-10-25 02:57:43 +00:00
<? php
/**
2010-10-25 04:04:18 +00:00
* Users List Table class.
2010-10-25 02:57:43 +00:00
*
2010-10-25 04:04:18 +00:00
* @since 3.1.0
2011-01-16 21:47:24 +00:00
* @access private
2014-02-26 22:20:17 +00:00
*
* @package WordPress
* @subpackage List_Table
2010-10-25 02:57:43 +00:00
*/
2010-11-04 08:07:03 +00:00
class WP_Users_List_Table extends WP_List_Table {
2010-12-13 21:21:50 +00:00
2014-02-26 22:20:17 +00:00
/**
* Site ID to generate the Users list table for.
*
* @since 3.1.0
* @access public
* @var int
*/
2014-05-19 01:19:14 +00:00
public $site_id ;
2014-02-26 22:20:17 +00:00
/**
* Whether or not the current Users list table is for Multisite.
*
* @since 3.1.0
* @access public
* @var bool
*/
2014-05-19 01:19:14 +00:00
public $is_site_users ;
2010-12-13 21:21:50 +00:00
2014-02-26 22:20:17 +00:00
/**
* Constructor.
2014-09-04 15:23:16 +00:00
*
2014-02-26 22:20:17 +00:00
* @since 3.1.0
2014-08-10 02:22:16 +00:00
* @access public
2014-08-10 02:18:17 +00:00
*
* @see WP_List_Table::__construct() for more information on default arguments.
*
* @param array $args An associative array of arguments.
2014-09-04 15:23:16 +00:00
*/
2014-05-19 01:19:14 +00:00
public function __construct ( $args = array () ) {
2011-04-29 20:05:12 +00:00
parent :: __construct ( array (
2010-11-24 05:31:25 +00:00
'singular' => 'user' ,
2012-09-19 12:43:31 +00:00
'plural' => 'users' ,
'screen' => isset ( $args [ 'screen' ] ) ? $args [ 'screen' ] : null ,
2010-11-24 05:31:25 +00:00
) );
2012-09-19 12:43:31 +00: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 05:31:25 +00:00
}
2010-10-25 02:57:43 +00:00
2014-02-26 22:20:17 +00:00
/**
* Check the current user's permissions.
*
* @since 3.1.0
* @access public
2015-05-29 20:17:26 +00:00
*
* @return bool
2014-02-26 22:20:17 +00:00
*/
2014-05-19 01:19:14 +00:00
public function ajax_user_can () {
2010-12-16 09:18:28 +00:00
if ( $this -> is_site_users )
return current_user_can ( 'manage_sites' );
else
return current_user_can ( 'list_users' );
2010-10-25 02:57:43 +00:00
}
2014-02-26 22:20:17 +00:00
/**
* Prepare the users list for display.
*
* @since 3.1.0
* @access public
2015-05-28 21:41:30 +00:00
*
* @global string $role
* @global string $usersearch
2014-02-26 22:20:17 +00:00
*/
2014-05-19 01:19:14 +00:00
public function prepare_items () {
2010-10-25 02:57:43 +00:00
global $role , $usersearch ;
2014-02-02 22:10:12 +00:00
$usersearch = isset ( $_REQUEST [ 's' ] ) ? wp_unslash ( trim ( $_REQUEST [ 's' ] ) ) : '' ;
2010-10-25 02:57:43 +00:00
$role = isset ( $_REQUEST [ 'role' ] ) ? $_REQUEST [ 'role' ] : '' ;
2010-11-24 16:54:53 +00: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-25 02:57:43 +00:00
$paged = $this -> get_pagenum ();
$args = array (
'number' => $users_per_page ,
'offset' => ( $paged - 1 ) * $users_per_page ,
'role' => $role ,
2010-12-17 00:38:15 +00:00
'search' => $usersearch ,
'fields' => 'all_with_meta'
2010-10-25 02:57:43 +00:00
);
2010-12-13 21:21:50 +00:00
2011-06-07 16:05:04 +00:00
if ( '' !== $args [ 'search' ] )
$args [ 'search' ] = '*' . $args [ 'search' ] . '*' ;
2010-12-30 23:38:21 +00:00
2010-11-24 05:31:25 +00:00
if ( $this -> is_site_users )
$args [ 'blog_id' ] = $this -> site_id ;
2010-10-25 02:57:43 +00: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 22:20:17 +00:00
/**
* Output 'no users' message.
*
* @since 3.1.0
* @access public
*/
2014-05-19 01:19:14 +00:00
public function no_items () {
2015-03-11 15:25:28 +00:00
_e ( 'No users found.' );
2010-10-25 02:57:43 +00:00
}
2014-02-26 22:20:17 +00: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 22:09:16 +00:00
* @access protected
2014-02-26 22:20:17 +00:00
*
2015-05-28 21:41:30 +00:00
* @global string $role
*
2014-02-26 22:20:17 +00:00
* @return array An array of HTML links, one for each view.
*/
2014-07-13 22:09:16 +00:00
protected function get_views () {
2015-05-28 21:41:30 +00:00
global $role ;
$wp_roles = wp_roles ();
2010-10-25 02:57:43 +00:00
2010-11-24 05:31:25 +00:00
if ( $this -> is_site_users ) {
2010-12-13 21:21:50 +00:00
$url = 'site-users.php?id=' . $this -> site_id ;
2010-11-24 05:31:25 +00: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-25 02:57:43 +00: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 05:31:25 +00: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-25 02:57:43 +00: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 05:35:57 +00:00
$name = sprintf ( __ ( '%1$s <span class="count">(%2$s)</span>' ), $name , number_format_i18n ( $avail_roles [ $this_role ] ) );
2011-06-02 17:05:55 +00:00
$role_links [ $this_role ] = "<a href='" . esc_url ( add_query_arg ( 'role' , $this_role , $url ) ) . "' $class > $name </a>" ;
2010-10-25 02:57:43 +00:00
}
return $role_links ;
}
2014-02-26 22:20:17 +00:00
/**
* Retrieve an associative array of bulk actions available on this table.
*
* @since 3.1.0
2014-07-13 22:09:16 +00:00
* @access protected
2014-02-26 22:20:17 +00:00
*
* @return array Array of bulk actions.
*/
2014-07-13 22:09:16 +00:00
protected function get_bulk_actions () {
2010-10-25 02:57:43 +00:00
$actions = array ();
2011-02-10 20:37:26 +00: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-25 02:57:43 +00:00
return $actions ;
}
2014-02-26 22:20:17 +00:00
/**
* Output the controls to allow user roles to be changed in bulk.
*
* @since 3.1.0
2014-07-13 22:09:16 +00:00
* @access protected
2014-02-26 22:20:17 +00:00
*
* @param string $which Whether this is being invoked above ("top")
* or below the table ("bottom").
*/
2014-07-13 22:09:16 +00:00
protected function extra_tablenav ( $which ) {
2010-10-25 02:57:43 +00:00
if ( 'top' != $which )
return ;
2012-11-07 07:59:46 +00:00
?>
2010-10-25 02:57:43 +00:00
<div class="alignleft actions">
2012-11-07 07:59:46 +00:00
<?php if ( current_user_can( 'promote_users' ) ) : ?>
2010-10-25 02:57:43 +00:00
<label class="screen-reader-text" for="new_role"><?php _e( 'Change role to…' ) ?></label>
<select name="new_role" id="new_role">
2014-05-19 01:59:15 +00:00
<option value=""><?php _e( 'Change role to…' ) ?></option>
2010-10-25 02:57:43 +00:00
<?php wp_dropdown_roles(); ?>
</select>
2012-11-07 07:59:46 +00:00
<?php
2012-11-07 18:34:46 +00:00
submit_button( __( 'Change' ), 'button', 'changeit', false );
2012-11-07 07:59:46 +00:00
endif;
2014-03-01 15:00:15 +00:00
/**
2014-03-02 20:32:15 +00:00
* Fires just before the closing div containing the bulk role-change controls
2014-03-01 15:00:15 +00:00
* in the Users list table.
*
* @since 3.5.0
*/
2012-11-07 07:59:46 +00:00
do_action( 'restrict_manage_users' );
echo '</div>';
2010-10-25 02:57:43 +00:00
}
2014-02-26 22:20:17 +00: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-19 01:19:14 +00:00
public function current_action() {
2010-10-25 02:57:43 +00:00
if ( isset($_REQUEST['changeit']) && !empty($_REQUEST['new_role']) )
return 'promote';
return parent::current_action();
}
2014-02-26 22:20:17 +00: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-19 01:19:14 +00:00
public function get_columns() {
2010-11-24 19:51:36 +00:00
$c = array(
2010-10-25 02:57:43 +00:00
'cb' => '<input type="checkbox" />',
2010-11-17 16:58:15 +00:00
'username' => __( 'Username' ),
2010-10-25 02:57:43 +00:00
'name' => __( 'Name' ),
'email' => __( 'E-mail' ),
'role' => __( 'Role' ),
'posts' => __( 'Posts' )
);
2010-11-24 19:51:36 +00:00
if ( $this->is_site_users )
unset( $c['posts'] );
2010-12-13 21:21:50 +00:00
2010-11-24 19:51:36 +00:00
return $c;
2010-10-25 02:57:43 +00:00
}
2014-02-26 22:20:17 +00:00
/**
* Get a list of sortable columns for the list table.
*
* @since 3.1.0
2014-07-13 22:09:16 +00:00
* @access protected
2014-02-26 22:20:17 +00:00
*
* @return array Array of sortable columns.
*/
2014-07-13 22:09:16 +00:00
protected function get_sortable_columns() {
2010-11-24 19:51:36 +00:00
$c = array(
2010-10-25 02:57:43 +00:00
'username' => 'login',
'name' => 'name',
'email' => 'email',
);
2010-12-13 21:21:50 +00:00
2010-11-24 19:51:36 +00:00
if ( $this->is_site_users )
unset( $c['posts'] );
return $c;
2010-10-25 02:57:43 +00:00
}
2014-02-26 22:20:17 +00:00
/**
* Generate the list table rows.
*
* @since 3.1.0
* @access public
*/
2014-05-19 01:19:14 +00:00
public function display_rows() {
2010-10-25 02:57:43 +00:00
// Query the post counts for this page
2010-12-08 09:28:20 +00:00
if ( ! $this->is_site_users )
2010-12-07 20:54:04 +00:00
$post_counts = count_many_users_posts( array_keys( $this->items ) );
2010-10-25 02:57:43 +00:00
2012-11-19 19:16:31 +00:00
$editable_roles = array_keys( get_editable_roles() );
2010-10-25 02:57:43 +00:00
foreach ( $this->items as $userid => $user_object ) {
2012-11-19 19:16:31 +00: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-25 02:57:43 +00:00
2012-11-19 21:43:47 +00:00
if ( is_multisite() && empty( $user_object->allcaps ) )
2010-10-25 02:57:43 +00:00
continue;
2015-01-14 22:14:22 +00:00
echo "\n\t" . $this->single_row( $user_object, $style = '', $role, isset( $post_counts ) ? $post_counts[ $userid ] : 0 );
2010-10-25 02:57:43 +00:00
}
}
/**
* Generate HTML for a single row on the users.php admin panel.
*
2014-02-26 22:20:17 +00:00
* @since 3.1.0
2015-04-04 21:09:27 +00:00
* @since 4.2.0 The `$style` argument was deprecated.
2014-02-26 22:20:17 +00:00
* @access public
2010-10-25 02:57:43 +00:00
*
2014-02-26 22:20:17 +00:00
* @param object $user_object The current user object.
2015-01-14 22:14:22 +00:00
* @param string $style Deprecated. Not used.
2014-02-26 22:20:17 +00: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-25 02:57:43 +00:00
*/
2014-05-19 01:19:14 +00:00
public function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {
2015-05-28 21:41:30 +00:00
$wp_roles = wp_roles();
2010-10-25 02:57:43 +00:00
2015-01-16 01:06:24 +00:00
if ( ! ( $user_object instanceof WP_User ) ) {
2012-08-03 01:06:05 +00:00
$user_object = get_userdata( (int) $user_object );
2015-01-16 01:06:24 +00:00
}
2011-08-24 19:32:59 +00:00
$user_object->filter = 'display';
2010-10-25 02:57:43 +00:00
$email = $user_object->user_email;
2010-12-13 21:21:50 +00:00
2010-11-24 05:31:25 +00:00
if ( $this->is_site_users )
$url = "site-users.php?id={$this->site_id}&";
else
$url = 'users.php?';
2010-11-22 17:17:31 +00:00
2010-10-25 02:57:43 +00: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 17:00:25 +00: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-25 02:57:43 +00: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 05:31:25 +00:00
$actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( $url."action=remove&user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>";
2014-03-01 15:00:15 +00:00
/**
2014-03-02 20:32:15 +00:00
* Filter the action links displayed under each user in the Users list table.
2014-03-01 15:00:15 +00:00
*
* @since 2.8.0
*
2014-03-02 20:32:15 +00: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 15:00:15 +00:00
* @param WP_User $user_object WP_User object for the currently-listed user.
*/
2010-10-25 02:57:43 +00:00
$actions = apply_filters( 'user_row_actions', $actions, $user_object );
2012-12-20 15:55:32 +00:00
// Set up the checkbox ( because the user is editable, otherwise it's empty )
2015-02-23 02:29:26 +00:00
$checkbox = '<label class="screen-reader-text" for="user_' . $user_object->ID . '">' . sprintf( __( 'Select %s' ), $user_object->user_login ) . '</label>'
2012-07-25 16:18:14 +00:00
. "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />";
2010-10-25 02:57:43 +00: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 22:14:22 +00:00
$r = "<tr id='user-$user_object->ID'>";
2010-11-13 20:47:34 +00:00
2015-05-29 02:41:25 +00:00
list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();
2010-10-25 02:57:43 +00:00
foreach ( $columns as $column_name => $column_display_name ) {
2015-05-29 02:41:25 +00:00
$classes = "$column_name column-$column_name";
if ( $primary === $column_name ) {
$classes .= ' has-row-actions column-primary';
}
2010-10-25 02:57:43 +00:00
$style = '';
2015-05-29 02:41:25 +00:00
if ( in_array( $column_name, $hidden ) ) {
2010-10-25 02:57:43 +00:00
$style = ' style="display:none;"';
2015-05-29 02:41:25 +00:00
}
$attributes = "class='$classes'$style";
2010-10-25 02:57:43 +00:00
2015-05-29 02:41:25 +00: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 08:40:26 +00:00
$r .= "<a href='mailto:$email'>$email</a>";
2015-05-29 02:41:25 +00:00
break;
case 'role':
$r .= $role_name;
break;
case 'posts':
$attributes = 'class="posts column-posts num"' . $style;
if ( $numposts > 0 ) {
2015-06-05 08:40:26 +00: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-29 02:41:25 +00: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-25 02:57:43 +00:00
}
}
$r .= '</tr>';
return $r;
}
2015-05-29 02:41:25 +00:00
/**
2015-05-31 01:45:27 +00:00
* Get the name of the default primary column.
2015-05-29 02:41:25 +00:00
*
* @since 4.3.0
* @access protected
*
2015-05-31 01:45:27 +00:00
* @return string Name of the default primary column, in this case, 'username'.
2015-05-29 02:41:25 +00:00
*/
protected function get_default_primary_column_name() {
return 'username';
}
2010-10-25 02:57:43 +00:00
}