Thanks to Otto for this great post on the heads up on the new comment system for WordPress 2.7. After I read this I decided to get ahead of the curve and switch my Techozoic theme over to the new threaded commenting. I decided to take it a little further and separate pings and trackbacks from regular comments. At first this wasn’t working but after a quick email to the wp-testers list Ryan whipped up a fix for it. Anyway I figured I would explain how I did this. I continue below.
I’ll include a very simple working comment template then explain the pieces individually.
Edit Fixed a typo thanks to Otto.
[php collapse=”true” firstline=”1″ htmlscript=”true”]
<?php // Do not delete these lines
if (!empty($_SERVER[‘SCRIPT_FILENAME’]) && ‘comments.php’ == basename($_SERVER[‘SCRIPT_FILENAME’]))
die (‘Please do not load this page directly. Thanks!’);
if (function_exists(‘post_password_required’))
{
if ( post_password_required() )
{
echo ‘<p class="nocomments">This post is password protected. Enter the password to view comments.</p>’;
return;
}
} else
{
if (!empty($post->post_password))
{ // if there’s a password
if ($_COOKIE[‘wp-postpass_’ . COOKIEHASH] != $post->post_password)
{ // and it doesn’t match the cookie ?>
<p class="nocomments">This post is password protected. Enter the password to view comments.</p>
<?php return;
}
}
}
if (function_exists(‘wp_list_comments’)) :
//WP 2.7 Comment Loop
if ( have_comments() ) : ?>
<h3 id="comments"><?php comments_number(‘No Comments’, ‘One Comment’, ‘% Comments’ );?></h3>
<ul class="commentlist">
<?php wp_list_comments(‘type=comment’); ?>
</ul>
<h3>Trackbacks / Pingbacks</h3>
<ul class="trackback">
<?php wp_list_comments(‘type=pings’); ?>
</ul>
<div class="navigation">
<div class="alignleft"><?php previous_comments_link() ?></div>
<div class="alignright"><?php next_comments_link() ?></div>
</div>
<?php else : // this is displayed if there are no comments so far ?>
<?php if (‘open’ == $post->comment_status) :
// If comments are open, but there are no comments.
else : ?><p class="nocomments">Comments are closed.</p>
<?php endif;
endif;
else:
//WP 2.6 and older Comment Loop
/* This variable is for alternating comment background */
$oddcomment = ‘alt’;
?>
<!– You can start editing here. –>
<?php if ($comments) : ?>
<h3 id="comments"><?php comments_number(‘No comments filed’, ‘One comment’, ‘% comments’ );?> to “<?php the_title(); ?>”</h3>
<ol class="commentlist">
<?php foreach ( $comments as $comment ) : ?>
<li class="<?php echo $oddcomment; ?>" id="comment-<?php comment_ID() ?>">
Comment by <em><?php comment_author_link() ?></em>:
<?php if ($comment->comment_approved == ‘0’) : ?>
<em>Your comment is awaiting moderation.</em>
<?php endif; ?>
<br />
<small class="commentmetadata"><a href="#comment-<?php comment_ID() ?>" title=""><?php comment_date(‘l, F jS Y’) ?> at <?php comment_time() ?></a> <?php edit_comment_link(‘Edit’,”,”); ?></small>
<?php comment_text() ?>
</li>
<?php /* Changes every other comment to a different class */
if (‘alt’ == $oddcomment) $oddcomment = ”;
else $oddcomment = ‘alt’;
?>
<?php endforeach; /* end for each comment */ ?>
</ol>
<?php else : // this is displayed if there are no comments so far ?>
<?php if (‘open’ == $post->comment_status) : ?>
<!– If comments are open, but there are no comments. –>
<?php else : // comments are closed ?>
<!– If comments are closed. –>
<p class="nocomments">Comments are closed.</p>
<?php endif; ?>
<?php endif; ?>
<?php endif; // 2.6 and older Comment Loop end ?>
<?php if (‘open’ == $post->comment_status) : ?>
<div id="respond">
<h3>Leave a Reply</h3>
<?php if (function_exists(‘cancel_comment_reply_link’)) {
//2.7 comment loop code ?>
<div id="cancel-comment-reply">
<small><?php cancel_comment_reply_link();?></small>
</div>
<?php } ?>
<?php if ( get_option(‘comment_registration’) && !$user_ID ) : ?>
<p>You must be <a href="<?php echo get_option(‘siteurl’); ?>/wp-login.php?redirect_to=<?php the_permalink(); ?>">logged in</a> to post a comment.</p></div>
<?php else : ?>
<form action="<?php echo get_option(‘siteurl’); ?>/wp-comments-post.php" method="post" id="commentform">
<?php if ( $user_ID ) : ?>
<p>Logged in as <a href="<?php echo get_option(‘siteurl’); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option(‘siteurl’); ?>/wp-login.php?action=logout" title="Log out of this account">Logout »</a></p>
<?php else : ?>
<p><input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" tabindex="1" />
<label for="author"><small>Name <?php if ($req) echo "(required)"; ?></small></label></p>
<p><input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />
<label for="email"><small>Mail (will not be published) <?php if ($req) echo "(required)"; ?></small></label></p>
<p><input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="22" tabindex="3" />
<label for="url"><small>Website</small></label></p>
<?php endif; ?>
<?php comment_id_fields(); ?>
<!–<p><small><strong>XHTML:</strong> You can use these tags: <?php echo allowed_tags(); ?></small></p>–>
<p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p>
<p><input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment" />
<input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />
</p>
<?php do_action(‘comment_form’, $post->ID); ?>
</form>
</div>
<?php endif; // If registration required and not logged in ?>
<?php endif; // if you delete this the sky will fall on your head ?>
[/php]
This piece here is the password protected post check. This code is backward compatible with 2.6 and older as well as the new 2.7 function.
[php collapse=”true” firstline=”1″ htmlscript=”true”]<?php // Do not delete these lines
if (!empty($_SERVER[‘SCRIPT_FILENAME’]) && ‘comments.php’ == basename($_SERVER[‘SCRIPT_FILENAME’]))
die (‘Please do not load this page directly. Thanks!’);
if (function_exists(‘post_password_required’))
{
if ( post_password_required() )
{
echo ‘<p class="nocomments">This post is password protected. Enter the password to view comments.</p>’;
return;
}
} else
{
if (!empty($post->post_password))
{ // if there’s a password
if ($_COOKIE[‘wp-postpass_’ . COOKIEHASH] != $post->post_password)
{ // and it doesn’t match the cookie ?>
<p class="nocomments">This post is password protected. Enter the password to view comments.</p>
<?php return;
}
}
}[/php]
This is the new 2.7 comment section which functions more like the regular loop for posts now. Notice the two wp_list_comments call and the parameters given. The type parameter tells the loop which type of comment to output. Valid options are “comment, pingback, trackback, pings” pings include trackbacks and pingbacks together.
[php collapse=”true” firstline=”22″ htmlscript=”true” highlight=”27″]
if (function_exists(‘wp_list_comments’)) :
//WP 2.7 Comment Loop
if ( have_comments(‘type=comment’) ) : ?>
<h3 id="comments"><?php comments_number(‘No Comments’, ‘One Comment’, ‘% Comments’ );?></h3>
<ul class="commentlist">
<?php wp_list_comments(‘type=comment’); ?>
</ul>
<h3>Trackbacks / Pingbacks</h3>
<ul class="trackback">
<?php wp_list_comments(‘type=pings’); ?>
</ul>
<div class="navigation">
<div class="alignleft"><?php previous_comments_link() ?></div>
<div class="alignright"><?php next_comments_link() ?></div>
</div>
<?php else : // this is displayed if there are no comments so far ?>
<?php if (‘open’ == $post->comment_status) :
// If comments are open, but there are no comments.
else : ?><p class="nocomments">Comments are closed.</p>
<?php endif;
endif;
[/php]
This code is the 2.6 and older comment loop.
[php collapse=”true” firstline=”50″ htmlscript=”true”]
<?php if ($comments) : ?>
<h3 id="comments"><?php comments_number(‘No comments filed’, ‘One comment’, ‘% comments’ );?> to “<?php the_title(); ?>”</h3>
<ol class="commentlist">
<?php foreach ( $comments as $comment ) : ?>
<li class="<?php echo $oddcomment; ?>" id="comment-<?php comment_ID() ?>">
Comment by <em><?php comment_author_link() ?></em>:
<?php if ($comment->comment_approved == ‘0’) : ?>
<em>Your comment is awaiting moderation.</em>
<?php endif; ?>
<br />
<small class="commentmetadata"><a href="#comment-<?php comment_ID() ?>" title=""><?php comment_date(‘l, F jS Y’) ?> at <?php comment_time() ?></a> <?php edit_comment_link(‘Edit’,”,”); ?></small>
<?php comment_text() ?>
</li>
<?php /* Changes every other comment to a different class */
if (‘alt’ == $oddcomment) $oddcomment = ”;
else $oddcomment = ‘alt’;
?>
<?php endforeach; /* end for each comment */ ?>
</ol>
<?php else : // this is displayed if there are no comments so far ?>
<?php if (‘open’ == $post->comment_status) : ?>
<!– If comments are open, but there are no comments. –>
<?php else : // comments are closed ?>
<!– If comments are closed. –>
<p class="nocomments">Comments are closed.</p>
<?php endif; ?>
<?php endif; ?>
<?php endif; // 2.6 and older Comment Loop end ?>
[/php]
This code is the actual comment form. It has to be modified slightly to work with 2.7.
[php collapse=”true” firstline=”84″ htmlscript=”true”]
<?php if (‘open’ == $post->comment_status) : ?>
<div id="respond">
<h3>Leave a Reply</h3>
<?php if (function_exists(‘cancel_comment_reply_link’)) {
//2.7 comment loop code ?>
<div id="cancel-comment-reply">
<small><?php cancel_comment_reply_link();?></small>
</div>
<?php } ?>
<?php if ( get_option(‘comment_registration’) && !$user_ID ) : ?>
<p>You must be <a href="<?php echo get_option(‘siteurl’); ?>/wp-login.php?redirect_to=<?php the_permalink(); ?>">logged in</a> to post a comment.</p></div>
<?php else : ?>
<form action="<?php echo get_option(‘siteurl’); ?>/wp-comments-post.php" method="post" id="commentform">
<?php if ( $user_ID ) : ?>
<p>Logged in as <a href="<?php echo get_option(‘siteurl’); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option(‘siteurl’); ?>/wp-login.php?action=logout" title="Log out of this account">Logout »</a></p>
<?php else : ?>
<p><input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" tabindex="1" />
<label for="author"><small>Name <?php if ($req) echo "(required)"; ?></small></label></p>
<p><input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />
<label for="email"><small>Mail (will not be published) <?php if ($req) echo "(required)"; ?></small></label></p>
<p><input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="22" tabindex="3" />
<label for="url"><small>Website</small></label></p>
<?php endif; ?>
<?php comment_id_fields(); ?>
<!–<p><small><strong>XHTML:</strong> You can use these tags: <?php echo allowed_tags(); ?></small></p>–>
<p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p>
<p><input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment" />
<input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />
</p>
<?php do_action(‘comment_form’, $post->ID); ?>
</form>
</div>
<?php endif; // If registration required and not logged in ?>
<?php endif; // if you delete this the sky will fall on your head ?>[/php]
Three items have to be added the the form for the comment threading to work properly.
[php htmlscript=”true” gutter=”false”]
<div id="respond">
<?php comment_id_fields(); ?>
<?php if (function_exists(‘cancel_comment_reply_link’)) //2.7 comment loop code{ ?>
<div id="cancel-comment-reply">
<small><?php cancel_comment_reply_link();?></small>
</div>[/php]
The first code needs to go above the comment form and wrap the entire form in the div, this way the whole form can be moved up when replying to a comment. The second code needs to go in the form somewhere, it doesn’t matter where because it is a hidden field. The last block of code needs to go underneath the Leave a reply heading, this code is the link that displays the cancel reply link.
Then last but not least this code has to be added to the header.php file above the call to wp_head.
[php htmlscript=”true” gutter=”false”]
<?php if ( is_singular() ) wp_enqueue_script( ‘comment-reply’ ); ?>
[/php]
This is a good resource for the different styles that are used by the new comment threading.

