I would like to query out only posts that have comments. So posts with comment_count = 0 won't show but anything above that will.

This is what i query but it still picks out posts that doesen't have comments. Is there another way?

query_posts(array('comment_count' > 0, 'post_type' => 'letters', 'showposts' => 10, 'post_status' => array('publish'), 'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1), 'meta_key' => 'letter_show_on_site', 'meta_value' => "yes"));
  • 'comment_count' was not meant to filter posts in that manner. It was used by WP_Query only to order posts.
    – sri
    Dec 6, 2013 at 10:30
  • okay, thank you for the information. Is there any other way to pick out posts with comments?
    – Paparappa
    Dec 6, 2013 at 10:32

3 Answers 3


I ran into this same problem recently and developed a good solution that maintains paging (which some of the answers here do not) and also allows for only targeting certain comment types and comment approved statuses.

function has_comments_join( $join, &$wp_query ) {
    global $wpdb;
    if ($comment_term = $wp_query->get('post_has_comments')) {
        $join .= $wpdb->prepare(" JOIN $wpdb->comments ON (($wpdb->posts.ID = $wpdb->comments.comment_post_ID) AND ($wpdb->comments.comment_type = %s) AND ($wpdb->comments.comment_approved = %s)) ", $comment_term['comment_type'], $comment_term['comment_status']);
    return $join;

$results = new WP_Query(array(
    'post_has_comments' => array(
        'comment_type' => 'review',
        'comment_status' => '1'

This code can easily be refined to support multiple statuses, conditionals on type and status, etc... I even have a variant I use to do comparisons on comment meta, similar to the meta_query functionality.



you can use WP_Query

$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array(
    'post_type' => 'letters',
    'posts_per_page' => 10,
    'paged' => $paged,
    'meta_key' => 'letter_show_on_site',
    'meta_value' => "yes"
$the_query = new WP_Query($args);
if( $the_query->have_posts()){
        global $post;

        //show post which have comment_count > 0
        if( 0 < $post->comment_count ){



By using the query below(not tested) you will be able to get all the ids of posts that have comments.

$postids = $wpdb->get_col("SELECT distinct ID FROM $wpdb->posts, $wpdb->comments where comment_post_ID = ID ORDER BY ID");

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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