WP_Error{} WP 2.1.0

Клас, завдання якого спростити обробку помилок (повідомлень) під час роботи з WordPress (створення плагінів, тем). Цей клас використовується для обробки помилок самим WordPress.

Для того, щоб розпочати роботу з класом, потрібно створити його екземпляр, а потім додавати або видаляти в нього помилки (повідомлення). Цей клас зручно використовувати не тільки для обробки помилок, але й для обробки простих повідомлень, наприклад: “Налаштування збережено”. Щоб перевірити, чи є будь-яка змінна PHP екземпляром класу WP_Error в WordPress є спеціальна функція is_wp_error() .

У параметрі $data (дані помилки) зазвичай записується опис помилки, де можна вказати як саме вирішити проблему. $message і $data це рядки і загалом вони схожі, але розробляться логікою: $message – повідомлення користувача і $data – повідомлення розробника.

Хуки із класу

Повертає

Нічого не вертає. Створює об’єкт.

Використання

// Пряме використання
return new WP_Error( $code, $message, $data );

// додавання кількох помилок
$errors = новий WP_Error;
$errors->add( $code, $message, $data );
$errors->add( $code, $message, $data );
$code
(рядок/число) (обов’язковий)
Код помилки. Якщо вказати однакові коди для різних помилок, ці помилки будуть згруповані за цим кодом. Тобто. потім можна буде отримати всі помилки, що мають вказаний код.
$message
(рядок) (обов’язковий)
Повідомлення помилки.
$data
(різне)

Будь-які додаткові дані. Отримати ці дані можна буде пізніше за кодом. Дивіться методи

За замовчуванням: ”

Приклади

0

#1 Виклик як функцію

$error = new WP_Error( 'error_key', 'Повідомлення помилки...', 404);

if( is_wp_error( $error ) ){
	echo $error->get_error_code(); //> error_key
	echo $error->get_error_message(); //> Повідомлення помилки...
	echo $error->get_error_data(); //> 404
}

Коли функція повертає створений у ній екземпляр WP_Error, який перевіряється функцією is_wp_error() . За таким принципом, наприклад, працює функція WordPress wp_insert_post() – у разі помилки вона повертає об’єкт WP_Error , в якому міститься інформація про помилку(ах). Коротко такий підхід можна записати так:

function some_stuff( $some = false ){
	// Змінна $some має бути вказана
	if( ! $some )
		return new WP_Error('fallen', 'Він упав і стати не може');
	else
		return true;
}

// тепер викликаємо функцію, щоб вона повернула помилку
$ return = some_stuff();

// перевіряємо змінну наявність помилки
if( is_wp_error( $return ) ){
	// Виводимо повідомлення помилки
	echo $return->get_error_message(); // виведе 'Він упав і стати не може'
}

У третьому параметрі $data можна передати будь-які дані. Але якщо помилка пов’язана із запитом, то WordPress у цьому параметрі прийнято передавати статус код відповіді. Наприклад, дивіться код функції wp_handle_comment_submission()

0

#2 Робота з об’єктом

Коли ми створюємо змінну з екземпляром класу WP_Error і потім працюємо з цією змінною, можна в іншому класі або іншій функції, групі функцій, де завгодно.

Наприклад, ми робимо форму зворотного зв’язку і нам потрібно обробляти помилки, у цьому випадку добре підійде екземпляр класу WP_Error . Наведу приклад створення екземпляра та додавання до нього помилок, та їх обробку:

// Створюємо екземпляр
global $form_error;
$form_error = новий WP_Error;

// Будь-яка функція, можливо в іншому файлі
function foo(){
	global $form_error;

	// якийсь код.

	// Перевірка поля
	if( empty( $email ) ){
		$form_error->add('no_email', 'Заповніть email');
	}
	elseif( ! is_email( $email ) ){
		$form_error->add('invalid_email', 'Некоректний email');
	}

	// Перевіряємо чи помилка обриваємо роботу функції
	if ( $form_error->get_error_code() )
		return; // виходимо далі роботу функції не продовжуємо через помилку

}

// Інший файл (не той, де функція foo() або той, не важливо) - файл де виводяться
// Повідомлення про помилки якщо такі є.
// Перевіряємо чи є помилка і виводимо всі повідомлення, якщо помилка
if ( $form_error->get_error_code() ) {
	foreach( $form_error->get_error_messages() as $error ){
		echo '<div><strong>Помилка</strong>:'. $error .'</div>';
	}
}
0

#3 Який виглядає екземпляр класу?

Щоб являти собою об’єкт WP_Error , пропоную подивитися на нього в заповненому вигляді:

// створюємо екземпляр і відразу додаємо дані - метод add()
$error = new WP_Error( 'fallen', 'Жук упав і стати не може.' );

// додамо ще дані об'єкт
$error->add( 'help', 'Чекає він, хто йому допоможе.' );

