Most Commented Posts The Right Way in WordPress
Posted on 06. Jan, 2010 by Alex Denning in Quick Tips
Just a very quick tip but nonetheless an important one. Many of you will be using any number of plugins or the database query that’s been doing the rounds recently to display your most popular posts. That code/plugin is no longer needed as WordPress’ query_posts can now display your most commented posts.
So how’s it done? Really simple; the following should do the trick (2.9 or above):
<ul>
<?php query_posts('orderby=comment_count&posts_per_page=>5');
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?> (<?php comments_number('0','1','%'); ?>)</a></li>
<?php endwhile; ?>
<?php else : ?>
<li>Sorry, no posts were found.</li>
<?php endif; ?>
</ul>In a nutshell we’re just creating an unordered list with the five most popular posts and ordering by comment count, hence we’re able to display the most commented posts first. Now go and replace all those plugins!
Update: as Sean points out, might be better off using WP Query in order to not get in the way of any other queries you’re running. Something like the following will do the trick:
<ul>
<?php $popular = new WP_Query('orderby=comment_count&posts_per_page=5'); ?>
<?php while ($popular->have_posts()) : $popular->the_post(); ?>
<li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?> (<?php comments_number('0','1','%'); ?>)</a></li>
<?php endwhile; ?>
</ul>Extending things
As Ben points out, like this, it’s nothing special. My response is you can do more exciting things. Like get an image (using the custom field ‘Image’ — change that line to the new get-the-image function to automatically get your images or the like):
<?php $popular = new WP_Query('orderby=comment_count&posts_per_page=5'); ?>
<?php while ($popular->have_posts()) : $popular->the_post(); ?>
<?php $justanimage = get_post_meta($post->ID, 'Image', true);
if ($justanimage) {
?>
<img src="<?php echo get_post_meta($post->ID, "Image", true); ?>" alt="<?php the_title(); ?>" />
<?php } else { ?>
<img src="http://an-alternative-image.jpg" alt="" />
<?php } ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php endwhile; ?>
That’s an improvement over an unordered list, no?
Related posts:

Enjoyed the post? We'll see you on Twitter or in your RSS reader!

Alex Denning is the founder of WPShout. A WordPress developer from London, Alex co-founded WPShift at the start of 2010 where he sells awesome WordPress themes.
You can find Alex on Twitter and at AlexDenning.com.
25 Responses to “Most Commented Posts The Right Way in WordPress”
Trackbacks/Pingbacks
[...] to Alex Denning for this nice trick! If you enjoyed this article, please consider sharing it! tweetmeme_style = [...]
[...] Denning over at WPSHOUT posted a nice tip for displaying popular posts without the need for a plugin. You can now order [...]
[...] Badly made graphic number one is actually quite heavily cropped so you don’t see the ‘Popular Posts’ section of the sidebar. For this, we followed my own advice to get most commented posts the right way: [...]




Brad
06. Jan, 2010
Thank you for the quick tip. I love eliminating extraneous plugins with small chunks of php.
Alex Denning
07. Jan, 2010
That’s what it’s all about
Love the design of your blog, btw!
tom
07. Jan, 2010
currently using Atahualpa, and that theme has a widget similar to that one, with the added option of specifying an “exclude posts prior to X days ago”… how would that option be added to the code above?
Alex Denning
07. Jan, 2010
We’re using
query_postsso it’s just a case of selecting the one you want. This link will give you a number of examples and options.tom
08. Jan, 2010
Ah, thanks for the link – is there no end to the PHP/WordPress options?!
Gonzo
07. Jan, 2010
If there are no posts, an unordered list with a paragraph inside is generated, which will brake validation of the page. I would put the if statement around the ul. Or, surround the p tag with a li in the else case.
Alex Denning
07. Jan, 2010
Good spot. Thanks for that. I’ve updated the post.
Ben
07. Jan, 2010
Cool tip but I wonder if this is overkill for getting the most commented posts? I don’t need all of the post information when I am posting popular posts so maybe a custom way would be quicker on the server/ db?
Alex Denning
07. Jan, 2010
Perhaps although take me as an example. I want to display an image, do an if/else statement on the title (shortened version) and limit which date the post can come from – this might be best
Alex Denning
07. Jan, 2010
I’ve now just updated the post to prove a point
Sean O'Grady
07. Jan, 2010
Thanks! Edited it a bit to use WP Query, helping remove conflicts with other php snippets
query(‘showposts=5&orderby=comment_count’);
?>
have_posts()) : $popPosts->the_post(); ?>
<a href="” title=”">
Alex Denning
07. Jan, 2010
Just updated the post with the WP_Query way
Ashfame
07. Jan, 2010
Yes cool tip! Will use it on homepage.
Kristof
08. Jan, 2010
Thanks for the snippet.
Since 2.9 includes ability for Page/Post Image/Thumbnail option, would it not be more efficient to call that thumbnail instead of adding/calling a custom field? If so, how would you modify your code snippet? Thanks.
Sels
08. Jan, 2010
Kristof, I was just working on a post about using the post thumbnail function instead. Here’s the snippet using Alex’s example:
have_posts()) : $populer->the_post(); ?>
<?php if ( has_post_thumbnail() )
the_post_thumbnail(array(60,60));
else echo '';
?>
<a href="" rel="Bookmark" title="">
Kristof
09. Jan, 2010
Thanks SEL – Subscribed to your RSS and Tweeted your article.
Sels
09. Jan, 2010
You’re welcome Kristof, glad I could help.
isa
17. Jan, 2010
That is the right way, if you do not want to use a plugin while you can do it with just 5 lines of code…
Thanks for this useful information.
Jim
04. Feb, 2010
Thanks for the cool little trick.. Nowi can disable some pluging.. thanks again…
Devin
21. Jul, 2010
Awesome. Just removed 15 unneeded database queries from a client’s site.
chibi
23. Jul, 2010
Is there a way to display most commented posts, but exclude comments from pages being on the list?
Thanks
pablo
22. Aug, 2010
how do you exclude trackbacks from here and also only show posts with more than 1 comment.