Make WordPress Core


Ignore:
Timestamp:
09/20/2022 04:24:56 PM (2 years ago)
Author:
SergeyBiryukov
Message:

Users: Make wp_list_authors() and wp_list_users() filterable.

This commit adds three filters to customize the wp_list_authors() and wp_list_users() output:

  • wp_list_authors_args: Filters the query arguments for the list of all authors of the site.
  • pre_wp_list_authors_post_counts_query: Filters whether to short-circuit performing the query for author post counts. This may be useful to account for custom post types or post statuses.
  • wp_list_users_args: Filters the query arguments for the list of all users of the site.

Follow-up to [979], [3848], [5135], [5727], [31653], [52064], [53486], [53501].

Props kevinB, wonderboymusic, DrewAPicture, Mte90, audrasjb, rafiahmedd, costdev, nacin, afercia, chetan200891, hellofromTonya, TimothyBlynJacobs, chaion07, SergeyBiryukov.
Fixes #17025.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/author-template.php

    r53501 r54262  
    451451    );
    452452
    453     $args = wp_parse_args( $args, $defaults );
     453    $parsed_args = wp_parse_args( $args, $defaults );
    454454
    455455    $return = '';
    456456
    457     $query_args           = wp_array_slice_assoc( $args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) );
     457    $query_args           = wp_array_slice_assoc( $parsed_args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) );
    458458    $query_args['fields'] = 'ids';
    459     $authors              = get_users( $query_args );
    460 
    461     $author_count = array();
    462     foreach ( (array) $wpdb->get_results( "SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE " . get_private_posts_cap_sql( 'post' ) . ' GROUP BY post_author' ) as $row ) {
    463         $author_count[ $row->post_author ] = $row->count;
    464     }
     459
     460    /**
     461     * Filters the query arguments for the list of all authors of the site.
     462     *
     463     * @since 6.1.0
     464     *
     465     * @param array $query_args  The query arguments for get_users().
     466     * @param array $parsed_args The arguments passed to wp_list_authors() combined with the defaults.
     467     */
     468    $query_args = apply_filters( 'wp_list_authors_args', $query_args, $parsed_args );
     469
     470    $authors     = get_users( $query_args );
     471    $post_counts = array();
     472
     473    /**
     474     * Filters whether to short-circuit performing the query for author post counts.
     475     *
     476     * @since 6.1.0
     477     *
     478     * @param int[]|false $post_counts Array of post counts, keyed by author ID.
     479     * @param array       $parsed_args The arguments passed to wp_list_authors() combined with the defaults.
     480     */
     481    $post_counts = apply_filters( 'pre_wp_list_authors_post_counts_query', false, $parsed_args );
     482
     483    if ( ! is_array( $post_counts ) ) {
     484        $post_counts = $wpdb->get_results(
     485            "SELECT DISTINCT post_author, COUNT(ID) AS count
     486            FROM $wpdb->posts
     487            WHERE " . get_private_posts_cap_sql( 'post' ) . '
     488            GROUP BY post_author'
     489        );
     490
     491        foreach ( (array) $post_counts as $row ) {
     492            $post_counts[ $row->post_author ] = $row->count;
     493        }
     494    }
     495
    465496    foreach ( $authors as $author_id ) {
    466         $posts = isset( $author_count[ $author_id ] ) ? $author_count[ $author_id ] : 0;
    467 
    468         if ( ! $posts && $args['hide_empty'] ) {
     497        $posts = isset( $post_counts[ $author_id ] ) ? $post_counts[ $author_id ] : 0;
     498
     499        if ( ! $posts && $parsed_args['hide_empty'] ) {
    469500            continue;
    470501        }
     
    472503        $author = get_userdata( $author_id );
    473504
    474         if ( $args['exclude_admin'] && 'admin' === $author->display_name ) {
     505        if ( $parsed_args['exclude_admin'] && 'admin' === $author->display_name ) {
    475506            continue;
    476507        }
    477508
    478         if ( $args['show_fullname'] && $author->first_name && $author->last_name ) {
     509        if ( $parsed_args['show_fullname'] && $author->first_name && $author->last_name ) {
    479510            $name = sprintf(
    480511                /* translators: 1: User's first name, 2: Last name. */
     
    487518        }
    488519
    489         if ( ! $args['html'] ) {
     520        if ( ! $parsed_args['html'] ) {
    490521            $return .= $name . ', ';
    491522
     
    493524        }
    494525
    495         if ( 'list' === $args['style'] ) {
     526        if ( 'list' === $parsed_args['style'] ) {
    496527            $return .= '<li>';
    497528        }
     
    505536        );
    506537
    507         if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) {
     538        if ( ! empty( $parsed_args['feed_image'] ) || ! empty( $parsed_args['feed'] ) ) {
    508539            $link .= ' ';
    509             if ( empty( $args['feed_image'] ) ) {
     540            if ( empty( $parsed_args['feed_image'] ) ) {
    510541                $link .= '(';
    511542            }
    512543
    513             $link .= '<a href="' . get_author_feed_link( $author->ID, $args['feed_type'] ) . '"';
     544            $link .= '<a href="' . get_author_feed_link( $author->ID, $parsed_args['feed_type'] ) . '"';
    514545
    515546            $alt = '';
    516             if ( ! empty( $args['feed'] ) ) {
    517                 $alt  = ' alt="' . esc_attr( $args['feed'] ) . '"';
    518                 $name = $args['feed'];
     547            if ( ! empty( $parsed_args['feed'] ) ) {
     548                $alt  = ' alt="' . esc_attr( $parsed_args['feed'] ) . '"';
     549                $name = $parsed_args['feed'];
    519550            }
    520551
    521552            $link .= '>';
    522553
    523             if ( ! empty( $args['feed_image'] ) ) {
    524                 $link .= '<img src="' . esc_url( $args['feed_image'] ) . '" style="border: none;"' . $alt . ' />';
     554            if ( ! empty( $parsed_args['feed_image'] ) ) {
     555                $link .= '<img src="' . esc_url( $parsed_args['feed_image'] ) . '" style="border: none;"' . $alt . ' />';
    525556            } else {
    526557                $link .= $name;
     
    529560            $link .= '</a>';
    530561
    531             if ( empty( $args['feed_image'] ) ) {
     562            if ( empty( $parsed_args['feed_image'] ) ) {
    532563                $link .= ')';
    533564            }
    534565        }
    535566
    536         if ( $args['optioncount'] ) {
     567        if ( $parsed_args['optioncount'] ) {
    537568            $link .= ' (' . $posts . ')';
    538569        }
    539570
    540571        $return .= $link;
    541         $return .= ( 'list' === $args['style'] ) ? '</li>' : ', ';
     572        $return .= ( 'list' === $parsed_args['style'] ) ? '</li>' : ', ';
    542573    }
    543574
    544575    $return = rtrim( $return, ', ' );
    545576
    546     if ( $args['echo'] ) {
     577    if ( $parsed_args['echo'] ) {
    547578        echo $return;
    548579    } else {
Note: See TracChangeset for help on using the changeset viewer.