By Otto October 1, 2008 - 3:43 pm
Nice, but the have_comments() function does not take a parameter, yet. Maybe some way to do that sort of thing will get added soon.
By Dr. WordPress December 26, 2008 - 10:46 pm
mmmm and what code i will be use?
I cant understand anything :S
By Jeremy Clark December 28, 2008 - 7:58 am
I used Otto’s code as a basis for mine. I’ve just included full chunks of code as an example. It took me a little while to understand as well.
By Dr. WordPress January 5, 2009 - 12:25 am
I got it!! Thanks for the support 😀
By Balaguru January 29, 2009 - 5:18 am
Hi, I need a small help. While posting a comments for first time it will show as “No Responses to Post title” and “Your comment is awaiting moderation.”. But what I need is don’t want to display that message. Instead of that I need to display a session message. How can I do that?
By Jeremy Clark January 29, 2009 - 7:47 am
To do that with 2.7 you’ll need to use what’s called a comment callback. I’ve got a tutorial on how to do it here.
By Balaguru January 30, 2009 - 9:24 am
Thanks for your Response. But my wordpress version is 2.6 In that there is no function called comment call back.
By Jeremy Clark January 30, 2009 - 6:28 pm
Then you’ll need to edit the code that looks like this.
< ? php if ($comment->comment_approved == ‘0’) : ?>
Your comment is awaiting moderation.
< ? php endif; ?>
By Balaguru January 31, 2009 - 7:02 am
I found that line and changed. Now it is displaying for all the times until the comments change to approve. But I need to print this message once a time after giving the comments.
By Jeremy Clark October 1, 2008 - 3:51 pm
Very good point Otto that’s a typo when I was modifying the code for posting here. Thanks again.
By Vardis November 9, 2008 - 8:10 am
Great info – thanks.
By Charles December 13, 2008 - 4:52 pm
I noticed that when you hit reply it opens the comment form right below the post your are replying to. I do not think this is the default behavior, how did you accomplish this?
By Jeremy Clark December 14, 2008 - 3:27 pm
It’s the default behavior for 2.7, but it will only work if you have the enque script function like above and also make sure that comment_id_fields is present. If you have any trouble I can help you by email if you need, just let me know.
By Novo sistema de comentários do Wordpress 2.7 December 15, 2008 - 5:00 am
[…] no tema utilizado. Para ajudar, há um blog que ensina quais as alterações devem ser feitas e um outro que mostra um exemplo do código […]
By Birthplace of the Process of Illogical Logic December 15, 2008 - 12:03 pm
My WordPress 2.7 comment fix…
I spent pretty much every waking moment I had at home this weekend trying to wrap my head around the new comment loop in WordPress 2.7. Otto’s detailed explanation was helpful, but did not give me a way to “break down” the new wp_lis…
By mor10 December 27, 2008 - 9:03 pm
I get this no matter what I do:
Parse error: syntax error, unexpected ‘}’ in /wp-content/themes/theme/comments.php on line 95
By Mike January 11, 2009 - 12:16 pm
Yep there is a problem with the code above.
On line 95:
if (function_exists(‘cancel_comment_reply_link’)) //2.7 comment loop code{
should be
if (function_exists(‘cancel_comment_reply_link’)) {//2.7 comment loop code
also one of the div’s doesn’t get closed if a user isn’t logged in
By Mike January 11, 2009 - 12:17 pm
logged in to post a comment.
should be :
logged in to post a comment.
By Jeremy Clark January 12, 2009 - 6:43 am
You’re right, I’ve fixed the code above. Thanks Mike
By rmaspero January 12, 2009 - 4:52 pm
I have the same problem it tells me there is an arse error: syntax error, unexpected ‘}’ in /wp-content/themes/rmaspero.com 2.1/comments.php on line 91 but mines on line 91?
By Jeremy Clark January 13, 2009 - 6:58 am
That was my fault I messed the placement of a comment and it screwed up the rest of the code. The part that’s messed up is
if (function_exists(‘cancel_comment_reply_link’)) //2.7 comment loop code{ ?>
It needs to be
if (function_exists(‘cancel_comment_reply_link’)) {
//2.7 comment loop code ?>
I’ve fixed it in the above code as well.
By rmaspero January 14, 2009 - 5:19 am
Thanks
By aurrutia January 14, 2009 - 7:05 am
Hi Jeremy, thanks for this post, but I must say that I didn’t understant anything (shame on me)…
i don’t know what code is for comments.php, and what for other files.
Can you help me understand this?
Maybe put these files to download
thanks in Advance.
By Jeremy Clark January 14, 2009 - 7:09 am
The first big block of code is the whole comments.php the next five blocks just explain the individual pieces. The very last block of code needs to inserted into your header.php file. I’ll also contact you through email to see if I can help more.
By aurrutia January 14, 2009 - 7:36 am
Thanks a lot Jeremy!!!
Now it’s solved on my localhost test I got, later I will try it with my personal blog, thanks again!
By Styling Threaded Comments in Wordpress 2.7 | Dowan.org January 15, 2009 - 4:20 am
[…] WordPress 2.7 Comment Threading […]
By josh January 19, 2009 - 1:56 am
now, I have all this code added and the comments area styled. Quite happy with the way it looks.
One questions, when someone replies to a comment, will it notify that person by e-mail? I used the “comment e-mail responder” plugin and liked the feature.
Is it possible to have this work with the reply link in these threaded comments?
By Jeremy Clark January 19, 2009 - 4:18 pm
I’m not sure you might talk to that plugin author and see if they are planning on implementing that feature. As far as the default behavior of WordPress it’s not possible as far as I know.