Users: Introduce the concept of a large site in order to speed up the Users screen when there are many users.

Calling the `count_users()` function is expensive, regardless of the counting strategy that's used, and it gets
slower the more users there are on a site. In order to speed up the Users screen in the admin area, calling
`count_users()` can be avoided entirely while still displaying the total count for users.

This introduces some new functions:

* `wp_is_large_user_count()`
* `wp_get_active_user_count()`
* `wp_update_active_user_count()`

A corresponding `wp_is_large_user_count` filter is also introduced.

Props tharsheblows, johnbillion

Fixes #38741


git-svn-id: https://develop.svn.wordpress.org/trunk@41613 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
John Blackbourn
2017-09-27 13:03:03 +00:00
parent 0c1d3f62f3
commit 1507df9d59
6 changed files with 167 additions and 17 deletions
@@ -166,27 +166,48 @@ class WP_Users_List_Table extends WP_List_Table {
global $role;
$wp_roles = wp_roles();
$count_users = true;
if ( wp_is_large_user_count() ) {
$count_users = false;
} elseif ( is_multisite() && wp_is_large_network( 'users' ) ) {
$count_users = false;
}
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();
if ( $count_users ) {
switch_to_blog( $this->site_id );
$users_of_blog = count_users( 'time', $this->site_id );
restore_current_blog();
}
} else {
$url = 'users.php';
$users_of_blog = count_users();
if ( $count_users ) {
$users_of_blog = count_users();
}
}
$total_users = $users_of_blog['total_users'];
$avail_roles =& $users_of_blog['avail_roles'];
unset($users_of_blog);
if ( $count_users ) {
$total_users = $users_of_blog['total_users'];
$avail_roles =& $users_of_blog['avail_roles'];
unset($users_of_blog);
} else {
$avail_roles = array();
}
$class = empty($role) ? ' class="current"' : '';
$role_links = array();
$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>';
if ( $count_users ) {
$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>';
} else {
$role_links['all'] = "<a href='$url'$class>" . _x( 'All', 'users' ) . '</a>';
}
foreach ( $wp_roles->get_names() as $this_role => $name ) {
if ( !isset($avail_roles[$this_role]) )
if ( $count_users && !isset($avail_roles[$this_role]) ) {
continue;
}
$class = '';
@@ -195,12 +216,14 @@ class WP_Users_List_Table extends WP_List_Table {
}
$name = translate_user_role( $name );
/* translators: User role name with count */
$name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, number_format_i18n( $avail_roles[$this_role] ) );
if ( $count_users ) {
/* translators: User role name with count */
$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 ) ) . "'$class>$name</a>";
}
if ( ! empty( $avail_roles['none' ] ) ) {
if ( ! $count_users || ! empty( $avail_roles['none' ] ) ) {
$class = '';
@@ -209,8 +232,10 @@ class WP_Users_List_Table extends WP_List_Table {
}
$name = __( 'No role' );
/* translators: User role name with count */
$name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, number_format_i18n( $avail_roles['none' ] ) );
if ( $count_users ) {
/* translators: User role name with count */
$name = sprintf( __('%1$s <span class="count">(%2$s)</span>'), $name, number_format_i18n( $avail_roles['none' ] ) );
}
$role_links['none'] = "<a href='" . esc_url( add_query_arg( 'role', 'none', $url ) ) . "'$class>$name</a>";
}