1
votes

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

But it does not work, it either displays 0 comments everywhere or all everywhere. I don;t understand what I did wrong...

Problem appears to be this part: // category (can be a parent category) $cat = get_query_var('cat'); $category_parent = $cat;

<?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>';
    }
?>
1
I didn't quite get "it either displays 0 comments everywhere or all everywhere". Two notes: 1) Your SQL query will fetch "all approved comments" (are there any approved?) 2) Your HTML output are <li> elements. Are these rendered under a parent <ul> element?pankar
@pankar yes they are under parent ul.user796443
@pankar as for the other question, I found this script here: blog.ashfame.com/2011/04/get-comments-category-wordpress it is third example I think. I changed $category_parent = 3; to $category_parent = $cat; so that in theory script should grab only from $cat category comments.user796443
@pankar if I put $category_parent = 644; this is category ID which contains 4 comments, I get total of 6 comments displayed. if I put 645 which has no comments 0 comments is displayed.user796443
Does the category with ID=644 has any 'children' categories which in turn have comments? I'm saying so, because the code above will fetch all the comments from the parent category including its childrenpankar

1 Answers

0
votes

WordPress has functions available that can query most of the things you need. For example, there is a function called get_the_category() which will include the current category and its children/ancestors.

Reference:


<?php

  $ppp = 8;
  $custom_offset = 0;

  // get the current category (includes children/parents)
  $categories = get_the_category();

  // create an array that only has each category_id
  $category_ids = array_map(function($category) {
    return $category->cat_ID;
  }, $categories);

  // find all posts by the category ids
  $posts = query_posts('cat=' . implode(',', $category_ids));

  // create an array that only has each post_id
  $post_ids = array_map(function($post) {
    return $post->ID;
  }, $posts);

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

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

  if( $comments ) {
    // do stuff with $comments
  }

?>