# 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.

- Auteur : Clément Hadrot
- Publié le : 2023-01-12
- Mis à jour le : 2023-01-12
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/masquer-notice-admin-par-utilisateur/

## L’essentiel

- 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

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.
