1

I'm trying to display comments in the sidebar from only the current category. So far I've got this:

<?php
    // Posts per page setting
    $ppp = 8; //get_option('posts_per_page'); // either use the WordPress global Posts per page setting or set a custom one like $ppp = 10;
    $custom_offset = 0; // If you are dealing with your custom pagination, then you can calculate the value of this offset using a formula

    // category (can be a parent category)
    $cat = get_query_var('cat');
    $category_parent = $cat;

    // lets fetch sub categories of this category and build an array
    $categories = get_terms( 'category', array( 'child_of' => $category_parent, 'hide_empty' => false ) );
    $category_list =  array( $category_parent );

    foreach( $categories as $term ) {
        $category_list[] = (int) $term->term_id;
    }

    // fetch posts in all those categories
    $posts = get_objects_in_term( $category_list, 'category' );

    $sql = "SELECT comment_ID, comment_date, comment_content, comment_post_ID, user_id, comment_author
     FROM {$wpdb->comments} WHERE
     comment_post_ID in (".implode(',', $posts).") AND comment_approved = 1
     ORDER by comment_date DESC LIMIT $ppp OFFSET $custom_offset";

    $comments_list = $wpdb->get_results( $sql );

    if ( count( $comments_list ) > 0 ) {

        $date_format = get_option( 'date_format' );

        foreach ( $comments_list as $comment ) {
?>

            <li>
                <a href="<?php echo ( get_permalink( $comment->comment_post_ID ) ); ?>#comment-<?php echo($comment->comment_ID); ?>"><?php echo get_avatar( $comment->user_id, 50 ); ?></a>
                <span><strong><?php echo($comment->comment_author); ?></strong> commented on</span>
                <h3><a href="<?php echo ( get_permalink( $comment->comment_post_ID ) ); ?>"><?php echo get_the_title ( $comment->comment_post_ID ); ?></a></h3>
                <span><?php echo($comment->comment_date); ?></span>
                <p>"<?php comment_excerpt(); ?>" <a href="<?php echo ( get_permalink( $comment->comment_post_ID ) ); ?>#comment-<?php echo($comment->comment_ID); ?>">Read More</a></p>
                <div class="clearfloat"></div><!-- Very Important -->
            </li>

<?php
        }

    } else {
        echo '<p>No comments</p>';
    }
?>

This either displays 0 comments or all comments everywhere, so it doesn't work. I don't understand what I did wrong...

3
  • What are "category specific comments"? Comments can be attached to a post type, not a taxonomy.
    – kaiser
    Jul 24, 2012 at 12:51
  • 1
    @kaiser category specific means, get only comments from posts in certain category.
    – user8842
    Jul 24, 2012 at 13:07
  • Then please update your question to be more specific. Not everyone reads through code or comments, when thinking about an answer.
    – kaiser
    Jul 24, 2012 at 13:32

1 Answer 1

1

Try this function:

function get_category_comments($category_id, $limit = 5) {

    global $wpdb;

    $sql = "
        SELECT {$wpdb->comments}.comment_ID
        FROM
            {$wpdb->comments},
            {$wpdb->posts},
            {$wpdb->term_taxonomy},
            {$wpdb->term_relationships}
        WHERE 1=1
            AND {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID
            AND {$wpdb->term_relationships}.object_id = {$wpdb->posts}.ID
            AND {$wpdb->term_relationships}.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id
            AND {$wpdb->comments}.comment_approved = '1'
            AND {$wpdb->term_taxonomy}.term_id = '{$category_id}'
        ORDER BY {$wpdb->comments}.comment_date DESC
        LIMIT 0, {$limit}
    ";
    $comments = array();
    foreach ($wpdb->get_results($sql) as $c)
        $comments[] = get_comment($c->comment_ID);
    return $comments;

}

Then you can have another function to display the comments:

function display_category_comments() {

    global $cat;
    if (!$category_id = intval($cat))
        return false;

    $comments = get_category_comments($category_id);
    ?>
    <ul>
    <?php foreach ($comments as $c) : $post = get_post($i = $c->comment_post_ID); ?>
        <li>
            <?php echo $c->comment_author; ?> - <a href="<?php echo get_permalink($post->ID); ?>" title="Permalink to <?php echo $post->post_title; ?>"><?php echo $post->post_title; ?></a>
        </li>
    <?php endforeach; ?>
    </ul>
    <?php
}

Your Answer

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