Petr Pabouček
Freelance Web Developer

Prohlédněte si seznam mnou nabízených služeb, podívejte se, co o mě říkají mí klienti, či na jakých projektech jsem se podílel. V případě zájmu o spolupráci, či jakýchkoliv jiných dotazů, mě prosím kontaktujte.

How to allow comments on scheduled posts in WordPress

When working on one project for client of mine I’ve bumped into problem when trying to allow comments on scheduled posts. In this specific case, scheduled posts are used for displaying different type of promotions. WordPress theme then uses a template which allows for displaying scheduled posts on the front-end and once the publication date is reached, promotion is automatically taken off the site.  So far so good.

The problem arrived when I tried to allow comments on the promotions (scheduled posts). Comment form appears as expected, but when the comment is submitted, it never makes it through. I’ve tried to do bit of a research on the Internet, but unfortunately haven’t found any  satisfying solution, which wouldn’t require altering core files.

The reason, why comment never makes it through is caused by this condition in wp-comments-post.php file.

elseif ( ! $status_obj->public && ! $status_obj->private ) {
/**
* Fires when a comment is attempted on a post in draft mode.
*
* @since unknown
* @param int $comment_post_ID Post ID.
*/
do_action( 'comment_on_draft', $comment_post_ID );
exit;
}

Simple amend of this condition would do the trick for me, but I wanted to avoid core files edit. The only cleaner available solution I am able to see so far is hook into comment_on_draft action. So basically what I did, I’ve just taken the relevant parts of the code from wp-comments-post.php and pasted them into own function which is then hooked into comment_on_draft action.

function my_publish_comment( $comment_post_ID ) {

  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->exists() ) {
  	if ( empty( $user->display_name ) )
  		$user->display_name=$user->user_login;
  	$comment_author       = wp_slash( $user->display_name );
  	$comment_author_email = wp_slash( $user->user_email );
  	$comment_author_url   = wp_slash( $user->user_url );
  	if ( current_user_can( 'unfiltered_html' ) ) {
  		if ( ! isset( $_POST['_wp_unfiltered_html_comment'] )
  			|| ! wp_verify_nonce( $_POST['_wp_unfiltered_html_comment'], 'unfiltered-html-comment_' . $comment_post_ID )
  		) {
  			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 = '';

  if ( get_option('require_name_email') && !$user->exists() ) {
  	if ( 6 > strlen($comment_author_email) || '' == $comment_author )
  		wp_die( __('<strong>ERROR</strong>: please fill the required fields (name, email).') );
  	elseif ( !is_email($comment_author_email))
  		wp_die( __('<strong>ERROR</strong>: please enter a valid email address.') );
  }

  if ( '' == $comment_content )
  	wp_die( __('<strong>ERROR</strong>: please type a comment.') );

  $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);

  do_action( 'set_comment_cookies', $comment, $user );

  if ( $user->exists() ) {
    wp_set_comment_status( $comment_id, 'approve' );
  }

  $location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id;

  $location = apply_filters( 'comment_post_redirect', $location, $comment );

  wp_safe_redirect( $location );
  exit;
}
add_action( 'comment_on_draft', 'my_publish_comment' );

The only bit I had to add myself is this piece of code:

if ( $user->exists() ) {
  wp_set_comment_status( $comment_id, 'approve' );
}

For some reason comments were never automatically approved for logged in users and had to be approved manually. The bit above did the trick. And that’s it.

Pasting my_publish_comment function into functions.php in your theme will allow publishing of comments on scheduled posts.

If you know about better solution how to achieve same behavior, please let me know in comments.

 

Komentáře k článku

  • Javier
    14. 3. 2015

    Thanks to you deco, I have fixed my issue using sportpress plugin and premier theme, thanks! Good job!

  • Venelin Borisov
    28. 8. 2017

    This article and the code in it helped me solve an issue I was dealing with. Thank you for you’re effort.

    • BoUk
      28. 8. 2017

      No problem mate. Glad it helped.

      This article is quite old though, so perhaps there’s nowadays some better way to implement comments on scheduled posts.

Napsat komentář: Javier Zrušit odpověď