diff --git src/wp-includes/comment.php src/wp-includes/comment.php
index c134aadcd0..e2c5ccbd3c 100644
--- src/wp-includes/comment.php
+++ src/wp-includes/comment.php
@@ -3222,10 +3222,6 @@ function wp_handle_comment_submission( $comment_data ) {
 		}
 	}
 
-	if ( '' == $comment_content ) {
-		return new WP_Error( 'require_valid_comment', __( '<strong>ERROR</strong>: please type a comment.' ), 200 );
-	}
-
 	$commentdata = compact(
 		'comment_post_ID',
 		'comment_author',
@@ -3237,6 +3233,19 @@ function wp_handle_comment_submission( $comment_data ) {
 		'user_ID'
 	);
 
+	/**
+	 * Filters whether an empty comment should be allowed.
+	 *
+	 * @since 5.0.0
+	 *
+	 * @param bool  $allow_empty_comment Default false.
+	 * @param array $commentdata         Array of comment data to be sent to wp_insert_comment().
+	 */
+	$allow_empty_comment = apply_filters( 'allow_empty_comment', false, $commentdata );
+	if ( '' === $comment_content && ! $allow_empty_comment ) {
+		return new WP_Error( 'require_valid_comment', __( '<strong>ERROR</strong>: please type a comment.' ), 200 );
+	}
+
 	$check_max_lengths = wp_check_comment_data_max_lengths( $commentdata );
 	if ( is_wp_error( $check_max_lengths ) ) {
 		return $check_max_lengths;
