Index: src/wp-includes/functions.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/wp-includes/functions.php	(revision 44628)
+++ src/wp-includes/functions.php	(date 1547768849000)
@@ -3024,29 +3024,18 @@
 	$defaults = array( 'response' => 500 );
 	$r        = wp_parse_args( $args, $defaults );
 
-	$have_gettext = function_exists( '__' );
+	list( $message, $r, $title, $errors ) = _wp_die_process_input( $message, $r, $title );
 
-	if ( function_exists( 'is_wp_error' ) && is_wp_error( $message ) ) {
-		if ( empty( $title ) ) {
-			$error_data = $message->get_error_data();
-			if ( is_array( $error_data ) && isset( $error_data['title'] ) ) {
-				$title = $error_data['title'];
-			}
-		}
-		$errors = $message->get_error_messages();
-		switch ( count( $errors ) ) {
-			case 0:
-				$message = '';
-				break;
-			case 1:
-				$message = "<p>{$errors[0]}</p>";
-				break;
-			default:
-				$message = "<ul>\n\t\t<li>" . join( "</li>\n\t\t<li>", $errors ) . "</li>\n\t</ul>";
-				break;
-		}
-	} elseif ( is_string( $message ) ) {
-		$message = "<p>$message</p>";
+	switch ( count( $errors ) ) {
+		case 0:
+			$message = "<p>$message</p>";
+			break;
+		case 1:
+			$message = "<p>{$errors[0]}</p>";
+			break;
+		default:
+			$message = "<ul>\n\t\t<li>" . join( "</li>\n\t\t<li>", $errors ) . "</li>\n\t</ul>";
+			break;
 	}
 
 	if ( ! empty( $r['link_url'] ) && ! empty( $r['link_text'] ) ) {
@@ -3059,6 +3048,7 @@
 	}
 
 	if ( isset( $r['back_link'] ) && $r['back_link'] ) {
+		$have_gettext = function_exists( '__' );
 		$back_text = $have_gettext ? __( '&laquo; Back' ) : '&laquo; Back';
 		$message  .= "\n<p><a href='javascript:history.back()'>$back_text</a></p>";
 	}
@@ -3070,10 +3060,6 @@
 			header( 'Content-Type: text/html; charset=utf-8' );
 		}
 
-		if ( empty( $title ) ) {
-			$title = $have_gettext ? __( 'WordPress &rsaquo; Error' ) : 'WordPress &rsaquo; Error';
-		}
-
 		$text_direction = 'ltr';
 		if ( isset( $r['text_direction'] ) && 'rtl' == $r['text_direction'] ) {
 			$text_direction = 'rtl';
@@ -3237,15 +3223,10 @@
  * @param string|array $args    Optional. Arguments to control behavior. Default empty array.
  */
 function _json_wp_die_handler( $message, $title = '', $args = array() ) {
-	$defaults = array( 'response' => 500 );
-
-	$r = wp_parse_args( $args, $defaults );
+	$defaults = array( 'response' => 500, 'status' => 500, 'title' => $title );
+	$r        = wp_parse_args( $args, $defaults );
 
-	$data = array(
-		'code'    => 'wp_die',
-		'message' => $message,
-		'status'  => $r['response'],
-	);
+	list( $message, $r, $title, $errors ) = _wp_die_process_input( $message, $r, $title );
 
 	if ( ! headers_sent() ) {
 		header( 'Content-Type: application/json; charset=utf-8' );
@@ -3254,6 +3235,22 @@
 		}
 	}
 
+	$code = $r['code'];
+	unset( $r['code'] );
+	unset( $r['response'] );
+
+	$data = array(
+		'code'    => $code,
+		'message' => $message,
+		'data'    => $r,
+	);
+
+	if ( count( $errors ) > 1 ) {
+		// Remove the primary error.
+		array_shift( $errors );
+		$data['additional_errors'] = $errors;
+	}
+
 	echo wp_json_encode( $data );
 	die();
 }
@@ -3277,6 +3274,7 @@
 	$defaults = array( 'response' => 500 );
 
 	$r = wp_parse_args( $args, $defaults );
+	list( $message, $r ) = _wp_die_process_input( $message, $r );
 
 	if ( $wp_xmlrpc_server ) {
 		$error = new IXR_Error( $r['response'], $message );
@@ -3303,6 +3301,8 @@
 	);
 	$r        = wp_parse_args( $args, $defaults );
 
+	list( $message, $r ) = _wp_die_process_input( $message, $r );
+
 	if ( ! headers_sent() && null !== $r['response'] ) {
 		status_header( $r['response'] );
 	}
@@ -3330,6 +3330,39 @@
 	die();
 }
 
+/**
+ * @param string $message
+ * @param string $title
+ * @param array $args
+ *
+ * @return array
+ */
+function _wp_die_process_input( $message = '', array $args = array(), $title = '' ) {
+	$defaults = array( 'response' => 500, 'code' => 'wp_die', );
+	$args     = wp_parse_args( $args, $defaults );
+	$errors   = array();
+	if ( function_exists( 'is_wp_error' ) && is_wp_error( $message ) ) {
+		$errors       = $message->get_error_messages();
+		$args['code'] = $message->get_error_code();
+		$error_data   = $message->get_error_data();
+		$message      = $message->get_error_message();
+		if ( is_array( $error_data ) ) {
+			$args = wp_parse_args( $error_data, $args );
+			if ( empty( $title ) && isset( $error_data['title'] ) ) {
+				$title = $error_data['title'];
+			}
+		}
+
+	}
+
+	if ( empty( $title ) ) {
+		$have_gettext = function_exists( '__' );
+		$title        = $have_gettext ? __( 'WordPress &rsaquo; Error' ) : 'WordPress &rsaquo; Error';
+	}
+
+	return array( $message, $args, $title, $errors );
+}
+
 /**
  * Encode a variable into JSON, with some sanity checks.
  *
