List categories by author ~ WITH COUNTER ~ (WordPress)

This is the code that I’ve got. It gives a list of the categories a given author has published in. However, I would very much like to have a number next to the category name, telling how many posts the author has published in the different categories. Anyone knows a trick? Thanks!

<?php
$author = get_query_var('author');
$categories = $wpdb->get_results("
    SELECT DISTINCT(terms.term_id) as ID, terms.name, terms.slug, tax.description
    FROM $wpdb->posts as posts
    LEFT JOIN $wpdb->term_relationships as relationships ON posts.ID = relationships.object_ID
    LEFT JOIN $wpdb->term_taxonomy as tax ON relationships.term_taxonomy_id = tax.term_taxonomy_id
    LEFT JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
    WHERE 1=1 AND (
        posts.post_status = 'publish' AND
        posts.post_author = '$author' AND
        tax.taxonomy = 'category' )
    ORDER BY terms.name ASC
");
?>
<ul>
    <?php foreach($categories as $category) : ?>
    <li>
        <a href="<?php echo get_category_link( $category->ID ); ?>" title="<?php echo $category->name ?>">
            <?php echo $category->name.' '.$category->description; ?>
        </a>
    </li>
    <?php endforeach; ?>
</ul>

EDIT:

Read More

This code counts the posts in the category, and works fine. I want to combine this with the code above, but I don’t know how to do it…

<?php
$counter = "SELECT COUNT(*) 
FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.term_id = 412
AND $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->posts.post_status = 'publish'
AND post_author = '1'
";


$user_count = $wpdb->get_var($counter);

echo $user_count;

?>

Related posts

Leave a Reply

3 comments

  1. In SQL exists the count() function, which can count a number of rows. In your case, we want the number of posts, so we could use COUNT(posts.id), like so :

    <?php
    $author = get_query_var('author');
    $categories = $wpdb->get_results("
        SELECT DISTINCT(terms.term_id) as ID, terms.name, terms.slug, tax.description, count(posts.id) AS `count`
        FROM $wpdb->posts as posts
        LEFT JOIN $wpdb->term_relationships as relationships ON posts.ID = relationships.object_ID
        LEFT JOIN $wpdb->term_taxonomy as tax ON relationships.term_taxonomy_id = tax.term_taxonomy_id
        LEFT JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
        WHERE posts.post_status = 'publish' AND
            posts.post_author = '$author' AND
            tax.taxonomy = 'category'
        ORDER BY terms.name ASC
    ");
    ?>
    <ul>
        <?php foreach($categories as $category) : ?>
        <li>
            <a href="<?php echo get_category_link( $category->ID ); ?>" title="<?php echo $category->name ?>">
                <?php echo $category->name.'('.$category->count.') '.$category->description; ?>
            </a>
        </li>
        <?php endforeach; ?>
    </ul>
    

    You’ll note that I used and alias to rename the count column (otherwise, its name would have been count(posts.id) – not really practical).
    I have also removed the 1=1 in the WHERE because it is not useful here.

  2. I figured it out… had to run to separate SELECT functions: one to fetch the list of categories, and then one more functions within that loop to count how many entries there is within the category. I would have preferred to have these two loops as one, but this works out for me.

    <?php
    
    // This will get us a list of the categories that our Author has published in
    $author = get_query_var('author');
    $categories = $wpdb->get_results("
    
    SELECT DISTINCT(terms.term_id) as ID, terms.name, terms.slug, tax.description
    FROM $wpdb->posts as posts
    LEFT JOIN $wpdb->term_relationships as relationships ON posts.ID = relationships.object_ID
    LEFT JOIN $wpdb->term_taxonomy as tax ON relationships.term_taxonomy_id = tax.term_taxonomy_id
    LEFT JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
    WHERE posts.post_status = 'publish' AND
        posts.post_author = '$author' AND
        tax.taxonomy = 'category' 
    ORDER BY terms.name ASC
    ");
    
    
    // This loop picks up categories
    foreach($categories as $category) : 
    
    $catid = $category->ID;
    
    // Now, inside the loop, we need to count how many posts that the Author has published.
    $counter = "SELECT COUNT(*)
    FROM $wpdb->posts
    LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    WHERE $wpdb->term_taxonomy.term_id = $catid
    AND $wpdb->term_taxonomy.taxonomy = 'category'
    AND $wpdb->posts.post_status = 'publish'
    AND post_author = '$author'
    ";
    
    $user_count = $wpdb->get_var($counter);
    
    echo '<div class="archive_author">' . $category->name . '<br/><span class="subcounter">' . $user_count . ' posts</span></div>';
    
    endforeach; 
    
    ?>
    
  3. I usually use this plugin ( http://wordpress.org/plugins/author-profiles/ ) to display in the sidebar.
    And I guess this code will help any one

      <?php
    
      global $wpdb;
      $table_users.=$wpdb->base_prefix;
      $table_users.="users";
      $table_posts.=$wpdb->base_prefix;
      $table_posts.="posts";
    
    
      $fetch_authordata="SELECT count(p.post_author) as post1,c.id, c.user_login, c.display_name,c.user_nicename, c.user_email, c.user_url, c.user_registered FROM {$table_users} as c , {$table_posts} as p {$where} and p.post_type = 'post' AND p.post_status = 'publish' and c.id=p.post_author GROUP BY p.post_author order by post1 DESC limit {$author_numbers}  ";
    
      $dispaly_authordata = (array) $wpdb->get_results("{$fetch_authordata}", object);
    
    
      foreach ( $dispaly_authordata as $author ) {
      $user = get_userdata($author->id);
    
      echo 'Display Name: '.$user->display_name;
      echo 'Post Count: '.$post_count = get_usernumposts($user->ID);
    
      }
     ?>