vendredi 25 septembre 2026

À propos

Contact

Tips

Masquer une notice d’administration par utilisateur, pas pour tous

Stocker la fermeture d'une notice en meta utilisateur pour qu'elle ne réapparaisse pas à chaque connexion, individuellement pour chaque compte.

Par Clément Hadrot • 12 janvier 2023 • 4 min de lecture • Aucun commentaire
Masquer une notice d'administration par utilisateur, pas pour tous

Sur un site collaboratif géré par quatre rédacteurs et deux administrateurs, une notice d’avertissement affichée via admin_notices pour signaler une extension à mettre à jour réapparaissait obstinément à chaque connexion de chaque utilisateur, y compris pour ceux qui n’avaient strictement aucun moyen d’agir dessus. Le bouton de fermeture natif proposé par WordPress, la petite croix en haut à droite, ne fait en réalité que masquer visuellement la notice côté navigateur : au rechargement suivant, elle revient, identique.

Pour qu’une notice se ferme réellement, et individuellement pour chaque compte plutôt que pour tout le monde à la fois, il faut la coupler à une meta utilisateur mise à jour via un petit appel AJAX au moment du clic.

Afficher la notice conditionnellement

function nb_afficher_notice_maj_extension() {
    $user_id = get_current_user_id();

    if ( get_user_meta( $user_id, 'nb_notice_maj_fermee', true ) ) {
        return;
    }

    ?>
    <div class="notice notice-warning is-dismissible" data-notice="maj-extension">
        <p>Une mise à jour importante de l'extension de facturation est disponible. Pensez à planifier son installation.</p>
    </div>
    <?php
}
add_action( 'admin_notices', 'nb_afficher_notice_maj_extension' );

L’attribut data-notice permet d’identifier précisément quelle notice a été fermée, utile dès qu’un site en affiche plusieurs de ce type simultanément.

L'essentiel à retenir : Une notice fermée par un utilisateur reste visible pour les autres ; update_user_meta stocke l'état de fermeture individuellement ; Un appel AJAX minimal suffit à capter le clic de fermeture

Capter le clic de fermeture en JavaScript

jQuery( function( $ ) {
    $( document ).on( 'click', '.notice[data-notice="maj-extension"] .notice-dismiss', function() {
        $.post( ajaxurl, {
            action: 'nb_fermer_notice',
            nonce: nbNoticeVars.nonce
        } );
    } );
} );

WordPress ajoute automatiquement le bouton de fermeture et son comportement visuel dès que la classe is-dismissible est présente sur la notice ; il suffit ici d’écouter ce clic pour déclencher l’appel supplémentaire vers le serveur.

Enregistrer et sécuriser l’appel AJAX

function nb_enregistrer_script_notice() {
    wp_enqueue_script( 'nb-notice-fermeture', get_stylesheet_directory_uri() . '/assets/js/notice-fermeture.js', array( 'jquery' ), '1.0', true );
    wp_localize_script( 'nb-notice-fermeture', 'nbNoticeVars', array(
        'nonce' => wp_create_nonce( 'nb_fermer_notice_action' ),
    ) );
}
add_action( 'admin_enqueue_scripts', 'nb_enregistrer_script_notice' );

function nb_traiter_fermeture_notice() {
    check_ajax_referer( 'nb_fermer_notice_action', 'nonce' );

    update_user_meta( get_current_user_id(), 'nb_notice_maj_fermee', 1 );
    wp_die(); // termine proprement la requête AJAX
}
add_action( 'wp_ajax_nb_fermer_notice', 'nb_traiter_fermeture_notice' );

La vérification check_ajax_referer() protège l’appel contre une soumission forgée depuis un autre site, tout en s’appuyant sur le mécanisme de nonce déjà standard dans l’écosystème WordPress.

Prévoir une réinitialisation après la mise à jour réelle

Une fois l’extension effectivement mise à jour, il ne faut pas oublier de nettoyer cette meta pour tous les utilisateurs, sous peine de laisser une trace inutile en base de données indéfiniment :

function nb_reinitialiser_notice_apres_maj() {
    global $wpdb;
    $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => 'nb_notice_maj_fermee' ) );
}

Cette fonction se déclenche manuellement une fois la mise à jour effectuée, ou automatiquement si l’on souhaite comparer la version installée de l’extension avec une version de référence stockée en option.

Ce que cette technique ne remplace pas

  • Le hook admin_notices lui-même, avec ses règles générales d’affichage conditionnel selon l’écran ou le rôle, reste un sujet plus large déjà traité séparément.
  • Cette approche par utilisateur ne convient pas à une notice qui doit disparaître définitivement pour tout le site une fois une condition technique résolue : dans ce cas, une simple option globale suffit, sans avoir besoin de cibler chaque compte.

En résumé

Coupler une notice is-dismissible à une meta utilisateur mise à jour par un appel AJAX minimal permet une fermeture réellement individuelle et définitive, contrairement au comportement purement visuel proposé nativement par WordPress. Cette nuance, souvent négligée, évite bien des notices qui reviennent en boucle malgré des clics répétés.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi