WordPress Custom Comment Error Page

I am currently using WordPress version 3.2.1 and one mild annoyance with this version and previous versions, is the way errors on comments are handled. If you do not fill in a required field (usually Name/Email) or you forget to write something in the Comment field, then it takes you to a completely new page with a tiny error message in the middle of the screen. There are currently no hooks for this, so the only solution is to hack the core wp−comments−post.php file.

When there is an error in your comment, it takes you to a boring new page that looks like this:

With the modified code, it takes you back to your comment page and shows the error on the page, like this pic. Try it the comments at the bottom of this page by leaving the Name and/or Email field blank and clicking POST COMMENT:

DISCLAIMER: You make these changes below at your own risk! Backup your original files before you change them. I am not responsible if something breaks or stops working.

STEP 1

The following code is what actually displays the error message. Add it to your themes comments.php  file,  just above the call to the comment_form() function (download here):

STEP 2

Make a copy of your wp-comments-post.php to something like wp-comments-post.php.ORIG  so that you have a backup of the original file.

STEP 3

Replace the wp-comments-post.php with this one below (download here), and you are done!
Note that the modifications start at about line 75.
Also note that this is for WordPress v3.2.1 only:

comment_status) ) {
do_action('comment_id_not_found', $comment_post_ID);
exit;
}

// get_post_status() will get the parent status for attachments.
$status = get_post_status($post);

$status_obj = get_post_status_object($status);

if ( !comments_open($comment_post_ID) ) {
do_action('comment_closed', $comment_post_ID);
wp_die( __('Sorry, comments are closed for this item.') );
} elseif ( 'trash' == $status ) {
do_action('comment_on_trash', $comment_post_ID);
exit;
} elseif ( !$status_obj->public && !$status_obj->private ) {
do_action('comment_on_draft', $comment_post_ID);
exit;
} elseif ( post_password_required($comment_post_ID) ) {
do_action('comment_on_password_protected', $comment_post_ID);
exit;
} else {
do_action('pre_comment_on_post', $comment_post_ID);
}

$comment_author = ( isset($_POST['author']) ) ? trim(strip_tags($_POST['author'])) : null;
$comment_author_email = ( isset($_POST['email']) ) ? trim($_POST['email']) : null;
$comment_author_url = ( isset($_POST['url']) ) ? trim($_POST['url']) : null;
$comment_content = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

// If the user is logged in
$user = wp_get_current_user();
if ( $user->ID ) {
if ( empty( $user->display_name ) )
$user->display_name=$user->user_login;
$comment_author = $wpdb->escape($user->display_name);
$comment_author_email = $wpdb->escape($user->user_email);
$comment_author_url = $wpdb->escape($user->user_url);
if ( current_user_can('unfiltered_html') ) {
if ( wp_create_nonce('unfiltered-html-comment_' . $comment_post_ID) != $_POST['_wp_unfiltered_html_comment'] ) {
kses_remove_filters(); // start with a clean slate
kses_init_filters(); // set up the filters
}
}
} else {
if ( get_option('comment_registration') || 'private' == $status )
wp_die( __('Sorry, you must be logged in to post a comment.') );
}

$comment_type = '';

//MOD Customize comment error message.
$comment_error_true = false; //MOD new code
if ( '' == $comment_content ) {
$comment_error_msg = __('Comment ERROR: Please type a comment.'); //MOD new code
$comment_error_true = true; //MOD new code
//wp_die( __('Error: please type a comment.') ); //original
}

if ( get_option('require_name_email') && !$user->ID ) {
if ( '' == $comment_author ) {
$comment_error_msg = __('Comment ERROR: Please enter your Name.
Note: If your comment text disappeared, try clicking your browser BACK button.'); //MOD new code
$comment_error_true = true; //MOD new code
//wp_die( __('Error: please fill the required fields (name, email).') ); //original
} elseif ( !is_email($comment_author_email)) {
$comment_error_msg = __('Comment ERROR: Please enter a valid Email address.
Note: If your comment text disappeared, try clicking your browser BACK button.'); //MOD new code
$comment_error_true = true; //MOD new code
//wp_die( __('Error: please enter a valid email address.') ); //original
}
}

//MOD Original code is now in the ELSE statement
if (true == $comment_error_true) { //MOD new code

//Set this to false to use default wp_die page
$use_comment_custom_error_page = true; //MOD new code

if ($use_comment_custom_error_page) { //MOD new code
$location = get_permalink() . '?comment_error_msg=' . urlencode($comment_error_msg); //MOD new code
if ( !$user->ID ) { //MOD new code
$comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000); //MOD new code
setcookie('comment_author_' . COOKIEHASH, $comment_author, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); //MOD new code
setcookie('comment_author_email_' . COOKIEHASH, $comment_author_email, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); //MOD new code
setcookie('comment_author_url_' . COOKIEHASH, esc_url($comment_author_url), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); //MOD new code
//setcookie('comment_content_' . COOKIEHASH, $comment_content, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); //MOD new code //TO DO: Figure out how to get Comment field to re-appear and not be deleted.
} //MOD new code
} else { //MOD new code
wp_die($comment_error_msg); //MOD new code //This performs the default comment error page action
} //MOD new code
} else { //MOD new code

//Original unmodified code STARTS here
$comment_parent = isset($_POST['comment_parent']) ? absint($_POST['comment_parent']) : 0;

$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');

$comment_id = wp_new_comment( $commentdata );

$comment = get_comment($comment_id);
if ( !$user->ID ) {
$comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000);
setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
setcookie('comment_author_url_' . COOKIEHASH, esc_url($comment->comment_author_url), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
}

$location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id;
$location = apply_filters('comment_post_redirect', $location, $comment);
//Original unmodified code ENDS here

} //MOD new code

wp_redirect($location);
exit;
?>