Comments: When commenting on a draft post, display a friendly error message if the user can view the post.

This prevents the unhelpful white screen of death when a user who can view the post (eg. preview it) leaves a comment while the post is in draft.

Props sagarprajapati, milindmore22, mayurk, swissspidy
Fixes #39650


git-svn-id: https://develop.svn.wordpress.org/trunk@40128 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
John Blackbourn 2017-02-27 00:22:02 +00:00
parent b33b5d1a28
commit 5ab0154647
2 changed files with 36 additions and 3 deletions

View File

@ -3005,8 +3005,12 @@ function wp_handle_comment_submission( $comment_data ) {
* @param int $comment_post_ID Post ID.
*/
do_action( 'comment_on_draft', $comment_post_ID );
return new WP_Error( 'comment_on_draft' );
if ( current_user_can( 'read_post', $comment_post_ID ) ) {
return new WP_Error( 'comment_on_draft', __( 'Sorry, comments are not allowed for this item.' ), 403 );
} else {
return new WP_Error( 'comment_on_draft' );
}
} elseif ( post_password_required( $comment_post_ID ) ) {

View File

@ -68,7 +68,6 @@ class Tests_Comment_Submission extends WP_UnitTestCase {
}
public function test_submitting_comment_to_draft_post_returns_error() {
$error = 'comment_on_draft';
$this->assertSame( 0, did_action( $error ) );
@ -84,9 +83,39 @@ class Tests_Comment_Submission extends WP_UnitTestCase {
$this->assertSame( 1, did_action( $error ) );
$this->assertWPError( $comment );
$this->assertSame( $error, $comment->get_error_code() );
$this->assertEmpty( $comment->get_error_message() );
}
/**
* @ticket 39650
*/
public function test_submitting_comment_to_draft_post_returns_error_message_for_user_with_correct_caps() {
$error = 'comment_on_draft';
$user = self::factory()->user->create_and_get( array(
'role' => 'author',
) );
wp_set_current_user( $user->ID );
$this->assertSame( 0, did_action( $error ) );
$post = self::factory()->post->create_and_get( array(
'post_status' => 'draft',
'post_author' => $user->ID,
) );
$data = array(
'comment_post_ID' => $post->ID,
);
$comment = wp_handle_comment_submission( $data );
$this->assertSame( 1, did_action( $error ) );
$this->assertWPError( $comment );
$this->assertSame( $error, $comment->get_error_code() );
$this->assertNotEmpty( $comment->get_error_message() );
}
public function test_submitting_comment_to_scheduled_post_returns_error() {
// Same error as commenting on a draft