Comment empêcher les notices d'envahir l'administration WordPress

Vous ouvrez l'administration pour corriger une coquille. Avant que vous atteigniez la page, quatre messages arrivent les premiers : un plugin de sauvegarde veut que vous renouveliez, un plugin de formulaires adorerait cinq étoiles, un plugin SEO a une astuce à partager, et un plugin de cache a vidé son cache et tenait à ce que vous le sachiez. Une fois que vous les avez tous dépassés, la coquille n'est plus si pressée.
Les notices sont le moyen qu'ont WordPress et les plugins de vous joindre, et quelques-unes le méritent : une sauvegarde échouée, un plugin mis en pause après une erreur fatale, une licence qui expire vendredi. Le reste, c'est du marketing avec la même bordure colorée, au même endroit, en haut de chaque écran.
Pourquoi les notices s'accumulent
WordPress déclenche un hook appelé admin_notices vers le haut de chaque page d'administration. N'importe quel plugin peut y afficher ce qu'il veut, et WordPress utilise ce même hook pour ses propres messages, comme la bannière de mise à jour du cœur ou l'avertissement sur les plugins mis en pause par le mode de récupération. WordPress ne fixe ni limite ni ordre d'importance.
La petite croix aide moins qu'on ne le croit. Sur une notice refermable, WordPress ajoute un bouton de fermeture, et ce bouton retire la notice de la page que vous avez sous les yeux. Retenir votre clic, c'est le travail du plugin. Beaucoup le font. Les autres vous accueillent de nouveau à l'écran suivant, comme si de rien n'était.
Deux solutions rapides, un peu brutales
La première est une ligne de CSS qui masque toutes les .notice. La seconde est remove_all_actions( 'admin_notices' ), qui empêche WordPress de les afficher tout court.
Les deux font le ménage en haut de l'écran. Elles masquent aussi l'alerte sur la sauvegarde ratée de la nuit dernière, et vous l'apprenez le jour où vous avez besoin de cette sauvegarde.
Réserver les notices aux administrateurs
Sur les sites que vous livrez, il existe un compromis raisonnable : les administrateurs gardent toutes les notices, les autres n'en voient aucune. La personne qui édite le site n'a que faire d'un rappel de licence, et elle ne pourrait de toute façon pas agir dessus.
Enregistrez ce fichier sous wp-content/mu-plugins/quiet-admin-notices.php. WordPress charge tout seul les plugins must-use, et personne ne peut les désactiver depuis l'écran Plugins, ce qui convient bien à une règle maison comme celle-ci.
<?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 fonction s'exécute sur in_admin_header, juste avant que WordPress affiche les notices et après que chaque plugin a ajouté les siennes. Les quatre hooks couvrent l'administration classique, le tableau de bord utilisateur et l'administration réseau d'un multisite. Une notice qu'un plugin insère en JavaScript passera quand même, puisqu'elle ne s'est jamais approchée du hook.
Retirer une notice précise, par son nom
Parfois, une seule notice doit disparaître. Commencez par trouver qui l'affiche. Ce snippet écrit dans votre journal d'erreurs chaque fonction accrochée à admin_notices (wp-content/debug.log, avec WP_DEBUG et WP_DEBUG_LOG activés) :
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 );
Retirez-la ensuite par son nom, avec la priorité à laquelle elle a été ajoutée. Avec la mauvaise priorité, remove_action() ne fait rien, et sans un mot.
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 );
Vous allez vous heurter à quelques limites. Une notice ajoutée par une méthode d'objet ne peut être retirée qu'avec ce même objet, et les plugins partagent rarement le leur. Une notice ajoutée par une fonction anonyme ne peut pas être retirée du tout. Et quand le plugin renomme sa fonction lors d'une mise à jour, la notice revient et votre liste réclame une ligne de plus.
Les rassembler plutôt
Le problème des notices, c'est leur place : en haut de chaque écran, toutes à la fois, que vous ayez une minute ou non. Mettez-les derrière un compteur. Vous voyez que quelque chose attend, vous ouvrez la liste quand ça vous arrange, et la page que vous étiez venu voir reprend sa place en haut. Le retour sur une action que vous venez de faire, c'est autre chose : vous avez cliqué sur Enregistrer, donc « Réglages enregistrés. » doit toujours s'afficher tout de suite.
Le centre de notifications de Refined Admin Dashboard
Refined Admin Dashboard, notre plugin gratuit qui redessine toute l'administration WordPress, traite les notices de cette façon, sans aucun réglage à chercher. Aucune notice n'a été maltraitée pendant l'opération.
- Les notices de WordPress et de vos plugins rejoignent un compteur Notifications en haut à droite de la page, y compris celles qu'un plugin ajoute plus tard en JavaScript.
- Le plugin déplace chaque notice, sans jamais en copier ni en supprimer une seule. Chaque notice garde son propre bouton de fermeture : un plugin qui retient votre clic continue donc de le faire.
- Tout ignorer appuie pour vous sur le bouton de fermeture de chaque notice. Une notice sans bouton de fermeture reste dans la liste jusqu'à ce que son plugin la reprenne.
- Le retour sur ce que vous venez de faire, comme « Réglages enregistrés. » ou une erreur de formulaire, apparaît aussi dans un court message qui s'efface.
- Les notices prévues pour rester dans un formulaire y restent.
Un mot aux auteurs de plugins
Si vous écrivez des plugins, affichez vos notices avec wp_admin_notice() (WordPress 6.4 et suivants) plutôt qu'avec du balisage écrit à la main. Donnez à chacune son vrai type (error, warning, success ou info), rendez-la refermable et mémorisez sa fermeture. Gardez-la sur vos propres écrans, sauf si tout le site doit être au courant. Et par pitié, gardez la bannière de soldes hors de la liste des articles. Vos utilisateurs ont ouvert cet écran pour écrire un article.
Questions fréquentes
- Comment masquer les notices d'administration dans WordPress sans plugin ?
- Créez un plugin must-use qui appelle remove_all_actions() sur admin_notices depuis le hook in_admin_header. Limitez-le aux rôles qui ne peuvent rien faire des notices, pour que les administrateurs voient toujours une sauvegarde échouée ou un plugin mis en pause. Le code est dans cet article.
- Peut-on masquer toutes les notices d'administration sans risque ?
- Pas tout à fait. Les erreurs et le marketing passent par le même hook : vous masquez une sauvegarde échouée ou une licence qui expire en même temps que les bannières de soldes. Masquez les notices pour les rôles qui ne peuvent pas agir dessus, ou rassemblez-les au même endroit.
- Pourquoi les notices fermées reviennent-elles ?
- Le bouton de fermeture qu'ajoute WordPress retire la notice de la page où vous êtes, et c'est tout. C'est au plugin qui a affiché la notice de retenir votre clic, et certains ne le font pas.
- Comment réserver les notices d'administration aux administrateurs ?
- Accrochez à in_admin_header une fonction qui s'arrête tout de suite pour les utilisateurs ayant la capacité manage_options et qui, sinon, appelle remove_all_actions() sur admin_notices, all_admin_notices, user_admin_notices et network_admin_notices. Le snippet complet est dans cet article.
- Refined Admin Dashboard supprime-t-il les notices d'administration ?
- Non. Il déplace chaque notice dans un compteur Notifications que vous ouvrez quand vous le voulez, et chaque notice garde son propre bouton de fermeture.