Skip to main content

Working with the WP_Error class

Publicado hace
Actualizado hace
7 minutos de lectura

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<?php
17 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 variable
4 $email = is_email( $_POST[ 'mah_email' ]) // Revisa si es una dirección válida
5 ? sanitize_email( $_POST[ 'mah_email' ] ) // Es válida
6 : new WP_Error( 'mah_email_error', __( 'Por favor agrega una dirección válida' ) );
7
8 // Revisa si hubo un error
9 if ( is_wp_error( $email ) ) {
10 wp_die( $email->get_error_message(), 'mah_form_error' );
11 }
12 }
13
14}
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 devuelve true si es válida.
  • Si el correo electrónico era válido, asignamos ese valor a la variable $email, después de usar sanitize_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 error
4 $mah_error = new WP_Error();
5
6 // Validar correo electrónico
7 if ( is_email( $_POST[ 'mah_email' ] ) ) { // Revisa si es una dirección válida
8 $email = sanitize_email( $_POST[ 'mah_email' ] ); // Es válida
9 // Agrega un nuevo error al objeto
10 } else {
11 $mah_error->add( 'mah_email_error', __( 'Por favor agrega una dirección válida' ) );
12 }
13
14 // Validar nombre
15 if ( ! is_numeric( $_POST[ 'mah_name' ] ) ) { // no se permiten valores numéricos
16 $name = sanitize_text_field( $_POST[ 'mah_name' ] ); // límpialo
17 } else {
18 $mah_error->add( 'mah_name_error', __( 'El nombre no puede ser un número') );
19 }
20
21 // Revisa si hubo un error
22 if ( is_wp_error( $mah_error ) ) {
23 wp_die( $mah_error, __( 'Form Error' ) );
24 }
25 }
26
27}
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 devolver new 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 objeto WP_Error al principio, no se tratará como un error hasta que agregue al menos un error a la lista, por lo que is_wp_error seguirá siendo válido si está vacío.
  • wp_die puede aceptar una cadena como en el ejemplo anterior, o el objeto completo WP_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í.