WordPress.org

Make WordPress Core

Ticket #5407: 5407_2.diff

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

Improve wp_list_authors() efficiency

  • wp-includes/author-template.php

     
    442442        $r = wp_parse_args( $args, $defaults ); 
    443443        extract($r, EXTR_SKIP); 
    444444 
     445        $exclude_admin = $exclude_admin ? "WHERE user_login <> 'admin'" : ''; 
     446 
    445447        $return = ''; 
    446448 
    447         /** @todo Move select to get_authors(). */ 
    448         $authors = $wpdb->get_results("SELECT ID, user_nicename from $wpdb->users " . ($exclude_admin ? "WHERE user_login <> 'admin' " : '') . "ORDER BY display_name"); 
     449        $authors = (array) $wpdb->get_results(" 
     450                SELECT $wpdb->users.ID, user_nicename, display_name, COUNT($wpdb->posts.ID) AS posts 
     451                FROM $wpdb->users " . (!$hide_empty ? 'LEFT' : '') . " JOIN $wpdb->posts 
     452                        ON  $wpdb->posts.post_author = $wpdb->users.ID AND post_type = 'post' AND " . get_private_posts_cap_sql( 'post' ) . " 
     453                $exclude_admin 
     454                GROUP BY post_author 
     455                ORDER BY display_name"); 
    449456 
    450         $author_count = array(); 
    451         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) { 
    452                 $author_count[$row->post_author] = $row->count; 
    453         } 
     457        if ( empty($authors) ) return false; 
    454458 
    455         foreach ( (array) $authors as $author ) { 
    456                 $author = get_userdata( $author->ID ); 
    457                 $posts = (isset($author_count[$author->ID])) ? $author_count[$author->ID] : 0; 
    458                 $name = $author->display_name; 
     459        if ( $show_fullname ) { 
     460                $user_ids = $wpdb->get_col(null); 
    459461 
    460                 if ( $show_fullname && ($author->first_name != '' && $author->last_name != '') ) 
    461                         $name = "$author->first_name $author->last_name"; 
     462                $meta = (array) $wpdb->get_results(" 
     463                        SELECT user_id, meta_key, meta_value 
     464                        FROM $wpdb->usermeta 
     465                        WHERE user_id IN (" . join(',', $user_ids) . ") AND (meta_key = 'first_name' OR meta_key = 'last_name') 
     466                        ORDER BY meta_key, meta_value, user_id"); 
    462467 
    463                 if ( !($posts == 0 && $hide_empty) ) 
    464                         $return .= '<li>'; 
    465                 if ( $posts == 0 ) { 
    466                         if ( !$hide_empty ) 
    467                                 $link = $name; 
    468                 } else { 
    469                         $link = '<a href="' . get_author_posts_url($author->ID, $author->user_nicename) . '" title="' . sprintf(__("Posts by %s"), attribute_escape($author->display_name)) . '">' . $name . '</a>'; 
     468                $user_meta = array(); 
     469                foreach ($meta as $v) 
     470                        $user_meta[$v->user_id][$v->meta_key] = $v->meta_value; 
     471        } 
    470472 
    471                         if ( (! empty($feed_image)) || (! empty($feed)) ) { 
    472                                 $link .= ' '; 
    473                                 if (empty($feed_image)) 
    474                                         $link .= '('; 
    475                                 $link .= '<a href="' . get_author_rss_link(0, $author->ID, $author->user_nicename) . '"'; 
     473        foreach ($authors as $author) { 
     474                $name = $author->display_name; 
     475                if ( $show_fullname && !empty($user_meta[$author->ID]['first_name']) && !empty($user_meta[$author->ID]['last_name']) ) 
     476                        $name = trim($user_meta[$author->ID]['first_name'] . ' ' . $user_meta[$author->ID]['last_name']); 
    476477 
    477                                 if ( !empty($feed) ) { 
    478                                         $title = ' title="' . $feed . '"'; 
    479                                         $alt = ' alt="' . $feed . '"'; 
    480                                         $name = $feed; 
    481                                         $link .= $title; 
    482                                 } 
     478                if ( $hide_empty && 0 == $author->posts ) { 
     479                        $return .= '<li>' . $name . '</li>'; 
     480                        continue; 
     481                } 
     482                $return .= '<li>'; 
     483                $link = '<a href="' . get_author_posts_url($author->ID, $author->user_nicename) . '" title="' . sprintf(__("Posts by %s"), attribute_escape($author->display_name)) . '">' . $name . '</a>'; 
    483484 
    484                                 $link .= '>'; 
     485                if ( (! empty($feed_image)) || (! empty($feed)) ) { 
     486                        $link .= ' '; 
     487                        if (empty($feed_image)) 
     488                                $link .= '('; 
     489                        $link .= '<a href="' . get_author_rss_link(0, $author->ID, $author->user_nicename) . '"'; 
    485490 
    486                                 if ( !empty($feed_image) ) 
    487                                         $link .= "<img src=\"$feed_image\" border=\"0\"$alt$title" . ' />'; 
    488                                 else 
    489                                         $link .= $name; 
     491                        if ( !empty($feed) ) { 
     492                                $title = ' title="' . $feed . '"'; 
     493                                $alt = ' alt="' . $feed . '"'; 
     494                                $name = $feed; 
     495                                $link .= $title; 
     496                        } 
    490497 
    491                                 $link .= '</a>'; 
     498                        $link .= '>'; 
    492499 
    493                                 if ( empty($feed_image) ) 
    494                                         $link .= ')'; 
    495                         } 
     500                        if ( !empty($feed_image) ) 
     501                                $link .= "<img src=\"$feed_image\" border=\"0\"$alt$title" . ' />'; 
     502                        else 
     503                                $link .= $name; 
    496504 
    497                         if ( $optioncount ) 
    498                                 $link .= ' ('. $posts . ')'; 
     505                        $link .= '</a>'; 
    499506 
     507                        if ( empty($feed_image) ) 
     508                                $link .= ')'; 
    500509                } 
    501510 
    502                 if ( !($posts == 0 && $hide_empty) ) 
    503                         $return .= $link . '</li>'; 
     511                if ( $optioncount ) 
     512                        $link .= ' ('. $author->posts . ')'; 
     513 
     514                $return .= $link . '</li>'; 
    504515        } 
     516 
    505517        if ( !$echo ) 
    506518                return $return; 
    507519        echo $return;