WordPress.org

Make WordPress Core

Ticket #5407: 5407.diff

File 5407.diff, 4.6 KB (added by Bobcat, 8 years ago)

Improve wp_list_authors() efficiency

  • wp-includes/author-template.php

     
    372372        $r = wp_parse_args( $args, $defaults ); 
    373373        extract($r, EXTR_SKIP); 
    374374 
     375        $exclude_admin = $exclude_admin ? "WHERE user_login <> 'admin'" : ''; 
     376 
    375377        $return = ''; 
    376378 
    377         // TODO:  Move select to get_authors(). 
    378         $authors = $wpdb->get_results("SELECT ID, user_nicename from $wpdb->users " . ($exclude_admin ? "WHERE user_login <> 'admin' " : '') . "ORDER BY display_name"); 
     379        $authors = (array) $wpdb->get_results(" 
     380                SELECT $wpdb->users.ID, user_nicename, display_name, COUNT($wpdb->posts.ID) AS posts 
     381                FROM $wpdb->users " . (!$hide_empty ? 'LEFT' : '') . " JOIN $wpdb->posts 
     382                        ON  $wpdb->posts.post_author = $wpdb->users.ID AND post_type = 'post' AND " . get_private_posts_cap_sql( 'post' ) . " 
     383                $exclude_admin 
     384                GROUP BY post_author 
     385                ORDER BY display_name"); 
    379386 
    380         $author_count = array(); 
    381         foreach ((array) $wpdb->get_results("SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE post_type = 'post' AND " . get_private_posts_cap_sql( 'post' ) . " GROUP BY post_author") as $row) { 
    382                 $author_count[$row->post_author] = $row->count; 
    383         } 
     387        if ( empty($authors) ) return false; 
    384388 
    385         foreach ( (array) $authors as $author ) { 
    386                 $author = get_userdata( $author->ID ); 
    387                 $posts = (isset($author_count[$author->ID])) ? $author_count[$author->ID] : 0; 
    388                 $name = $author->display_name; 
     389        if ( $show_fullname ) { 
     390                $user_ids = $wpdb->get_col(null); 
    389391 
    390                 if ( $show_fullname && ($author->first_name != '' && $author->last_name != '') ) 
    391                         $name = "$author->first_name $author->last_name"; 
     392                $meta = (array) $wpdb->get_results(" 
     393                        SELECT user_id, meta_key, meta_value 
     394                        FROM $wpdb->usermeta 
     395                        WHERE user_id IN (" . join(',', $user_ids) . ") AND (meta_key = 'first_name' OR meta_key = 'last_name') 
     396                        ORDER BY meta_key, meta_value, user_id"); 
    392397 
    393                 if ( !($posts == 0 && $hide_empty) ) 
    394                         $return .= '<li>'; 
    395                 if ( $posts == 0 ) { 
    396                         if ( !$hide_empty ) 
    397                                 $link = $name; 
    398                 } else { 
    399                         $link = '<a href="' . get_author_posts_url($author->ID, $author->user_nicename) . '" title="' . sprintf(__("Posts by %s"), attribute_escape($author->display_name)) . '">' . $name . '</a>'; 
     398                $user_meta = array(); 
     399                foreach ($meta as $v) 
     400                        $user_meta[$v->user_id][$v->meta_key] = $v->meta_value; 
     401        } 
    400402 
    401                         if ( (! empty($feed_image)) || (! empty($feed)) ) { 
    402                                 $link .= ' '; 
    403                                 if (empty($feed_image)) 
    404                                         $link .= '('; 
    405                                 $link .= '<a href="' . get_author_rss_link(0, $author->ID, $author->user_nicename) . '"'; 
     403        foreach ($authors as $author) { 
     404                $name = $author->display_name; 
     405                if ( $show_fullname && !empty($user_meta[$author->ID]['first_name']) && !empty($user_meta[$author->ID]['last_name']) ) 
     406                        $name = trim($user_meta[$author->ID]['first_name'] . ' ' . $user_meta[$author->ID]['last_name']); 
    406407 
    407                                 if ( !empty($feed) ) { 
    408                                         $title = ' title="' . $feed . '"'; 
    409                                         $alt = ' alt="' . $feed . '"'; 
    410                                         $name = $feed; 
    411                                         $link .= $title; 
    412                                 } 
     408                if ( $hide_empty && 0 == $author->posts ) { 
     409                        $return .= '<li>' . $name . '</li>'; 
     410                        continue; 
     411                } 
     412                $return .= '<li>'; 
     413                $link = '<a href="' . get_author_posts_url($author->ID, $author->user_nicename) . '" title="' . sprintf(__("Posts by %s"), attribute_escape($author->display_name)) . '">' . $name . '</a>'; 
    413414 
    414                                 $link .= '>'; 
     415                if ( (! empty($feed_image)) || (! empty($feed)) ) { 
     416                        $link .= ' '; 
     417                        if (empty($feed_image)) 
     418                                $link .= '('; 
     419                        $link .= '<a href="' . get_author_rss_link(0, $author->ID, $author->user_nicename) . '"'; 
    415420 
    416                                 if ( !empty($feed_image) ) 
    417                                         $link .= "<img src=\"$feed_image\" border=\"0\"$alt$title" . ' />'; 
    418                                 else 
    419                                         $link .= $name; 
     421                        if ( !empty($feed) ) { 
     422                                $title = ' title="' . $feed . '"'; 
     423                                $alt = ' alt="' . $feed . '"'; 
     424                                $name = $feed; 
     425                                $link .= $title; 
     426                        } 
    420427 
    421                                 $link .= '</a>'; 
     428                        $link .= '>'; 
    422429 
    423                                 if ( empty($feed_image) ) 
    424                                         $link .= ')'; 
    425                         } 
     430                        if ( !empty($feed_image) ) 
     431                                $link .= "<img src=\"$feed_image\" border=\"0\"$alt$title" . ' />'; 
     432                        else 
     433                                $link .= $name; 
    426434 
    427                         if ( $optioncount ) 
    428                                 $link .= ' ('. $posts . ')'; 
     435                        $link .= '</a>'; 
    429436 
     437                        if ( empty($feed_image) ) 
     438                                $link .= ')'; 
    430439                } 
    431440 
    432                 if ( !($posts == 0 && $hide_empty) ) 
    433                         $return .= $link . '</li>'; 
     441                if ( $optioncount ) 
     442                        $link .= ' ('. $author->posts . ')'; 
     443 
     444                $return .= $link . '</li>'; 
    434445        } 
     446 
    435447        if ( !$echo ) 
    436448                return $return; 
    437449        echo $return;