De vez en cuando algún cliente o lector me dice que ve errores o avisos en su web. Normalmente no es algo preocupante, y PHP muestra esas advertencias para que el desarrollador del theme o de algunos de los plugins en uso sepa que hay algo que debería corregir. Pero claro, eso es algo que sólo los desarrolladores deberíamos ver. Así que la pregunta que me suelen hacer es ¿Por qué se ven avisos de PHP en mi web?
La respuesta es el modo DEBUG de WordPress, una configuración especial que permite que se muestren todos los avisos (notices) y advertencias (warnings) que genera PHP o, en ocasiones, otros plugins (como también vamos a ver).
Tabla de contenidos
WordPress está mostrando avisos en tu web
Ante todo mucha calma, la mayor parte de las veces no hay que preocuparse por esto ya que se tratan de simples advertencias dirigidas a los desarrolladores por algo que tienen que corregir en futuras versiones de su plantilla/plugin.
Son muy típicos los mensajes por variables sin declarar, funciones obsoletas cuya eliminación se ha programado para futuras versiones de PHP, etcétera. Pero no son errores como tales: los errores en PHP provocan una interrupción del script, y entonces la web se muestra rota.
Por cierto que, como comentaba antes, no es sólo PHP el que genera estos mensajes, a veces también pueden tener otro origen. Por ejemplo, es muy típico que los desarrolladores de WooCommerce generen advertencias cuando en tu plugin estás usando una función que está (o estará pronto) obsoleta, o cuando estás accediendo a datos de la forma incorrecta. Algo, por cierto, muy de agradecer.
Aviso generado por WooCommerce al querer acceder directamente a un dato (propiedad) al que se debería acceder mediante una función (método)
Notices y warnings de PHP en la web
Vale, no hace daño; pero claro, tampoco quieres que tus clientes/visitantes vean ese mensaje. No genera demasiada confianza, ¿verdad?
En teoría es fácil y sencillo. De hecho, en teoría, el modo de depuración ni siquiera debería estar activado, ya que por defecto está desactivado y sólo debería activarse, precisamente, para depurar el código a la hora de desarrollar.
Pero ahí está: los avisos se muestran y no deberían. ¿Qué haces si te está pasando esto?
Activar y desactivar el modo DEBUG o de depuración en WordPress
En principio el asunto es sencillo: el modo de depuración se activa con una simple línea en el archivo wp-config.php:
define('WP_DEBUG', true);
Esto, por cierto, te puede ofrecer información adicional si estás sufriendo algún error en tu web.
Si lo que se quiere es guardar registro de los errores, avisos y advertencias, o si la web está abierta al público y no queremos que estos avisos se vean, se puede activar el log para que queden registrados en un archivo (concretamente en wp-content/debug.log), y desactivar el que se muestren en la propia web:
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', true);
Y bueno,en principio evitar que todos esos mensajes se muestren en la web debería ser sencillo. Basta cambiar esa opción a:
define('WP_DEBUG', false);
Pero resulta que no, que ya lo cambiaste y ahí siguen los errores mostrándose. ¿Qué clase de brujería es ésta?
Ocultar los avisos de PHP si persisten tras haber desactivado el modo de depuración
Esto es más habitual de lo que parece a simple vista, y es debido a la configuración del servidor, más concretamente de PHP.
En realidad, diga lo que diga el archivo wp-config.php, el servidor puede estar configurado para mostrar los avisos de depuración de PHP. Y esto es un problema, porque habitualmente no se tiene acceso a esta configuración (al menos en un hosting compartido, cosa diferente es que dispongas de un VPS).
Pero que no cunda el pánico: se puede hacer sacando la artillería pesada. Basta con sustituir el define que vimos antes por estas otras líneas:
ini_set('display_errors','Off'); ini_set('error_reporting', E_ALL ); define('WP_DEBUG', false); define('WP_DEBUG_DISPLAY', false);
Y si queremos conservar el registro de estos avisos, podemos mantener el log usando este set de instrucciones:
ini_set('log_errors','On'); ini_set('display_errors','Off'); ini_set('error_reporting', E_ALL ); define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false);