WordPress already provides an easy function for fetching the comments get_comments() but the function only supports fetching comments of a particular user, or for a particular post and not fetching comments of a particular category. The code for the former two cases, is pretty simple but the last one is not so simple. Here are the code snippets as examples:
Fetching Comments of a particular user
$args = array( 'number' => 10, 'status' => 'approve', 'user_id' => 1 ); $comments_list_by_user = get_comments( $args ); print_r ( $comments_list_by_user );
Fetching Comments of a particular post
$args = array( 'number' => 10, 'status' => 'approve', 'post_id' => 30 ); $comments_list_post = get_comments( $args ); print_r ( $comments_list_post );
Fetching Comments of a particular category
Here is how you can fetch comments for a specific category:
// Posts per page setting $ppp = 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) $category_parent = 3; // 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 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' ); echo '<ul>'; foreach ( $comments_list as $comment ) { echo '<li>Comment: '.substr( $comment->comment_content, 0, 50 ).'..<br />'.date( $date_format, strtotime( $comment->comment_date ) ).'<br />Post: <a href="'.get_permalink( $comment->comment_post_ID ).'">'.get_the_title( $comment->comment_post_ID ).'</a></li>'; } echo '</ul>'; } else { echo '<p>No comments</p>'; } ?>
What we have done here is that, first we fetch sub categories of the category specified so as to include comments on those posts too which are under a sub-category of the specified category. Then we build an array of all these categories, where we need to look up for comments. Then we fetch the posts ID under those categories and then we use a query to fetch the comments on those posts. Finally, we display them as per our need by iterating $comments_list.
In case you want to fetch the comments of a particular user under a specific category, then you can just change the SQL query in the above code to this:
$user_id = 1; // change this to the user ID either manually or let it come from some other code $sql = "SELECT comment_ID, comment_date, comment_content, comment_post_ID FROM {$wpdb->comments} WHERE comment_post_ID in (".implode(',', $posts).") AND comment_approved = 1 AND user_id = $user_id ORDER by comment_date DESC LIMIT $ppp OFFSET $custom_offset";
I have used simple names for variables here to make it easy to understand. Always take care to provide your code in its own namespace, choose unique (non-generic) names. Read prefix everything in WordPress.
Need help? Got questions? Comment section is all yours! 🙂
Comments
6 responses to “Fetch comments of a specific category in WordPress”
and what if i wanted to offset 5 posts at a time?
what variable do I alter?
Edit $custom_offset
Fetch comments of a specific category in WordPress | Ashfame…
Since get_comments doesn’t support it, here is how to fetch comments of a specific category and even just for a single user of a category…
This is really useful, thanks.
Any way to do this for tags instead, though?
Thanks a lot for this codes, it helps me! 🙂
Kudos!