1

I'm trying to do something I assumed would be easy. I assumed wrong. What I want to do is list all the authors of a site on the sidebar, with a link to their respective author page, number of posts written, and gravatar. wp_list_authors doesn't give me an option to include the gravatar at all. Here is what I have

        $blogusers = get_users_of_blog();
        if ($blogusers) {
          foreach ($blogusers as $bloguser) {
            $user = get_userdata($bloguser->user_id);
        $post_count = count_user_posts($user->ID);
            if ($post_count) {
        echo '<li>';
        echo '<a href="'.get_bloginfo('url').'/author/' . $user->user_nicename . '">'.get_avatar($user->user_email, '36').'</a>';
        echo '<a href="'.get_bloginfo('url').'/author/' . $user->user_nicename . '">'.$user->display_name.' ('.$post_count.')</a><li>';
            }
          }
        }

Which works, albeit with two problems:

  1. I can't find a way to have them sort by number of posts
  2. the get_users_of_blog is a depreciated function. I really don't want to use it.

I was able to create an explode with wp_list_authors, but didn't have a clue how to extract the data out of it to display in this manner. Help?

3 Answers 3

2

To answer your problems:

Sorting by post count

You can collect all the information you need in to an array and sort that array by number of posts , like this:

    //function to sort array by filed
    function authors_orderBy($data, $field){
       $code = "if (\$a['$field'] == \$b['$field']) {return 0;} return (\$a['$field'] < \$b['$field']) ? 1 : -1;";
       usort($data, create_function('$a,$b', $code));
       return $data;
    }

then change your code a bit like so:

        $blogusers = get_users_of_blog();
        if ($blogusers) {
            $au = array();
            foreach ($blogusers as $bloguser) {
               $user = get_userdata($bloguser->user_id);
               $post_count = count_user_posts($user->ID);
               $au[] = array('user_id' => $user->ID , 'nicename' => $user->user_nicename, 'display_name' => $user->display_name, 'email' => $user->user_email ,'post_count' => $post_count);
            }

            //Sort array
            $au = authors_orderBy($au, 'post_count');

           //then loop through the authors
           foreach ($au as $aut){
             if ($aut['post_count'] > 0) {
                echo '<li>';
                echo '<a href="'.get_bloginfo('url').'/author/' . $aut['nicename'] . '">'.get_avatar($aut['email'], '36').'</a>';
                echo '<a href="'.get_bloginfo('url').'/author/' . $aut['nicename'] . '">'.$aut['display_name'] .' ('.$aut['post_count'].')</a><li>';
             }
           }
        }

get_users_of_blog is a depreciated

It's weird because looking at the codex Yes this function is depreciated and you should use get_users() which should be shipped with Version 3.1

     /**
     * Retrieve list of users matching criteria.
     *
     * @since 3.1.0
     * @uses $wpdb
     * @uses WP_User_Query See for default arguments and information.
     *
     * @param array $args
     * @return array List of users.
     */
    function get_users( $args ) {

            $args = wp_parse_args( $args );
            $args['count_total'] = false;

            $user_search = new WP_User_Query($args);

            return (array) $user_search->get_results();
    }

but if you look at wp_list_authors it uses get_users_of_blog() be itself.

Hope this helps.

4
  • Bingo! There's only one issue remaining: it sorts by lowest instead of highest. Any way to swap it?
    – Norcross
    Feb 12, 2011 at 23:51
  • I updated the authors_orderBy code to sort from high to low.
    – Bainternet
    Feb 13, 2011 at 1:47
  • Perfect! Exactly what I needed. I may release this in a plugin.
    – Norcross
    Feb 13, 2011 at 1:53
  • Glad i can help, and hope to here about this plugin of yours
    – Bainternet
    Feb 13, 2011 at 2:16
0

get_users_of_blog() may be deprecated per documentation, but it is actually what wp_list_authors() uses internally ( source ) and there seems to be no viable alternative available at moment.

I see no easy way to customize wp_list_authors() the way you want. Can only suggest to reuse code for it in you own function, modification to add gravatar will be minimal.

0

code widget for sidebar:

add_action( 'widgets_init', 'latest_members_widgets' );

function latest_members_widgets() {
register_widget( 'Latest_Members' );
}
class Latest_Members extends WP_Widget {
function Latest_Members() {
    $widget_ops = array( 'classname' => 'latest_members', 'description' =>   'Visualizza gli avatar degli utenti iscritti.' );
    $this->WP_Widget( 'latest-members-widget', 'Iscritti Recenti', $widget_ops);
}


 function widget( $args, $instance ) {
    extract( $args );

    $title = apply_filters('widget_title', $instance['title'] );
    $avatars = $instance['avatars']; ?>

    <?php echo $before_widget; ?>

    <?php if ( $title ) echo $before_title . $title . $after_title; ?>

    <div class="widget_latest_members">
    <ul>
        <?php global $wpdb;
        $szSort = "user_registered";
        $aUsersID = $wpdb->get_col( $wpdb->prepare(
        "SELECT $wpdb->users.ID FROM $wpdb->users ORDER BY ID DESC LIMIT $avatars", $szSort ));
        foreach ( $aUsersID as $iUserID ) :
        $user = get_userdata( $iUserID );
        echo '<a href="'.get_bloginfo(url).'/?author='.$iUserID.'" rel="profilo" title="Vai al Profilo">'.get_avatar($iUserID, 35,$default=$author->ID).'</a>';
        endforeach; ?>
        <br />
  <div class="totale"><?php $users = $wpdb->get_var("SELECT COUNT(ID) FROM $wpdb->users"); echo $users." utenti registrati";?></div>
</ul>
    </div>

    <?php echo $after_widget; }

function update( $new_instance, $old_instance ) {
    $instance = $old_instance;

    $instance['title'] = strip_tags( $new_instance['title'] );
    $instance['avatars'] = strip_tags( $new_instance['avatars'] );

    return $instance;
}

function form( $instance ) {

    /* Set up some default widget settings. */
    $defaults = array( 'title' => 'Latest Members', 'avatars' => 20);
    $instance = wp_parse_args( (array) $instance, $defaults ); ?>

    <p>
        <label for="<?php echo $this->get_field_id( 'title' ); ?>">Titolo:</label>
        <br/><input type="text" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" />
    </p>
    <p>
        <label for="<?php echo $this->get_field_id( 'avatars' ); ?>">Numero Avatar da visualizzare:</label>
        <br/><input type="text" id="<?php echo $this->get_field_id( 'avatars' ); ?>" name="<?php echo $this->get_field_name( 'avatars' ); ?>" value="<?php echo $instance['avatars']; ?>" />
    </p>

<?php
}
    }

    ?>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.