/* $error містить
WP_Error Object
(
	[errors] => Array
		(
			[fallen] => Array
				(
					[0] => Жук упав і встати не може.
				)

			[help] => Array
				(
					[0] => Чекає він, хто йому допоможе.
				)

		)

	[error_data] => Array
		(
		)

)
*/

// Додамо ще дані та вкажемо третій параметр
$error->add( 'frost', 'Іній ліг на гілки ялини.', 'error' );
$error->add( 'white', 'Голки за ніч побіліли.', 'message' );

/* тепер $error містить
WP_Error Object
(
	[errors] => Array
		(
			[fallen] => Array
				(
					[0] => Жук упав і встати не може.
				)

			[help] => Array
				(
					[0] => Чекає він, хто йому допоможе.
				)

			[frost] => Array
				(
					[0] => Іній ліг на гілки ялини.
				)

			[white] => Array
				(
					[0] => Голки за ніч побіліли.
				)

		)

	[error_data] => Array
		(
			[frost] => error
			[white] => message
		)

)
*/

$all_data = $error->get_all_error_data( 'white' );
/* $all_data містить:
Array
(
	[0] => message
)
*/

$data = $error->get_error_data( 'white' );
/* $data містить:
message
*/

Властивості класу

$errors
(масив)
Асоціативний масив, що містить перелік помилок. Де ключ – код помилки, а значення тексту – помилка.
$error_data
(масив)
Асоціативний масив, що містить список даних для вказаного в $ errors коду помилки.

Примітка: з версії 4.0, ці властивості класу мають видимість private, але завдяки чарівним методам їх як і раніше можна отримати публічно.

Методи класу

  1. public __construct( $code = ”, $message = ”, $data = ” )
  2. public add( $code, $message, $data = ” )
  3. public add_data( $data, $code = ” )
  4. protected static copy_errors( WP_Error $from, WP_Error $to )
  5. public export_to( WP_Error $error )
  6. public get_all_error_data( $code = ” )
  7. public get_error_code()
  8. public get_error_codes()
  9. public get_error_data( $code = ” )
  10. public get_error_message( $code = ” )
  11. public get_error_messages( $code = ” )
  12. public has_errors()
  13. public merge_from( WP_Error $error )
  14. public remove( $code )
__construct( $code = ”, $message = ”, $data = ” )
Додає помилку об’єкт (код (ключ), текст, додаткові дані). Якщо параметр
$code не встановлено, інші параметри будуть проігноровані. Якщо $code встановлено, то параметр $message буде використаний навіть якщо там порожній рядок, але параметр
$data у цьому випадку, буде використаний тільки якщо він не порожній. За допомогою методу
add() можна створювати кілька повідомлень під одним кодом.
get_error_codes()
Отримує всі ключі помилок. Доступ публічний повертає масив кодів помилок, якщо такі є.
get_error_code()
Отримує перший ключ помилки. Доступ до публічного, повертає рядок/число або порожній рядок, якщо кодів взагалі немає.
get_error_messages( $code = ” )
Отримує всі тексти помилок або всі тексти помилок під вказаним ключем. Доступ до публічного, повертає масив текстів помилок або порожній масив, якщо помилок немає.
get_error_message( $code = ” )
Отримує окреме повідомлення (текст) за переданим кодом (ключом) помилки. Якщо під ключом кілька повідомлень, то повернеться лише перше. Якщо параметр $code не передано, буде оброблений перший ключ.
get_error_data( $code = ” )
Отримує дані помилки за переданим ключем (кодом) помилки. Поверне значення (рядок/масив/булів) або null якщо даних немає.
add($code, $message, $data = ”)
Додає повідомлення до об’єкта (до списку помилок). Нічого не вертає.
add_data( $data, $code = ” )
Додає дані помилки (тексту) пов’язані із зазначеним ключем (кодом) помилки (тексту).
remove( $code )
(WP 4.1)
Видаляє помилку (повідомлення) з об’єкта за переданим ключем (кодом). Нічого не вертає.
has_errors()
(WP 5.1)
Повертає логічне значення, яке вказує на те, чи містить екземпляр помилки.

список змін

З версії 2.1.0Введено.

Код WP_Error{} WP 6.0.2

class WP_Error {
	/**
	 * Stores the list of errors.
	 *
	 * @ Since 2.1.0
	 * @var array
	 */
	$errors = array();

	/**
	 * Stores the most recently added data for each error code.
	 *
	 * @ Since 2.1.0
	 * @var array
	 */
	public $error_data = array();

