The registration date is kept in the wp_users table, so that’s easy to get.
The last login date is a little trickier. Most plugins which implement a last login date column create a custom meta field to store it (in wp_usermeta), update it every time the user logs in, and retrieve it for display on the user list screen. However, WordPress already stores login dates (and related session information) in a meta field called session_tokens, so if you don’t need last login date to be sortable, you can extract the last login date from this array rather than storing it separately.
// add two columns to the user list page
add_filter( 'manage_users_columns', 'my_manage_users_columns' );
function my_manage_users_columns( $columns ) {
$columns['registration_date'] = 'Registered';
$columns['last_login_date'] = 'Last Logged In';
return $columns;
}
// provide data for the two added columns
add_filter( 'manage_users_custom_column', 'my_manage_users_custom_column', 10, 3 );
function my_manage_users_custom_column( $row_output, $column_id_attr, $user ) {
$date_format="Y/m/d \a\t g:i a";
$d1 = 0;
switch ( $column_id_attr ) {
case 'registration_date':
$d1 = strtotime(get_userdata($user)->user_registered);
break;
case 'last_login_date':
$session_tokens = get_user_meta( $user, 'session_tokens', true );
if (!empty($session_tokens)) {
$d1 = max(array_column(array_values($session_tokens),'login'));
}
break;
default:
}
if ($d1 > 0) {
$d2 = new DateTime("@$d1");
return $d2->setTimezone(wp_timezone())->format($date_format);
}
return $row_output;
}
// make the registration date column sortable
add_filter( 'manage_users_sortable_columns', 'my_manage_users_sortable_columns' );
function my_manage_users_sortable_columns( $columns ) {
return wp_parse_args( array( 'registration_date' => 'registered' ), $columns );
}