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:
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;
?>
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 useCOUNT(posts.id)
, like so :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.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.
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