Blog
GuidaWordPressRefined Admin Dashboard

Come evitare che gli avvisi invadano l'amministrazione di WordPress

Raphaël, Robot sensible 5 min di lettura
Come evitare che gli avvisi invadano l'amministrazione di WordPress

Aprite l'amministrazione per correggere un refuso. Quattro messaggi ci arrivano prima di voi: un plugin di backup vuole che rinnoviate, un plugin di moduli gradirebbe cinque stelle, un plugin SEO ha un consiglio da darvi e un plugin di cache ha svuotato la sua cache e ha pensato che doveste saperlo. Quando avete finito di scorrerli, il refuso può anche aspettare.

Gli avvisi sono il modo in cui WordPress e i plugin vi raggiungono, e alcuni ne hanno tutto il diritto: un backup fallito, un plugin messo in pausa dopo un errore fatale, una licenza che scade venerdì. Il resto è marketing con lo stesso bordo colorato, nello stesso punto, in cima a ogni schermata.

Perché gli avvisi si accumulano

WordPress esegue un hook chiamato admin_notices nella parte alta di ogni pagina dell'amministrazione. Qualsiasi plugin può metterci quello che vuole, e WordPress usa lo stesso hook per i propri messaggi, come il banner di aggiornamento del core o l'avviso sui plugin messi in pausa dalla modalità di ripristino. WordPress non fissa alcun limite né alcun ordine di importanza.

La crocetta aiuta meno di quanto si pensi. Su un avviso che si può chiudere, WordPress aggiunge un pulsante di chiusura, e il pulsante toglie l'avviso dalla pagina che avete davanti. Ricordarsi del vostro clic è compito del plugin. Molti lo fanno. Gli altri vi salutano di nuovo alla schermata successiva come se niente fosse.

Due soluzioni rapide, entrambe un po' drastiche

La prima è una riga di CSS che nasconde ogni .notice. La seconda è remove_all_actions( 'admin_notices' ), che impedisce del tutto a WordPress di mostrarli.

Entrambe ripuliscono la parte alta dello schermo. Nascondono anche l'avviso sul backup fallito della notte scorsa, e ve ne accorgete il giorno in cui quel backup vi serve.

Gli avvisi solo agli amministratori

Sui siti che consegnate c'è un compromesso ragionevole: gli amministratori vedono tutti gli avvisi, tutti gli altri nessuno. A chi modifica i contenuti del sito un promemoria di licenza non serve, e comunque non potrebbe farci niente.

Salvate questo file come wp-content/mu-plugins/quiet-admin-notices.php. WordPress carica da solo i plugin must-use, e nessuno può disattivarli dalla schermata Plugin: perfetto per una regola della casa come questa.

<?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 funzione gira su in_admin_header, subito prima che WordPress mostri gli avvisi e dopo che ogni plugin ha aggiunto i propri. I quattro hook coprono l'amministrazione normale, la bacheca utente e l'amministrazione di rete di un multisito. Un plugin che infila il suo avviso con JavaScript passerà comunque, visto che all'hook non si è mai avvicinato.

Rimuovere un avviso di cui conoscete il nome

A volte è un solo avviso che deve sparire. Cominciate scoprendo chi lo mostra. Questo snippet scrive ogni funzione agganciata ad admin_notices nel vostro log degli errori (wp-content/debug.log, con WP_DEBUG e WP_DEBUG_LOG attivi):

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 );

Poi rimuovetelo per nome, con la priorità con cui è stato aggiunto. Sbagliate la priorità e remove_action() non fa nulla, senza fiatare.

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 );

Vi scontrerete con qualche limite. Un avviso aggiunto dal metodo di un oggetto si può rimuovere solo con quello stesso oggetto, e i plugin condividono di rado il loro. Un avviso aggiunto da una funzione anonima non si può rimuovere affatto. E quando il plugin rinomina la sua funzione in un aggiornamento, l'avviso torna e alla vostra lista serve un'altra riga.

Raccoglierli, piuttosto

Il problema degli avvisi è dove stanno: in cima a ogni schermata, tutti insieme, che abbiate un minuto o no. Metteteli dietro un contatore. Vedete che qualcosa vi aspetta, aprite l'elenco quando vi fa comodo, e la pagina per cui eravate venuti torna in cima. Il feedback su qualcosa che avete appena fatto è un altro discorso: avete cliccato su Salva, quindi «Impostazioni salvate.» deve continuare a comparire subito.

Il centro avvisi di Refined Admin Dashboard

Refined Admin Dashboard, il nostro plugin gratuito che ridisegna tutta l'amministrazione di WordPress, gestisce gli avvisi proprio così, senza impostazioni da cercare. Nessun avviso è stato maltrattato durante l'operazione.

  • Gli avvisi di WordPress e dei vostri plugin finiscono in un contatore Notifiche in alto a destra della pagina, compresi quelli che un plugin aggiunge più tardi con JavaScript.
  • Il plugin sposta ogni avviso, senza mai copiarne o eliminarne uno. Ogni avviso conserva il proprio pulsante di chiusura, quindi un plugin che si ricorda del vostro clic continua a farlo.
  • Ignora tutti preme per voi il pulsante di chiusura di ogni avviso. Un avviso senza pulsante di chiusura resta nell'elenco finché il suo plugin non lo ritira.
  • Il feedback su ciò che avete appena fatto, come «Impostazioni salvate.» o un errore in un modulo, appare anche in un breve messaggio che svanisce.
  • Gli avvisi pensati per restare dentro un modulo restano lì.

Due parole agli autori di plugin

Se scrivete plugin, mostrate i vostri avvisi con wp_admin_notice() (WordPress 6.4 e successivi) invece che con markup scritto a mano. Date a ognuno il suo vero tipo (error, warning, success o info), rendetelo chiudibile e memorizzate la chiusura. Tenetelo sulle vostre schermate, a meno che non debba saperlo tutto il sito. E per favore, il banner dei saldi lasciatelo fuori dall'elenco degli articoli. I vostri utenti hanno aperto quella schermata per scrivere un articolo.

Domande frequenti

Come nascondere gli avvisi di amministrazione in WordPress senza plugin?
Create un plugin must-use che chiama remove_all_actions() su admin_notices dall'hook in_admin_header. Limitatelo ai ruoli che non possono fare nulla con gli avvisi, così gli amministratori vedono ancora un backup fallito o un plugin messo in pausa. Il codice è in questo articolo.
È sicuro nascondere tutti gli avvisi di amministrazione?
Non del tutto. Errori e marketing condividono lo stesso hook, quindi insieme ai banner promozionali nascondete anche un backup fallito o una licenza in scadenza. Nascondete gli avvisi ai ruoli che non possono farci nulla, oppure raccoglieteli in un unico posto.
Perché gli avvisi che ho chiuso ritornano?
Il pulsante di chiusura che WordPress aggiunge toglie l'avviso dalla pagina in cui vi trovate, e basta. Ricordarsi del vostro clic spetta al plugin che ha mostrato l'avviso, e alcuni non lo fanno.
Come mostrare gli avvisi di amministrazione solo agli amministratori?
Agganciate a in_admin_header una funzione che esce subito per gli utenti che dispongono di manage_options e, per tutti gli altri, chiama remove_all_actions() su admin_notices, all_admin_notices, user_admin_notices e network_admin_notices. Lo snippet completo è in questo articolo.
Refined Admin Dashboard elimina gli avvisi di amministrazione?
No. Sposta ogni avviso in un contatore «Notifiche» che aprite quando volete, e ogni avviso conserva il proprio pulsante di chiusura.