Working with the WP_Error class
A veces cuando estamos codificando una nueva característica... En realidad, cada vez que estamos codificando una nueva característica necesitamos saber qué está pasando, específicamente si algo no está funcionando como queremos. Esa es la razón por la que tiendo a mostrar muchos mensajes en mis entornos de desarrollo. Incluso si no es un error.
Pero a veces sí es un error, y cuando eso sucede siempre es mejor tratarlo como tal. Un simple mensaje puede no ser suficiente, tal vez necesitamos registrarlo, tal vez necesitamos detener la ejecución de la página. Tal vez necesitamos usar WP_Error.
En WordPress, tenemos una clase especial para trabajar con errores, WP_Error
. es una
clase bastante simple que nos ayuda a rastrear y registrar mensajes de error, digamos
que tenemos un formulario de contacto con dos campos, Nombre y Correo electrónico, por supuesto
queremos asegurarnos de que nuestros visitantes ingresen solo direcciones de correo electrónico válidas
y si no lo hacen, usamos WP_Error
para informarles.
El setup
Tengo un formulario simple con solo dos campos, cuando el usuario envía ese formulario,
los datos se enviarán a través de $_POST
, adjuntaré una acción para procesar el formulario
y validar los datos, así:
1function mah_custom_shortcode( $atts, $content = null ) {2 ob_start();3?>4 <form action="" id="mah_custom_form" method="post">5 <p>6 <label for="name"><?php _e( 'Nombre' ); ?></label><br>7 <input type="text" id="name" name="mah_name">8 </p>9 <p>10 <label for="email"><?php _e( 'Email' ); ?></label><br>11 <input type="text" id="email" name="mah_email">12 </p>13 <?php wp_nonce_field( 'mah_nonce_action', 'mah_nonce_field' ); ?>14 <input type="submit" class="primary" name="mah_submit" value="<?php _e( 'Enviar' ); ?>">15 </form>16<?php17 return apply_filters( 'mah_custom_shortcode', ob_get_clean() );18}19add_shortcode( 'mah_custom_form', 'mah_custom_shortcode' );20
Esto es bastante sencillo, solo estoy creando un shortcode para usar en mis publicaciones, ese shortcode mostrará el formulario, ahora veamos la función de proceso:
1function mah_process_function() {2 if ( isset( $_POST[ 'mah_submit' ] ) && wp_verify_nonce( $_POST[ 'mah_nonce_field' ], 'mah_nonce_action' ) ) {3 // Comienza la validación y guárdala en una variable4 $email = is_email( $_POST[ 'mah_email' ]) // Revisa si es una dirección válida5 ? sanitize_email( $_POST[ 'mah_email' ] ) // Es válida6 : new WP_Error( 'mah_email_error', __( 'Por favor agrega una dirección válida' ) );78 // Revisa si hubo un error9 if ( is_wp_error( $email ) ) {10 wp_die( $email->get_error_message(), 'mah_form_error' );11 }12 }1314}15add_action( 'init', 'mah_process_function' );16
- Primero verificamos si el valor de
mah_submit
está establecido, eso significa que el formulario ha sido enviado, luego verificamos el campo de nonce para asegurarnos de que todavía sea válido. - Usamos
is_email
para validar la dirección de correo electrónico, esta función es proporcionada por WordPress y devuelvetrue
si es válida. - Si el correo electrónico era válido, asignamos ese valor a la variable
$email
, después de usarsanitize_email
para limpiar la dirección por si acaso. - Si el correo electrónico no era válido, el valor que asignamos a la variable
$email
será un nuevo objeto de error. -mah_email_error
es el código que usamos para este error específico, cuando trabajamos con varios errores es una buena idea darles un código. - Luego podemos especificar el mensaje que se usará cuando mostremos este error al usuario.
Ahora, hemos creado nuestro error, pero aún necesitamos mostrarlo al usuario.
Afortunadamente, la clase WP_Error
también proporciona una función para esto: is_wp_error
.
Esta función verifica los datos pasados y si es un objeto de error devuelve true
.
Después de eso, es fácil usar wp_die
para mostrar el mensaje de error.
Trabajando con varios mensajes de error
Este pedazo de código fue útil si solo necesitábamos mostrar un mensaje de error a la vez, pero ¿qué pasa si quiero validar el campo Nombre también y mostrar ambos mensajes en la misma pantalla?
Podría usar el mismo enfoque, pero luego tendría dos objetos de error diferentes, solo quiero uno, así que necesito tener listo antes de validar los datos.
1function mah_process_function() {2 if ( isset( $_POST[ 'mah_submit' ] ) && wp_verify_nonce( $_POST[ 'mah_nonce_field' ], 'mah_nonce_action' ) ) {3 // Comienza el objeto de error4 $mah_error = new WP_Error();56 // Validar correo electrónico7 if ( is_email( $_POST[ 'mah_email' ] ) ) { // Revisa si es una dirección válida8 $email = sanitize_email( $_POST[ 'mah_email' ] ); // Es válida9 // Agrega un nuevo error al objeto10 } else {11 $mah_error->add( 'mah_email_error', __( 'Por favor agrega una dirección válida' ) );12 }1314 // Validar nombre15 if ( ! is_numeric( $_POST[ 'mah_name' ] ) ) { // no se permiten valores numéricos16 $name = sanitize_text_field( $_POST[ 'mah_name' ] ); // límpialo17 } else {18 $mah_error->add( 'mah_name_error', __( 'El nombre no puede ser un número') );19 }2021 // Revisa si hubo un error22 if ( is_wp_error( $mah_error ) ) {23 wp_die( $mah_error, __( 'Form Error' ) );24 }25 }2627}28
Puede ser bastante similar, pero tiene algunas diferencias, desglosemos:
- Ahora declaro
$mah_error
al principio, esto estará vacío ya que no he agregado ningún error todavía. $mah_error->add
: En lugar de devolvernew WP_Error
simplemente uso el método add para insertar un nuevo error en la lista, hago lo mismo con el siguiente campo.- Incluso si declaré
$mah_error
como un objetoWP_Error
al principio, no se tratará como un error hasta que agregue al menos un error a la lista, por lo queis_wp_error
seguirá siendo válido si está vacío. wp_die
puede aceptar una cadena como en el ejemplo anterior, o el objeto completoWP_Error
, si envío el objeto mostrará todos los errores en la lista.
Esta fue solo una simple introducción a la clase WP_Error
, recomiendo leer
a través del codex y tratar de usarlo tan a menudo como sea posible y revisar el resto
de métodos, hay cosas realmente útiles allí.