Ticket #11914: 11914.2.diff
File 11914.2.diff, 10.2 KB (added by , 15 years ago) |
---|
-
wp-admin/includes/schema.php
145 145 PRIMARY KEY (ID), 146 146 KEY post_name (post_name), 147 147 KEY type_status_date (post_type,post_status,post_date,ID), 148 KEY post_parent (post_parent) 148 KEY post_parent (post_parent), 149 KEY post_author (post_author) 149 150 ) $charset_collate; 150 151 CREATE TABLE $wpdb->users ( 151 152 ID bigint(20) unsigned NOT NULL auto_increment, -
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/post.php
3623 3623 * @return string SQL code that can be added to a where clause. 3624 3624 */ 3625 3625 function get_private_posts_cap_sql($post_type) { 3626 global $user_ID;3627 $cap = ''; 3626 return get_posts_by_author_sql($post_type, FALSE); 3627 } 3628 3628 3629 /** 3630 * Retrieve the post SQL based on capability, author, and type. 3631 * 3632 * See above for full description. 3633 * 3634 * @since 3.0.0 3635 * @param string $post_type currently only supports 'post' or 'page'. 3636 * @param bool $full Optional. Returns a full WHERE statement instead of just an 'andalso' term. 3637 * @param int $post_author Optional. Query posts having a single author ID. 3638 * @return string SQL WHERE code that can be added to a query. 3639 */ 3640 function get_posts_by_author_sql($post_type, $full = TRUE, $post_author = NULL) { 3641 global $user_ID, $wpdb; 3642 3629 3643 // Private posts 3630 3644 if ($post_type == 'post') { 3631 3645 $cap = 'read_private_posts'; … … 3634 3648 $cap = 'read_private_pages'; 3635 3649 // Dunno what it is, maybe plugins have their own post type? 3636 3650 } else { 3651 $cap = ''; 3637 3652 $cap = apply_filters('pub_priv_sql_capability', $cap); 3638 3653 3639 3654 if (empty($cap)) { 3640 3655 // We don't know what it is, filters don't change anything, 3641 3656 // so set the SQL up to return nothing. 3642 return ' 1 = 0';3657 return ' 1 = 0 '; 3643 3658 } 3644 3659 } 3645 3660 3646 $sql = '(post_status = \'publish\''; 3661 if ($full) { 3662 if (is_null($post_author)) { 3663 $sql = $wpdb->prepare('WHERE post_type = %s AND ', $post_type); 3664 } else { 3665 $sql = $wpdb->prepare('WHERE post_author = %d AND post_type = %s AND ', $post_author, $post_type); 3666 } 3667 } else { 3668 $sql = ''; 3669 } 3647 3670 3671 $sql .= "(post_status = 'publish'"; 3672 3648 3673 if (current_user_can($cap)) { 3649 3674 // Does the user have the capability to view private posts? Guess so. 3650 $sql .= ' OR post_status = \'private\'';3675 $sql .= " OR post_status = 'private'"; 3651 3676 } elseif (is_user_logged_in()) { 3652 3677 // Users can view their own private posts. 3653 $sql .= ' OR post_status = \'private\' AND post_author = \'' . $user_ID . '\''; 3654 } 3678 $id = (int) $user_ID; 3679 if (is_null($post_author)) { 3680 $sql .= " OR post_status = 'private' AND post_author = $id"; 3681 } elseif ($id == (int)$post_author) { 3682 $sql .= " OR post_status = 'private'"; 3683 } // else none 3684 } // else none 3655 3685 3656 3686 $sql .= ')'; 3657 3687 … … 4443 4473 4444 4474 add_filter('the_preview', '_set_preview'); 4445 4475 } 4446 } 4447 No newline at end of file 4476 } -
wp-includes/user.php
178 178 */ 179 179 function get_usernumposts($userid) { 180 180 global $wpdb; 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')); 181 182 $where = get_posts_by_author_sql('post', TRUE, $userid); 183 184 $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" ); 185 183 186 return apply_filters('get_usernumposts', $count, $userid); 184 187 } 185 188 186 189 /** 190 * Number of posts written by a list of users. 191 * 192 * @since 3.0.0 193 * @param array $userid User ID number list. 194 * @return array Amount of posts each user has written. 195 */ 196 function get_users_numposts($users) { 197 global $wpdb; 198 199 if (0 == count($users)) 200 return array(); 201 202 $userlist = implode(',', $users); 203 $where = get_posts_by_author_sql('post'); 204 205 $result = $wpdb->get_results( "SELECT post_author, COUNT(*) FROM $wpdb->posts $where AND post_author IN ($userlist) GROUP BY post_author", ARRAY_N ); 206 207 $count = array(); 208 foreach($result as $row) { 209 $count[$row[0]] = $row[1]; 210 } 211 212 foreach($users as $id) { 213 $id = (string) $id; 214 if (!isset($count[$id])) 215 $count[$id] = 0; 216 } 217 218 return $count; 219 } 220 221 /** 187 222 * Check that the user login name and password is correct. 188 223 * 189 224 * @since 0.71 … … 440 475 return true; 441 476 } 442 477 478 /** 479 * Count number of users who have each of the user roles. 480 * 481 * Assumes there are neither duplicated nor orphaned capabilities meta_values. 482 * Assumes the serialized array values are meaningless, only array keys are used. 483 * Intended scale for this version is 10^5 users. It is not quite capable of that yet due to WP Bug #12257 484 * Memory exhaustion is expected at higher orders. 485 * 486 * @since 3.0.0 487 * @return array Includes a grand total and an array of counts indexed by role strings. 488 */ 489 function count_blog_users_by_role_inmem() { 490 global $wpdb, $blog_id; 491 492 $id = (int) $blog_id; 493 $blog_prefix = $wpdb->get_blog_prefix($id); 494 $avail_roles = array(); 495 496 $users_of_blog = $wpdb->get_col( "SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'" ); 497 498 foreach ( $users_of_blog as $caps_meta ) { 499 $b_roles = unserialize($caps_meta); 500 if ( is_array($b_roles) ) { 501 foreach ( $b_roles as $b_role => $val ) { 502 if ( isset($avail_roles[$b_role]) ) 503 $avail_roles[$b_role]++; 504 else 505 $avail_roles[$b_role] = 1; 506 } 507 } 508 } 509 510 $result = array(); 511 $result['total_users'] = count( $users_of_blog ); 512 $result['avail_roles'] =& $avail_roles; 513 514 return $result; 515 } 516 517 /** 518 * Count number of users who have each of the user roles. 519 * 520 * Assumes there are neither duplicated nor orphaned capabilities meta_values. 521 * Assumes role names are unique phrases. Same assumption made by WP_User_Search::prepare_query() 522 * Intended scale for this version is 10^7 users. 523 * CPU exhaustion is expected at higher orders. 524 * 525 * @since 3.0.0 526 * @return array Includes a grand total and an array of counts indexed by role strings. 527 */ 528 function count_blog_users_by_role_intime() { 529 global $wpdb, $blog_id, $wp_roles; 530 531 // Initialize 532 $id = (int) $blog_id; 533 $blog_prefix = $wpdb->get_blog_prefix($id); 534 $avail_roles = $wp_roles->get_names(); 535 536 // Build a CPU-intensive query that will return concise information. 537 $select_count = array(); 538 foreach ( $avail_roles as $this_role => $name ) { 539 $select_count[] = "COUNT(NULLIF(`meta_value` LIKE '%" . like_escape($this_role) . "%', FALSE))"; 540 } 541 $select_count = implode(', ', $select_count); 542 543 // Add the meta_value index to the selection list, then run the query. 544 $row = $wpdb->get_row( "SELECT $select_count, COUNT(*) FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'", ARRAY_N ); 545 546 // Run the previous loop again to associate results with role names. 547 $col = 0; 548 $role_counts = array(); 549 foreach ( $avail_roles as $this_role => $name ) { 550 $count = (int) $row[$col++]; 551 if ($count > 0) 552 $role_counts[$this_role] = $count; 553 } 554 555 // Get the meta_value index from the end of the result set. 556 $total_users = (int) $row[$col]; 557 558 $result = array(); 559 $result['total_users'] = $total_users; 560 $result['avail_roles'] =& $role_counts; 561 562 return $result; 563 } 564 443 565 // 444 566 // Private helper functions 445 567 //