Most Commented Posts The Right Way in WordPress

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?


34 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
Mehedi Hasan
January 7, 2013 12:41 pm

Hey,
Have any idea to highlight older post when a visitor commented on post?

advance thanks

Ido Doron
October 16, 2011 7:38 pm

Is there any way to use get_posts() function for this action?
Because I used this function to load the three most recent posts by this code:


[...]
$args = array( 'numberposts' => 3, 'orderby' => 'post_date', 'order' => 'DESC' );
$myposts = get_posts( $args );
[...]

It worded. It loaded the three most recent posts, but when I tried to change the “orderby” from ‘post_date’ to ‘comment_count’, only one post was loaded.
Is there any solution for this issue which doesn’t mean to use other function such as wp_query() or query_posts()?

Ido Doron
October 16, 2011 7:36 pm

Is there any way to use get_posts() function for this action?
Because I used this function to load the three most recent posts by this code:

[…]
$args = array( ‘numberposts’ => 3, ‘orderby’ => ‘post_date’, ‘order’ => ‘DESC’ );
$myposts = get_posts( $args );
[…]

It worded. It loaded the three most recent posts, but when I tried to change the “orderby” from ‘post_date’ to ‘comment_count’, only one post was loaded.
Is there any solution for this issue which doesn’t mean to use other function such as wp_query() or query_posts()?

Nicholas
January 25, 2011 8:44 am

I was getting rather frustrated and annoyed with the existing plugins that are out there for this. None of them seem to allow you to have control of the markup or even the location of the “widget”.

Thanks very much for this article. it has helped me greatly!

billboc
January 16, 2011 8:21 pm

Hello

how to display the number of comments for each post ?

thank you
regards,

billboc
January 16, 2011 8:25 pm
Reply to  billboc

sorry i’ve made a mistake because in fact… this code is perfect !
shame on me

7 Ways to Highlight Your Blog Archives
November 1, 2010 12:02 pm

[…] 2.9 or higher, you don’t really need a plugin.ย  So if you like to limit the use of plugins, check out this article for more […]

SK
September 27, 2010 2:53 am

Hey everyone, great discussion going on here. One question: is there a parameter to fetch the most commented OVER a time duration?

If I am correct this grabs the most commented posts of ALL time. Let’s say I want to set it for most commented in last 24 hours, last 7 days, or last month. Is that possible?

I noticed there is a date parameter, but that only does it for let’s say THIS WEEK or THIS MONTH. So if it’s Monday morning or the first day of the month, there won’t be much to show off.

Is there a way to make it so it shows most popular over the “last X days”?

Antes
October 25, 2010 9:30 am
Reply to  SK

Thanks for the post, helped me alot. Heres my whole sidebar widget with 5 most commented posts from the past 2 weeks. Works like a charm..


function childtheme_sidebar_popular() { ?>
<div id="sidebar_popular">
<div class="sidebar_popular_title"><h3>Most commented now</h3></div><!-- sidebar_popular_title -->
<div class="sidebar_popular_content">
<?php
function filter_where($where = '') {
//posts in the last 14 days
$where .= " AND post_date > '" . date('Y-m-d', strtotime('-14 days')) . "'";
return $where;
}
// Register the filtering function
add_filter('posts_where', 'filter_where');
$popular = new WP_Query('orderby=comment_count&posts_per_page=5');
?>
<?php while ($popular->have_posts()) : $popular->the_post(); ?>
<div class="sidebar_feature"><div class="popular_number"><?php comments_number('0','1','%'); ?></div><div class="popular_c$
<div class="clear"></div>
<?php endwhile; ?>
</div><!-- sidebar_popular_content -->
</div><!-- sidebar_popular -->
<?php }

pablo
August 22, 2010 7:45 pm

how do you exclude trackbacks from here and also only show posts with more than 1 comment.

chibi
July 23, 2010 2:02 am

Is there a way to display most commented posts, but exclude comments from pages being on the list?

Thanks

Devin
July 21, 2010 3:42 pm

Awesome. Just removed 15 unneeded database queries from a client’s site.

HTML to WordPress Case Study | WPShout.com
February 25, 2010 7:44 pm

[…] 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: […]

Jim
February 4, 2010 2:12 pm

Thanks for the cool little trick.. Nowi can disable some pluging.. thanks again…

isa
January 17, 2010 11:35 am

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.

Showing Off Your Popular Posts | Code Next Door
January 9, 2010 2:41 pm

[…] Denning over at WPSHOUT posted a nice tip for displaying popular posts without the need for a plugin. You can now order […]

Kristof
January 8, 2010 6:05 pm

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
January 8, 2010 10:54 pm
Reply to  Kristof

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
January 9, 2010 5:02 pm
Reply to  Sels

Thanks SEL – Subscribed to your RSS and Tweeted your article.

Sels
January 9, 2010 5:18 pm
Reply to  Kristof

You’re welcome Kristof, glad I could help.

Get most commented posts with thumbnails
January 8, 2010 6:30 am

[…] to Alex Denning for this nice trick! If you enjoyed this article, please consider sharing it! tweetmeme_style = […]

Ashfame
January 7, 2010 8:16 pm

Yes cool tip! Will use it on homepage.

Sean O'Grady
January 7, 2010 2:37 pm

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=””>

Ben
January 7, 2010 1:10 pm

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?

Gonzo
January 7, 2010 7:47 am

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.

tom
January 7, 2010 12:07 am

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?

tom
January 8, 2010 8:38 pm
Reply to  Alex Denning

Ah, thanks for the link – is there no end to the PHP/Wordpress options?!

Brad
January 6, 2010 9:33 pm

Thank you for the quick tip. I love eliminating extraneous plugins with small chunks of php.