DiggingIntoWordPress

by Chris Coyier & Jeff Starr

Leave Comments Open Forever on Specific Categories or Page Templates

Posted by on

I like the idea of shutting off comments after a certain number of days. Here on Digging Into WordPress we do it after 90. After that kind of time, the “community” of the discussion is long over. I think a good practice for turning off comments is to instead leave a message informing visitors that the comment thread is closed, and offer a course of action in case they have something of grave importance to share.


The “comments closed” message on CSS-Tricks

Doing this is as simple as going to Settings > Discussion in your Admin area and setting the number of days before comments are turned off. This setting is completely global in that any single place on your entire site where comments are enabled, they will close after this number of days. On CSS-Tricks, I decided that while I like closing comments on articles after a certain amount of days, I wanted to leave comments open forever on my “snippets”, as I thought that those really aren’t meant for lengthy discussions anyway, and the comments are more for people sharing what works and what doesn’t. There really is no need for comments to be turned on for those.

Unfortunately I had no idea how to accomplish such a thing. So I emailed the smart guys over at WP Engineer, who came up with some good stuff.

Leave comments open forever on a particular CATEGORY

This is the code in it’s original form from WP Engineer:

/**
 * Close comments on an old post.  Hooked to comments_open and pings_open.
 * small modifications on the default functions of WordPress
 *
 * @param bool $open Comments open or closed
 * @param int $post_id Post ID
 * @param int $cat Category ID (cat_ID), set '' or empty for all categories
 * @param int $days_old Days to close comments, set '' for use value from settings
 * @return bool $open
 */
function wpe_close_comments_for_old_post( $open, $post_id, $cat = array(1, 4), $days_old = '' ) {
	if ( !$open )
		return $open;
 
	if ( in_category($cat) )
		return $open;
 
	if ( '' === $days_old )
		$days_old = (int) get_option('close_comments_days_old');
 
	if ( !$days_old )
		return $open;
 
	$post = get_post($post_id);
 
	if ( time() - strtotime( $post->post_date_gmt ) > ( $days_old * 24 * 60 * 60 ) )
		return false;
 
	return $open;
}
add_filter( 'comments_open', 'wpe_close_comments_for_old_post', 10, 2 );
add_filter( 'pings_open',    'wpe_close_comments_for_old_post', 10, 2 );

Leave comments open forever for a particular PAGE TEMPLATE

My own needs were slightly different in that I needed this to work for a special page template not a specific category (my snippets use page/parent structure not posts). I also just wanted regular posts to default to whatever setting was in the Admin, not set that number from the function.

And so my modified version is:

function wpe_close_comments_for_old_post( $open, $post_id, $template = 'page-snippet.php' ) {

	global $wp_query;
	
	if ( !$post_id ) {
		$post_id = $wp_query->post->ID;
    }
 
	if ( get_post_meta($post_id, '_wp_page_template', true) == $template && get_option('close_comments_for_old_posts') ) {
		return true;
	}

	return $open;
	
}
add_filter( 'comments_open', 'wpe_close_comments_for_old_post', 10, 2 );
add_filter( 'pings_open',    'wpe_close_comments_for_old_post', 10, 2 );

Works like a charm!

2 Responses

  1. hi there!

    been searching the net for something like this…

    I can’t get it to work… what i wanted was to keep all my comments open FOREVER…

    where exactly did you insert this code?

    and may be perhaps you could help me on the comment open forever thingie…

    thanks! appreciate it…

    • You don’t need this code if you want to leave all comments open forever, just go to Settings > Discussion and set it up that way.

Comments are closed. Contact us with any critical information. Thank you!

Code is poetry