Blog
GuíaWordPressRefined Admin Dashboard

Cómo evitar que los avisos de administración se adueñen de WordPress

Raphaël, Robot sensible 5 min de lectura
Cómo evitar que los avisos de administración se adueñen de WordPress

Entras en la administración para corregir una errata. Antes de llegar a la página, cuatro mensajes se te adelantan: un plugin de copias de seguridad quiere que renueves, a un plugin de formularios le encantarían cinco estrellas, un plugin de SEO tiene un consejo para ti y un plugin de caché vació su caché y pensó que debías saberlo. Cuando por fin has bajado lo bastante para dejarlos atrás, la errata ya puede esperar.

Los avisos son la vía por la que WordPress y los plugins se dirigen a ti, y unos pocos lo merecen: una copia de seguridad fallida, un plugin pausado tras un error fatal, una licencia que caduca el viernes. El resto es marketing con el mismo borde de color, en el mismo sitio, arriba de cada pantalla.

Por qué se acumulan los avisos

WordPress dispara un hook llamado admin_notices cerca de la parte superior de cada página de la administración. Cualquier plugin puede mostrar ahí lo que quiera, y WordPress usa ese mismo hook para sus propios mensajes, como el banner de actualización del núcleo o la advertencia sobre los plugins pausados por el modo de recuperación. WordPress no fija ningún límite ni ningún orden de importancia.

La pequeña cruz ayuda menos de lo que crees. En un aviso descartable, WordPress añade un botón de cierre, y ese botón quita el aviso de la página que tienes delante. Recordar tu clic es trabajo del plugin. Muchos plugins lo hacen. Los demás vuelven a saludarte en la siguiente pantalla como si nada.

Dos soluciones rápidas, y un poco toscas

La primera es una línea de CSS que oculta todos los .notice. La segunda es remove_all_actions( 'admin_notices' ), que directamente impide que WordPress los muestre.

Las dos despejan la parte de arriba de la pantalla. También ocultan la advertencia sobre la copia de seguridad que falló anoche, y te enteras el día en que necesitas esa copia.

Reserva los avisos a los administradores

En los sitios que entregas hay un término medio razonable: los administradores conservan todos los avisos y los demás no ven ninguno. La persona que edita los contenidos del sitio no necesita un recordatorio de licencia, y de todos modos no podría hacer nada con él.

Guarda este archivo como wp-content/mu-plugins/quiet-admin-notices.php. WordPress carga los plugins must-use por su cuenta y nadie puede desactivarlos desde la pantalla de Plugins, algo que le sienta bien a una norma de la casa como esta.

<?php
/**
 * Plugin Name: Quiet admin notices
 * Description: Only administrators see admin notices.
 */
add_action( 'in_admin_header', function () {
	if ( current_user_can( 'manage_options' ) ) {
		return;
	}
	remove_all_actions( 'admin_notices' );
	remove_all_actions( 'all_admin_notices' );
	remove_all_actions( 'user_admin_notices' );
	remove_all_actions( 'network_admin_notices' );
}, PHP_INT_MAX );

La función se ejecuta en in_admin_header, justo antes de que WordPress muestre los avisos y después de que cada plugin haya añadido los suyos. Los cuatro hooks cubren la administración normal, el escritorio del usuario y la administración de la red en un multisitio. Un plugin que cuele su aviso con JavaScript pasará igualmente, porque nunca se acercó al hook.

Quita un aviso concreto por su nombre

A veces sobra un solo aviso. Empieza por averiguar quién lo muestra. Este fragmento escribe cada función enganchada a admin_notices en tu registro de errores (wp-content/debug.log, con WP_DEBUG y WP_DEBUG_LOG activados):

add_action( 'admin_notices', function () {
	global $wp_filter;
	foreach ( $wp_filter['admin_notices']->callbacks as $priority => $callbacks ) {
		foreach ( $callbacks as $callback ) {
			$f = $callback['function'];
			if ( is_array( $f ) ) {
				$class = is_object( $f[0] ) ? get_class( $f[0] ) : $f[0];
				$name  = $class . '::' . $f[1];
			} elseif ( is_string( $f ) ) {
				$name = $f;
			} else {
				$name = 'a closure';
			}
			error_log( "admin_notices, priority $priority: $name" );
		}
	}
}, PHP_INT_MIN );

