WordPress.org

Make WordPress Core

Ticket #10329: 10329.4.diff

File 10329.4.diff, 7.0 KB (added by takaitra, 4 years ago)

Updated diff against r15567 of author-template.php

  • author-template.php

     
    259259 * or as a string.</li> 
    260260 * <li>html (bool) (true): Whether to list the items in html for or plaintext. 
    261261 * </li> 
     262 * <li>orderby (string) ('name'): The sort order of the list.</li> 
     263 * <li>order (string) ('ASC'): Sort order for authors (either ascending or 
     264 * descending).</li> 
     265 * <li>number (int) (NULL): Sets the number of authors to display. This 
     266 * causes the SQL LIMIT value to be defined. Default to no LIMIT.</li> 
     267 * <li>min_count (int) (NULL): Sets a minimum post count threshold. Defaults to 
     268 * no minimum.</li> 
    262269 * </ul> 
    263270 * 
    264271 * @link http://codex.wordpress.org/Template_Tags/wp_list_authors 
     
    267274 * @return null|string The output, if echo is set to false. 
    268275 */ 
    269276function wp_list_authors($args = '') { 
    270         global $wpdb; 
     277        global $wpdb, $blog_id; 
    271278 
    272279        $defaults = array( 
    273280                'optioncount' => false, 'exclude_admin' => true, 
    274281                'show_fullname' => false, 'hide_empty' => true, 
    275282                'feed' => '', 'feed_image' => '', 'feed_type' => '', 'echo' => true, 
    276                 'style' => 'list', 'html' => true 
     283                'style' => 'list', 'html' => true, 'orderby' => 'name', 
     284                'order' => 'ASC', 'number' => NULL, 'min_count' => NULL 
    277285        ); 
    278286 
    279287        $r = wp_parse_args( $args, $defaults ); 
    280288        extract($r, EXTR_SKIP); 
    281289        $return = ''; 
    282290 
    283         /** @todo Move select to get_authors(). */ 
    284         $users = get_users(); 
    285         $author_ids = array(); 
    286         foreach ( (array) $users as $user ) 
    287                 $author_ids[] = $user->user_id; 
    288         if ( count($author_ids) > 0  ) { 
    289                 $author_ids = implode(',', $author_ids ); 
    290                 $authors = $wpdb->get_results( "SELECT ID, user_nicename from $wpdb->users WHERE ID IN($author_ids) " . ($exclude_admin ? "AND user_login <> 'admin' " : '') . "ORDER BY display_name" ); 
     291        if ( empty($id) ) 
     292                $id = (int) $blog_id; 
     293        $blog_prefix = $wpdb->get_blog_prefix($id); 
     294 
     295        // Order ASC or DESC based on the order and orderby arguments 
     296        if ( $show_fullname ) { 
     297        // Full names will be looked up via user meta-data and sorted later 
     298        // order by NULL avoids the implicit sorting of the GROUP BY 
     299        $author_sort = 'ORDER BY NULL'; 
     300    } else { 
     301                if ( $orderby == 'count' ) { 
     302                        $author_sort = "ORDER BY post_count $order, author_name"; 
     303                } else { 
     304                        $author_sort = "ORDER BY author_name $order"; 
     305                } 
     306        } 
     307 
     308        // Limit the results based on the min_count argument 
     309        $min_count = absint( $min_count ); 
     310        if ( $hide_empty ) 
     311                $min_count = max(1, $min_count); 
     312        if ( $min_count ) { 
     313                $author_having = "HAVING post_count >= $min_count"; 
    291314        } else { 
    292                 $authors = array(); 
     315                $author_having = ''; 
    293316        } 
    294317 
    295         $author_count = array(); 
    296         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 ) 
    297                 $author_count[$row->post_author] = $row->count; 
     318        // Limit the results based on the number argument 
     319        $number = intval( $number ); 
     320        if ( $number > 0 ) { 
     321                $author_limit = "LIMIT $number"; 
     322        } else { 
     323                $author_limit = ''; 
     324        } 
    298325 
     326        // Join to exclude authors from other blogs. Only needed if hide_empty is 
     327        // false or and no min_count is set (the INNER JOIN to $wpdb->posts would 
     328        // already exclude non-authors in both cases) 
     329        if ( !$hide_empty && !$min_count ) { 
     330                $author_cap_join = "JOIN $wpdb->usermeta AS meta_capabilities ON meta_capabilities.user_id = $wpdb->users.ID AND meta_capabilities.meta_key = '{$blog_prefix}capabilities'"; 
     331        } else { 
     332                $author_cap_join = ''; 
     333        } 
     334         
     335        $author_select = "$wpdb->users.ID, $wpdb->users.user_nicename, $wpdb->users.display_name AS author_name"; 
     336         
     337        // join on posts only when necessary 
     338        if ( $hide_empty || $min_count || $optioncount || $orderby == 'count' ) { 
     339                $author_select .= ", COUNT($wpdb->posts.ID) as post_count"; 
     340                $author_posts_join = "JOIN $wpdb->posts ON $wpdb->posts.post_author = $wpdb->users.ID"; 
     341                $author_where = "($wpdb->posts.post_type = 'post' OR $wpdb->posts.post_type IS NULL) AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status IS NULL)"; 
     342                $author_group_by = "GROUP BY $wpdb->users.ID"; 
     343                // a left join is needed if we're only interested in fetching numbers of posts 
     344                if ( !$min_count && !$hide_empty ) 
     345                        $author_posts_join = 'LEFT ' . $author_posts_join; 
     346        } else { 
     347                $author_posts_join = ''; 
     348                $author_where = ''; 
     349                $author_group_by = ''; 
     350        } 
     351         
     352        if ( $exclude_admin ) 
     353                $author_where .= ( $author_where ? ' AND ' : '' ) . "$wpdb->users.user_login <> 'admin'"; 
     354         
     355        $author_where = $author_where ? ( 'WHERE ' . $author_where ) : ''; 
     356         
     357        // Query the list of users 
     358        $sql = " 
     359                SELECT $author_select 
     360                FROM $wpdb->users 
     361                $author_posts_join 
     362                $author_name_join 
     363                $author_cap_join 
     364                $author_where 
     365                $author_group_by 
     366                $author_having 
     367                $author_sort 
     368                $author_limit 
     369                "; 
     370 
     371        $authors = $wpdb->get_results($sql); 
     372 
     373        if ( $show_fullname ) { 
     374        // Lookup first and last name via cached user meta-data 
     375        foreach ( (array) $authors as $author ) { 
     376            $userdata = get_userdata( $author->ID ); 
     377            if ( !empty( $userdata->first_name ) || !empty( $userdata->last_name ) ) { 
     378                                $author->author_name = $userdata->first_name . ' ' . $userdata->last_name; 
     379                                trim ( $author->author_name ); 
     380            } 
     381        } 
     382                // Sort the objects 
     383                if ( $orderby == 'name' ) { 
     384                        usort( $authors, '_wp_list_authors_usort_callback_name' ); 
     385                } else { 
     386                        usort( $authors, '_wp_list_authors_usort_callback_count' ); 
     387                } 
     388                if ( $order == 'DESC' ) { 
     389                        $authors = array_reverse( $authors ); 
     390                } 
     391    } 
     392 
    299393        foreach ( (array) $authors as $author ) { 
    300394 
    301395                $link = ''; 
    302396 
    303                 $author = get_userdata( $author->ID ); 
    304                 $posts = (isset($author_count[$author->ID])) ? $author_count[$author->ID] : 0; 
    305                 $name = $author->display_name; 
     397                $posts = $author->post_count; 
     398                $name = $author->author_name; 
    306399 
    307                 if ( $show_fullname && ($author->first_name != '' && $author->last_name != '') ) 
    308                         $name = "$author->first_name $author->last_name"; 
    309  
    310400                if( !$html ) { 
    311401                        if ( $posts == 0 ) { 
    312402                                if ( ! $hide_empty ) 
     
    320410 
    321411                if ( !($posts == 0 && $hide_empty) && 'list' == $style ) 
    322412                        $return .= '<li>'; 
    323                 if ( $posts == 0 ) { 
     413                if ( $optioncount && $posts == 0 ) { 
    324414                        if ( ! $hide_empty ) 
    325415                                $link = $name; 
    326416                } else { 
    327                         $link = '<a href="' . get_author_posts_url($author->ID, $author->user_nicename) . '" title="' . esc_attr( sprintf(__("Posts by %s"), $author->display_name) ) . '">' . $name . '</a>'; 
     417                        $link = '<a href="' . get_author_posts_url($author->ID, $author->user_nicename) . '" title="' . esc_attr( sprintf(__("Posts by %s"), $author->author_name) ) . '">' . $name . '</a>'; 
    328418 
    329419                        if ( (! empty($feed_image)) || (! empty($feed)) ) { 
    330420                                $link .= ' '; 
     
    368458        echo $return; 
    369459} 
    370460 
     461function _wp_list_authors_usort_callback_name($a, $b) { 
     462    return strcasecmp( $a->author_name, $b->author_name ); 
     463} 
     464 
     465function _wp_list_authors_usort_callback_count($a, $b) { 
     466        return $a->post_count - $b->post_count; 
     467} 
    371468?>