[wp-trac] [WordPress Trac] #18630: Custom Comment Validation Error

WordPress Trac wp-trac at lists.automattic.com
Tue Oct 4 15:06:56 UTC 2011


#18630: Custom Comment Validation Error
-----------------------------+------------------------------
 Reporter:  bandonrandon     |       Owner:
     Type:  feature request  |      Status:  new
 Priority:  normal           |   Milestone:  Awaiting Review
Component:  Comments         |     Version:  3.3
 Severity:  minor            |  Resolution:
 Keywords:                   |
-----------------------------+------------------------------
Changes (by jsherk):

 * cc: jsherk (added)


Comment:

 Definitely something needs to be done. Even if you could at least
 customize the message that appears!

 Anyways, here is a modified version of wp-comments-post.php for v3.2.1

 It sends the error message back to the comment page you came from as GET
 data.

 You need to place this code in whatever theme file is calling the comment
 form (for example single.php) but it would be nice if this was
 incorporated right into the comment form itself. This code will show the
 error message on the comment page that the error appeared on:
 {{{
   <?php if ($_GET['comment_error_msg']) { // Display Comment Error Message
 ?>
     <div class="comment_error_message">Comment <?php echo
 $_GET['comment_error_msg']; ?></div>
   <?php } ?>
 }}}

 And here is the modified part of the code for wp-comments-post.php
 (v3.2.1)
 Changes start after line 74 where it says {{{$comment_type = '';}}} :
 {{{
 <?php
 /**
  * Handles Comment Post to WordPress and prevents duplicate comment
 posting.
  *
  * @package WordPress
  */

 if ( 'POST' != $_SERVER['REQUEST_METHOD'] ) {
         header('Allow: POST');
         header('HTTP/1.1 405 Method Not Allowed');
         header('Content-Type: text/plain');
         exit;
 }

 /** Sets up the WordPress Environment. */
 require( dirname(__FILE__) . '/wp-load.php' );

 nocache_headers();

 $comment_post_ID = isset($_POST['comment_post_ID']) ? (int)
 $_POST['comment_post_ID'] : 0;

 $post = get_post($comment_post_ID);

 if ( empty($post->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.
 //Need to add the following code to your comments.php file wherever you
 want error message to display:
 /*
   <?php if ($_GET['comment_error_msg']) { // Display Comment Error Message
 ?>
     <div class="comment_error_message">Comment <?php echo
 $_GET['comment_error_msg']; ?><br>Note: If your comment text disappeared,
 try clicking your browser BACK button.</div>
   <?php } ?>
 */
 $comment_error_true = false; //MOD new code
 if ( '' == $comment_content ) {
     $comment_error_msg = __('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 ( 6 > strlen($comment_author_email) || '' == $comment_author )
 {
         $comment_error_msg = __('Error: please fill the required fields
 (name, email).'); //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 = __('Error: please enter a valid email
 address.'); //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;
 ?>
 }}}

-- 
Ticket URL: <http://core.trac.wordpress.org/ticket/18630#comment:2>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software


More information about the wp-trac mailing list