В любом процессе разработки ошибки — это то, чего вы не можете избежать, независимо от того, насколько компетентны и тщательны вы при написании кода.
Как разработчик WordPress, ваша задача — убедиться, что любые ошибки в вашем коде обрабатываются правильно, не затрагивая конечного пользователя. WordPress поставляется с базовым классом обработки ошибок, а именно WP_Error
который можно использовать и интегрировать в ваш код для базовой обработки ошибок.
В этом уроке мы рассмотрим базовую анатомию класса WP_Error
, то, как он работает, и самое главное, мы рассмотрим, как интегрировать класс WP_Error
в наше приложение.
Что внутри
Структура класса WP_Error
самом деле очень проста и достаточно мощна, чтобы использовать ее в качестве механизма обработки ошибок для вашего плагина.
Весь исходный код для класса WP_Error
можно найти в файле wp-includes/class-wp-error.php
. Давайте посмотрим на его свойства и доступные методы.
свойства
WP_Error
имеет только два закрытых свойства, а именно: $errors
и $error_data
. $errors
используется для хранения связанных сообщений об ошибках, а $error_data
может использоваться для хранения связанных данных, к которым вы хотите обращаться позже. WP_Error
использует простую пару ключ-значение для хранения связанных ошибок и данных в объекте, поэтому ключ, определенный в WP_Error
должен быть уникальным, чтобы избежать перезаписи ранее определенного ключа.
методы
WP_Error
поставляется с различными методами, которые в конечном итоге изменяют два свойства, которые он содержит. Давайте посмотрим на некоторые из них.
-
get_error_codes
— возвращает все доступные коды ошибок для этого конкретного экземпляраWP_Error
. Если вам нужен только первый код ошибки, есть еще одна отдельная функция с именемget_error_code
. -
get_error_messages( $code )
— если$code
не указан, функция просто вернет все сохраненные сообщения в этом конкретном экземпляреWP_Error
. Опять же, если вам нужно только вернуть сообщение для определенного кода ошибки, просто используйтеget_error_message( $code )
. -
add( $code, $message, $data )
— эта функция особенно полезна, когда вы хотите изменить ошибки, хранящиеся в экземплярах.WP_Error
объект. Обратите внимание, что даже$message
и$data
не являются обязательными, переменная$errors
будет заполнена. -
add_data( $data, $code)
— если вы собираетесь изменять$error_data
свойство$error_data
, эту функцию можно использовать. Обратите внимание, что аргумент$code
идет вторым, в отличие от того, что мы имеем в методеadd
. Если$code
не указан, данные об ошибке будут добавлены к первому коду ошибки. -
remove( $code )
— это довольно новый метод, недавно добавленный в WordPress 4.1, который удаляет все связанные сообщения об ошибках и данные из определенного ключа.
функция
Как узнать, является ли конкретная переменная или данные, возвращаемые функцией, экземпляром WP_Error
? Ну, есть служебная функция, которую вы можете просто проверить, которая называется is_wp_error
которая возвращает true или false в зависимости от заданной переменной.
-
is_wp_error( $thing )
— возвращает true, если$thing
является экземпляромWP_Error
вWP_Error
случае — false.
Реализуй свой
Недостаточно просто знать, как WP_Error
внутренняя WP_Error
, вам также необходимо научиться правильно ее реализовывать в своем приложении. Давайте рассмотрим несколько примеров, чтобы лучше понять, как это работает.
Обработка ошибок, возвращаемых базовой функцией WordPress
WordPress предлагает множество полезных функций, которые можно использовать для ускорения нашего процесса разработки. Большинство функций также хорошо оснащены базовыми возможностями обработки ошибок, которые мы можем использовать.
Например, wp_remote_post
— очень полезная функция, которую мы можем использовать, чтобы сделать удаленный запрос POST к определенному URL. Однако мы не можем ожидать, что удаленный URL всегда доступен или наш запрос всегда успешен. Что мы знаем из страницы кодекса, так это то, что эта функция будет возвращать WP_Error
в случае ошибки. Эти знания помогут нам правильно реализовать обработку ошибок в нашем приложении.
Посмотрите на этот фрагмент.
// Make a responseo to remote url $url $response = wp_remote_post( $url, array( 'timeout' => 30, 'body' => array( 'foo' => 'bar' ) ) ); if ( is_wp_error( $response ) ) { echo 'ERROR: ' . $response->get_error_message(); } else { // do something }
Как видите, мы выполняем удаленный POST-запрос к $url
. Однако мы не просто принимаем данные $response
как есть, но вместо этого мы делаем небольшую проверку с помощью удобной функции is_wp_error
которую мы рассмотрели ранее. Если все хорошо, то только мы можем продолжить то, что мы хотим сделать с нашим $response
.
Возврат пользовательской ошибки в вашем собственном приложении
Допустим, у вас есть пользовательская функция, которая обрабатывает handle_form_submission
контактной формы с именем handle_form_submission
. Предполагая, что у нас где-то есть настраиваемая форма, давайте посмотрим, как мы можем улучшить функцию, реализовав нашу собственную функцию обработки ошибок.
function handle_form_submission() { // do your validation, nonce and stuffs here // Instantiate the WP_Error object $error = new WP_Error(); // Make sure user supplies the first name if ( empty( $_POST['first_name'] ) ) { $error->add( 'empty', 'First name is required' ); } // And last name too if ( empty( $_POST['last_name'] ) ) { $error->add( 'empty', 'Last name is required' ); } // Check for email address if ( empty( $_POST['email'] ) ) { $error->add( 'empty', 'Last name is required' ); } elseif ( ! is_email( $_POST['email'] ) ) { $error->add( 'invalid', 'Email address must be valid' ); } // Lastly, check for the message if ( empty( $_POST['message'] ) ) { $error->add( 'empty', 'Your message is required' ); } // Send the result if ( empty( $error->get_error_codes() ) ) { return $error; } // Everything is fine return true; }
Конечно, вам нужно будет реализовать собственную очистку и проверку в этих функциях, но это выходит за рамки данного руководства. Теперь, зная, что мы правильно возвращаем экземпляр WP_Error
при ошибке, мы можем использовать его для предоставления более значимого сообщения об ошибке конечному пользователю.
Предполагая, что у вас есть конкретная часть в приложении для отображения ошибки отправки формы, вы можете сделать это:
$result = handle_form_submission(); if ( is_wp_error( $result ) ) { echo '<p>Ops, something went wrong. Please rectify this errors</p>'; echo '<ul>'; echo '<li>' . implode( '</li><li>', $result->get_error_messages() ) . '</li>'; echo '</ul>'; } else { // Everything went well }
Внешние ссылки
- Класс Referece / WP_Error в кодексе WordPress
- Введение в класс WP_Error от Пиппина Уильямсона
- Почему WP_Error отстой Райана МакКью
Вывод
Совершенствование своего мастерства в разработке программного обеспечения также означает знание того, что делать, когда ваш код не может сделать то, что он должен делать, и уверенность в том, что ваше приложение может справиться с этим элегантно.
Что касается WordPress, использование поставляемого с ним класса WP_Error
обеспечивает довольно простую, но мощную реализацию обработки ошибок, которую вы можете интегрировать в свое приложение.
о чем ты думаешь? Как вы используете WP_Error
в своем ежедневном процессе разработки? Пожалуйста, поделитесь этим с нами ниже.