Improve user listing performance. Props miqrogroove. see #11914

git-svn-id: http://svn.automattic.com/wordpress/trunk@13576 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
ryan
2010-03-03 19:08:30 +00:00
parent 097b18b559
commit 086ad7d933
7 changed files with 287 additions and 49 deletions

View File

@@ -146,7 +146,8 @@ CREATE TABLE $wpdb->posts (
PRIMARY KEY (ID),
KEY post_name (post_name),
KEY type_status_date (post_type,post_status,post_date,ID),
KEY post_parent (post_parent)
KEY post_parent (post_parent),
KEY post_author (post_author)
) $charset_collate;
CREATE TABLE $wpdb->users (
ID bigint(20) unsigned NOT NULL auto_increment,

View File

@@ -1824,16 +1824,17 @@ function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_
}
/**
* {@internal Missing Short Description}}
* Generate HTML for a single row on the users.php admin panel.
*
* @since unknown
* @since 2.1.0
*
* @param unknown_type $user_object
* @param unknown_type $style
* @param unknown_type $role
* @return unknown
* @param object $user_object
* @param string $style Optional. Attributes added to the TR element. Must be sanitized.
* @param string $role Key for the $wp_roles array.
* @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
*/
function user_row( $user_object, $style = '', $role = '' ) {
function user_row( $user_object, $style = '', $role = '', $numposts = 0 ) {
global $wp_roles;
$current_user = wp_get_current_user();
@@ -1849,7 +1850,6 @@ function user_row( $user_object, $style = '', $role = '' ) {
$short_url = substr( $short_url, 0, -1 );
if ( strlen( $short_url ) > 35 )
$short_url = substr( $short_url, 0, 32 ).'...';
$numposts = get_usernumposts( $user_object->ID );
$checkbox = '';
// Check if the user for this row is editable
if ( current_user_can( 'edit_user', $user_object->ID ) ) {

View File

@@ -208,9 +208,15 @@ default:
$userspage = isset($_GET['userspage']) ? $_GET['userspage'] : null;
$role = isset($_GET['role']) ? $_GET['role'] : null;
// Query the users
// Query the user IDs for this page
$wp_user_search = new WP_User_Search($usersearch, $userspage, $role);
// Query the post counts for this page
$post_counts = count_many_users_posts($wp_user_search->get_results());
// Query the users for this page
cache_users($wp_user_search->get_results());
$messages = array();
if ( isset($_GET['update']) ) :
switch($_GET['update']) {
@@ -263,22 +269,14 @@ if ( isset($_GET['usersearch']) && $_GET['usersearch'] )
<form id="list-filter" action="" method="get">
<ul class="subsubsub">
<?php
$role_links = array();
$avail_roles = array();
$users_of_blog = get_users_of_blog();
$total_users = count( $users_of_blog );
foreach ( (array) $users_of_blog as $b_user ) {
$b_roles = unserialize($b_user->meta_value);
foreach ( (array) $b_roles as $b_role => $val ) {
if ( !isset($avail_roles[$b_role]) )
$avail_roles[$b_role] = 0;
$avail_roles[$b_role]++;
}
}
$users_of_blog = count_users();
$total_users = $users_of_blog['total_users'];
$avail_roles =& $users_of_blog['avail_roles'];
unset($users_of_blog);
$current_role = false;
$class = empty($role) ? ' class="current"' : '';
$role_links = array();
$role_links[] = "<li><a href='users.php'$class>" . 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 ) {
if ( !isset($avail_roles[$this_role]) )
@@ -372,7 +370,7 @@ foreach ( $wp_user_search->get_results() as $userid ) {
$role = array_shift($roles);
$style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';
echo "\n\t" . user_row($user_object, $style, $role);
echo "\n\t", user_row($user_object, $style, $role, $post_counts[(string)$userid]);
}
?>
</tbody>