Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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?

share|improve this question
add comment

3 Answers

up vote 2 down vote accepted

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.

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

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.

share|improve this answer
add comment

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
}
    }

    ?>
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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