Ticket #11914: 11914.diff
File 11914.diff, 7.3 KB (added by , 15 years ago) |
---|
-
wp-admin/includes/template.php
1789 1789 } 1790 1790 1791 1791 /** 1792 * {@internal Missing Short Description}}1792 * Generate HTML for a single row on the users.php admin panel. 1793 1793 * 1794 1794 * @since unknown 1795 1795 * 1796 * @param unknown_type $user_object 1797 * @param unknown_type $style 1798 * @param unknown_type $role 1799 * @return unknown 1796 * @param object $user_object 1797 * @param string $style Optional. Attributes added to the TR element. Must be sanitized. 1798 * @param string $role Key for the $wp_roles array. 1799 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts. 1800 * @return string 1800 1801 */ 1801 function user_row( $user_object, $style = '', $role = '' ) {1802 function user_row( $user_object, $style = '', $role = '', $numposts = 0 ) { 1802 1803 global $wp_roles; 1803 1804 1804 1805 $current_user = wp_get_current_user(); … … 1814 1815 $short_url = substr( $short_url, 0, -1 ); 1815 1816 if ( strlen( $short_url ) > 35 ) 1816 1817 $short_url = substr( $short_url, 0, 32 ).'...'; 1817 $numposts = get_usernumposts( $user_object->ID );1818 1818 $checkbox = ''; 1819 1819 // Check if the user for this row is editable 1820 1820 if ( current_user_can( 'edit_user', $user_object->ID ) ) { -
wp-admin/users.php
208 208 $userspage = isset($_GET['userspage']) ? $_GET['userspage'] : null; 209 209 $role = isset($_GET['role']) ? $_GET['role'] : null; 210 210 211 // Query the user s211 // Query the user IDs for this page 212 212 $wp_user_search = new WP_User_Search($usersearch, $userspage, $role); 213 213 214 // Query the post counts for this page 215 $post_counts = get_users_numposts($wp_user_search->get_results()); 216 214 217 $messages = array(); 215 218 if ( isset($_GET['update']) ) : 216 219 switch($_GET['update']) { … … 265 268 <?php 266 269 $role_links = array(); 267 270 $avail_roles = array(); 268 $users_of_blog = get_users_of_blog(); 269 $total_users = count( $users_of_blog ); 270 foreach ( (array) $users_of_blog as $b_user ) { 271 $b_roles = unserialize($b_user->meta_value); 272 foreach ( (array) $b_roles as $b_role => $val ) { 273 if ( !isset($avail_roles[$b_role]) ) 274 $avail_roles[$b_role] = 0; 275 $avail_roles[$b_role]++; 276 } 277 } 271 272 $users_of_blog = count_blog_users_by_role_intime(); 273 $total_users = $users_of_blog['total_users']; 274 $avail_roles =& $users_of_blog['avail_roles']; 278 275 unset($users_of_blog); 279 276 280 277 $current_role = false; … … 372 369 $role = array_shift($roles); 373 370 374 371 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"'; 375 echo "\n\t" . user_row($user_object, $style, $role);372 echo "\n\t", user_row($user_object, $style, $role, $post_counts[(string)$userid]); 376 373 } 377 374 ?> 378 375 </tbody> -
wp-includes/user.php
179 179 function get_usernumposts($userid) { 180 180 global $wpdb; 181 181 $userid = (int) $userid; 182 $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->posts WHERE post_author = %d AND post_type = 'post' AND ", $userid) . get_private_posts_cap_sql('post'));182 $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->posts WHERE post_author = %d AND post_type = 'post' AND post_status IN ('publish', 'private')", $userid) ); 183 183 return apply_filters('get_usernumposts', $count, $userid); 184 184 } 185 185 186 186 /** 187 * Number of posts written by a list of users. 188 * 189 * @since 3.0.0 190 * @param array $userid User ID number list. 191 * @return array Amount of posts each user has written. 192 */ 193 function get_users_numposts($users) { 194 global $wpdb; 195 196 if (0 == count($users)) 197 return array(); 198 199 $userlist = implode(',', $users); 200 201 $result = $wpdb->get_results( "SELECT post_author, COUNT(*) FROM $wpdb->posts WHERE post_author IN ($userlist) AND post_type = 'post' AND post_status IN ('publish', 'private') GROUP BY post_author", ARRAY_N ); 202 203 $count = array(); 204 foreach($result as $row) { 205 $count[$row[0]] = $row[1]; 206 } 207 208 foreach($users as $id) { 209 $id = (string) $id; 210 if (!isset($count[$id])) 211 $count[$id] = 0; 212 } 213 214 return $count; 215 } 216 217 /** 187 218 * Check that the user login name and password is correct. 188 219 * 189 220 * @since 0.71 … … 440 471 return true; 441 472 } 442 473 474 /** 475 * Count number of users who have each of the user roles. 476 * 477 * Assumes there are neither duplicated nor orphaned capabilities meta_values. 478 * Assumes the serialized array values are meaningless, only array keys are used. 479 * Intended scale for this version is 10^5 users. It is not quite capable of that yet due to WP Bug #12257 480 * Memory exhaustion is expected at higher orders. 481 * 482 * @since 3.0.0 483 * @return array Includes a grand total and an array of counts indexed by role strings. 484 */ 485 function count_blog_users_by_role_inmem() { 486 global $wpdb, $blog_id; 487 488 $id = (int) $blog_id; 489 $blog_prefix = $wpdb->get_blog_prefix($id); 490 $avail_roles = array(); 491 492 $users_of_blog = $wpdb->get_col( "SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'" ); 493 494 foreach ( $users_of_blog as $caps_meta ) { 495 $b_roles = unserialize($caps_meta); 496 if ( is_array($b_roles) ) { 497 foreach ( $b_roles as $b_role => $val ) { 498 if ( isset($avail_roles[$b_role]) ) 499 $avail_roles[$b_role]++; 500 else 501 $avail_roles[$b_role] = 1; 502 } 503 } 504 } 505 506 $result = array(); 507 $result['total_users'] = count( $users_of_blog ); 508 $result['avail_roles'] =& $avail_roles; 509 510 return $result; 511 } 512 513 /** 514 * Count number of users who have each of the user roles. 515 * 516 * Assumes there are neither duplicated nor orphaned capabilities meta_values. 517 * Assumes role names are unique phrases. Same assumption made by WP_User_Search::prepare_query() 518 * Intended scale for this version is 10^7 users. 519 * CPU exhaustion is expected at higher orders. 520 * 521 * @since 3.0.0 522 * @return array Includes a grand total and an array of counts indexed by role strings. 523 */ 524 function count_blog_users_by_role_intime() { 525 global $wpdb, $blog_id, $wp_roles; 526 527 // Initialize 528 $id = (int) $blog_id; 529 $blog_prefix = $wpdb->get_blog_prefix($id); 530 $avail_roles = $wp_roles->get_names(); 531 532 // Build a CPU-intensive query that will return concise information. 533 $select_count = array(); 534 foreach ( $avail_roles as $this_role => $name ) { 535 $select_count[] = "COUNT(NULLIF(`meta_value` LIKE '%" . like_escape($this_role) . "%', FALSE))"; 536 } 537 $select_count = implode(', ', $select_count); 538 539 // Add the meta_value index to the selection list, then run the query. 540 $row = $wpdb->get_row( "SELECT $select_count, COUNT(*) FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'", ARRAY_N ); 541 542 // Run the previous loop again to associate results with role names. 543 $col = 0; 544 $role_counts = array(); 545 foreach ( $avail_roles as $this_role => $name ) { 546 $count = (int) $row[$col++]; 547 if ($count > 0) 548 $role_counts[$this_role] = $count; 549 } 550 551 // Get the meta_value index from the end of the result set. 552 $total_users = (int) $row[$col]; 553 554 $result = array(); 555 $result['total_users'] = $total_users; 556 $result['avail_roles'] =& $role_counts; 557 558 return $result; 559 } 560 443 561 // 444 562 // Private helper functions 445 563 //