General: Introduce the ability to merge multiple `WP_Error` objects into one another, and to store more than one item of data for an error.

This allows multiple errors to be instantiated independently but collected into one without having to manually combine their properties.

Props rmccue, dlh, TimothyBlynJacobs

Fixes #38777

Built from https://develop.svn.wordpress.org/trunk@49115


git-svn-id: http://core.svn.wordpress.org/trunk@48877 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
John Blackbourn 2020-10-09 22:22:05 +00:00
parent 92dacfafaf
commit 543b14ed0a
2 changed files with 95 additions and 17 deletions

View File

@ -2,8 +2,6 @@
/**
* WordPress Error API.
*
* Contains the WP_Error class and the is_wp_error() function.
*
* @package WordPress
*/
@ -27,7 +25,7 @@ class WP_Error {
public $errors = array();
/**
* Stores the list of data for error codes.
* Stores the most-recently added data for each error code.
*
* @since 2.1.0
* @var array
@ -35,7 +33,15 @@ class WP_Error {
public $error_data = array();
/**
* Initialize the error.
* Stores previously added data added for error codes, oldest-to-newest by code.
*
* @since 5.6.0
* @var array[]
*/
protected $additional_data = array();
/**
* Initializes the error.
*
* If `$code` is empty, the other parameters will be ignored.
* When `$code` is not empty, `$message` will be used even if
@ -60,7 +66,7 @@ class WP_Error {
}
/**
* Retrieve all error codes.
* Retrieves all error codes.
*
* @since 2.1.0
*
@ -75,7 +81,7 @@ class WP_Error {
}
/**
* Retrieve first error code available.
* Retrieves the first error code available.
*
* @since 2.1.0
*
@ -92,12 +98,12 @@ class WP_Error {
}
/**
* Retrieve all error messages or error messages matching code.
* Retrieves all error messages, or the error messages for the given error code.
*
* @since 2.1.0
*
* @param string|int $code Optional. Retrieve messages matching code, if exists.
* @return array Error strings on success, or empty array on failure (if using code parameter).
* @return array Error strings on success, or empty array if there are none.
*/
public function get_error_messages( $code = '' ) {
// Return all messages if no code specified.
@ -118,7 +124,7 @@ class WP_Error {
}
/**
* Get single error message.
* Gets a single error message.
*
* This will get the first message available for the code. If no code is
* given then the first code available will be used.
@ -126,7 +132,7 @@ class WP_Error {
* @since 2.1.0
*
* @param string|int $code Optional. Error code to retrieve message.
* @return string
* @return string The error message.
*/
public function get_error_message( $code = '' ) {
if ( empty( $code ) ) {
@ -140,7 +146,7 @@ class WP_Error {
}
/**
* Retrieve error data for error code.
* Retrieves the most-recently added error data for an error code.
*
* @since 2.1.0
*
@ -158,11 +164,11 @@ class WP_Error {
}
/**
* Verify if the instance contains errors.
* Verifies if the instance contains errors.
*
* @since 5.1.0
*
* @return bool
* @return bool If the instance contains errors.
*/
public function has_errors() {
if ( ! empty( $this->errors ) ) {
@ -201,11 +207,10 @@ class WP_Error {
}
/**
* Add data for error code.
*
* The error code can only contain one error data.
* Adds data to an error with the given code.
*
* @since 2.1.0
* @since 5.6.0 Errors can now contain more than one item of error data. {@see WP_Error::$additional_data}.
*
* @param mixed $data Error data.
* @param string|int $code Error code.
@ -215,9 +220,39 @@ class WP_Error {
$code = $this->get_error_code();
}
if ( isset( $this->error_data[ $code ] ) ) {
$this->additional_data[ $code ][] = $this->error_data[ $code ];
}
$this->error_data[ $code ] = $data;
}
/**
* Retrieves all error data for an error code in the order in which the data was added.
*
* @since 5.6.0
*
* @param string|int $code Error code.
* @return mixed[] Array of error data, if it exists.
*/
public function get_all_error_data( $code = '' ) {
if ( empty( $code ) ) {
$code = $this->get_error_code();
}
$data = array();
if ( isset( $this->additional_data[ $code ] ) ) {
$data = $this->additional_data[ $code ];
}
if ( isset( $this->error_data[ $code ] ) ) {
$data[] = $this->error_data[ $code ];
}
return $data;
}
/**
* Removes the specified error.
*
@ -231,5 +266,48 @@ class WP_Error {
public function remove( $code ) {
unset( $this->errors[ $code ] );
unset( $this->error_data[ $code ] );
unset( $this->additional_data[ $code ] );
}
/**
* Merges the errors in the given error object into this one.
*
* @since 5.6.0
*
* @param WP_Error $error Error object to merge.
*/
public function merge_from( WP_Error $error ) {
static::copy_errors( $error, $this );
}
/**
* Exports the errors in this object into the given one.
*
* @since 5.6.0
*
* @param WP_Error $error Error object to export into.
*/
public function export_to( WP_Error $error ) {
static::copy_errors( $this, $error );
}
/**
* Copies errors from one WP_Error instance to another.
*
* @since 5.6.0
*
* @param WP_Error $from From.
* @param WP_Error $to To.
*/
protected static function copy_errors( WP_Error $from, WP_Error $to ) {
foreach ( $from->get_error_codes() as $code ) {
foreach ( $from->get_error_messages( $code ) as $error_message ) {
$to->add( $code, $error_message );
}
foreach ( $from->get_all_error_data( $code ) as $data ) {
$to->add_data( $data, $code );
}
}
}
}

View File

@ -13,7 +13,7 @@
*
* @global string $wp_version
*/
$wp_version = '5.6-alpha-49114';
$wp_version = '5.6-alpha-49115';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.