Después, quítalo por su nombre, con la prioridad con la que se añadió. Si te equivocas de prioridad, remove_action() no hace nada, y sin decir ni una palabra.

add_action( 'in_admin_header', function () {
	// A plain function, added with the default priority of 10.
	remove_action( 'admin_notices', 'myplugin_renewal_notice' );
	// A static method, added with priority 20.
	remove_action( 'admin_notices', array( 'My_Plugin_Admin', 'review_request' ), 20 );
}, PHP_INT_MAX );

Te toparás con algunos muros. Un aviso añadido con el método de un objeto solo se puede quitar con ese mismo objeto, y los plugins rara vez comparten el suyo. Un aviso añadido con una función anónima no se puede quitar de ninguna manera. Y cuando el plugin cambia el nombre de su función en una actualización, el aviso vuelve y tu lista necesita otra línea.

Mejor, reúnelos

El problema de los avisos es dónde están: arriba de cada pantalla, todos a la vez, tengas un minuto o no. Ponlos detrás de un contador. Ves que algo te espera, abres la lista cuando te viene bien y la página a la que venías vuelve a estar arriba. La respuesta a algo que acabas de hacer es otro caso: has hecho clic en Guardar, así que «Ajustes guardados.» tiene que seguir apareciendo al momento.

El centro de avisos de Refined Admin Dashboard

Refined Admin Dashboard, nuestro plugin gratuito que rediseña toda la administración de WordPress, trata los avisos así, sin ningún ajuste que buscar. Ningún aviso resulta herido en el proceso.

  • Los avisos de WordPress y de tus plugins van a un contador de Notificaciones arriba a la derecha de la página, incluidos los que un plugin añade más tarde con JavaScript.
  • El plugin mueve cada aviso y nunca copia ni borra ninguno. Cada aviso conserva su propio botón de cierre, así que un plugin que recuerda tu clic lo sigue recordando.
  • Descartar todo pulsa por ti el botón de cierre de cada aviso. Un aviso sin botón de cierre se queda en la lista hasta que su plugin lo retira.
  • La respuesta a lo que acabas de hacer, como «Ajustes guardados.» o un error en un formulario, aparece además en un mensaje breve que se desvanece.
  • Los avisos pensados para quedarse dentro de un formulario se quedan ahí.

Unas palabras para quienes escriben plugins

Si escribes plugins, muestra tus avisos con wp_admin_notice() (WordPress 6.4 y posteriores) en lugar de escribir el marcado a mano. Dale a cada uno su tipo real (error, warning, success o info), hazlo descartable y recuerda que se descartó. Mantenlo en tus propias pantallas, salvo que todo el sitio necesite enterarse. Y, por favor, deja el banner de ofertas fuera de la lista de entradas. Tus usuarios abrieron esa pantalla para escribir una entrada.

Preguntas frecuentes

¿Cómo oculto los avisos de administración en WordPress sin un plugin?
Crea un plugin must-use que llame a remove_all_actions() sobre admin_notices desde el hook in_admin_header. Limítalo a los roles que no pueden hacer nada con los avisos, para que los administradores sigan viendo una copia de seguridad fallida o un plugin pausado. El código está en este artículo.
¿Es seguro ocultar todos los avisos de administración?
No del todo. Los errores y el marketing comparten el mismo hook, así que junto con los banners de ofertas ocultas también una copia de seguridad fallida o una licencia a punto de caducar. Oculta los avisos a los roles que no pueden actuar sobre ellos, o reúnelos en un solo lugar.
¿Por qué reaparecen los avisos de administración que ya descarté?
El botón de cierre que añade WordPress quita el aviso de la página en la que estás, y nada más. Es el plugin que mostró el aviso el que tiene que recordar tu clic, y algunos no lo hacen.
¿Cómo muestro los avisos de administración solo a los administradores?
Engancha a in_admin_header una función que no haga nada para los usuarios con la capacidad manage_options y que, para todos los demás, llame a remove_all_actions() sobre admin_notices, all_admin_notices, user_admin_notices y network_admin_notices. El fragmento completo está en este artículo.
¿Refined Admin Dashboard elimina los avisos de administración?
No. Mueve cada aviso a un contador de Notificaciones que abres cuando quieres, y cada aviso conserva su propio botón de cierre.