	/**
	 * 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, thether parameters will be ignored.
	 * When `$code` is not empty, `$message` will be used even if
	 * it is empty. The `$data` parameter will be used only if it
	 * is not empty.
	 *
	 * Though the class is constructed with a single error code and
	 * message, multicodes може бути added using the `add()` method.
	 *
	 * @ Since 2.1.0
	 *
	 * @param string|int $code Error code.
	 * @param string $message Error message.
	 * @param mixed $data Optional. Error data.
	 */
	public function __construct( $code = '', $message = '', $data = '' ) {
		if ( empty( $code ) ) {
			return;
		}

		$this->add( $code, $message, $data );
	}

	/**
	 * Retrieves all error codes.
	 *
	 * @ Since 2.1.0
	 *
	 * @return array List of error codes, if available.
	 */
	public function get_error_codes() {
		if ( ! $this->has_errors() ) {
			return array();
		}

		return array_keys( $this->errors );
	}

	/**
	 * Retrieves the first error code available.
	 *
	 * @ Since 2.1.0
	 *
	 * @return string|int Empty string, якщо немає Error Codes.
	 */
	public function get_error_code() {
		$codes = $this->get_error_codes();

		if ( empty( $codes ) ) {
			return '';
		}

		return $codes[0];
	}

	/**
	 * Retrieves all error messages, або error messages for given error code.
	 *
	 * @ Since 2.1.0
	 *
	 * @param string|int $code Optional. Retrieve messages matching code, if exists.
	 * @return string[] Error strings на успіх, або empty array if there are none.
	 */
	public function get_error_messages( $code = '' ) {
		// Return all messages if no code specified.
		if ( empty( $code ) ) {
			$all_messages = array();
			foreach ((array) $this->errors as $code => $messages ) {
				$ all_messages = array_merge ($ all_messages, $ messages);
			}

			return $all_messages;
		}

		if ( isset( $this->errors[ $code ] ) ) {
			return $this->errors[ $code ];
		} else {
			return array();
		}
	}

	/**
	 * Gets a single error message.
	 *
	 * Це буде, щоб отримати перший список доступних для коду. If no code is
	 * given then the first code available will be used.
	 *
	 * @ Since 2.1.0
	 *
	 * @param string|int $code Optional. Error code to retrieve message.
	 * @return string The error message.
	 */
	public function get_error_message( $code = '' ) {
		if ( empty( $code ) ) {
			$code = $this->get_error_code();
		}
		$messages = $this->get_error_messages( $code );
		if ( empty( $messages ) ) {
			return '';
		}
		return $messages[0];
	}

	/**
	 * Retrieves the most recently added error data for an error code.
	 *
	 * @ Since 2.1.0
	 *
	 * @param string|int $code Optional. Error code.
	 * @return mixed Error data, if it exists.
	 */
	public function get_error_data( $code = '' ) {
		if ( empty( $code ) ) {
			$code = $this->get_error_code();
		}

		if ( isset( $this->error_data[ $code ] ) ) {
			return $this->error_data[ $code ];
		}
	}

	/**
	 * Verifies if the instance contains errors.
	 *
	 * @ Since 5.1.0
	 *
	 * @return bool Якщо ви помітили помилки.
	 */
	public function has_errors() {
		if ( ! empty( $this->errors ) ) {
			return true;
		}
		return false;
	}

	/**
	 * Adds error або appends additional message to an existing error.
	 *
	 * @ Since 2.1.0
	 *
	 * @param string|int $code Error code.
	 * @param string $message Error message.
	 * @param mixed $data Optional. Error data.
	 */
	public function add( $code, $message, $data = '' ) {
		$this->errors[ $code ][] = $message;

		if (! empty($data)) {
			$this->add_data( $data, $code );
		}

		/**
		 * Fires when an error is added to a WP_Error object.
		 *
		 * @ Since 5.6.0
		 *
		 * @param string|int $code Error code.
		 * @param string $message Error message.
		 * @param mixed $data Error data. Might be empty.
		 * @param WP_Error $wp_error WP_Error object.
		 */
		do_action( 'wp_error_added', $code, $message, $data, $this );
	}

	/**
	 * 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.
	 */
	public function add_data( $data, $code = '' ) {
		if ( empty( $code ) ) {
			$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 error code in the order in which the data був 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.
	 *
	 * Ця функція повертає всі error messages поєднана з конкретним
	 * error code, тривалий час з будь-яким error data для цього коду.
	 *
	 * @ Since 4.1.0
	 *
	 * @param string|int $code Error code.
	 */
	public function remove( $code ) {
		unset( $this->errors[ $code ] );
		unset( $this->error_data[ $code ] );
		unset( $this->additional_data[ $code ] );
	}

	/**
	 * Merges the errors in given error error object in 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 в цей об'єкт в 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 з одного WP_Error instance to another.
	 *
	 * @ Since 5.6.0
	 *
	 * @param WP_Error $from WP_Error для копіювання.
	 * @param WP_Error $to The WP_Error to copy 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);
			}
		}
	}
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *