# Notifications admin personnalisées avec admin_notices, bien faites

> Une notice admin mal gérée s'affiche partout, ne se ferme jamais, ou réapparaît sans cesse. Voici comment la faire correctement, cible, message et fermeture inclus.

- Auteur : Clément Hadrot
- Publié le : 2024-11-07
- Mis à jour le : 2024-11-07
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/notifications-admin-personnalisees-admin-notices-wordpress/

## L’essentiel

- admin_notices doit toujours cibler un écran précis
- Une notice descartable se ferme réellement côté serveur
- Une capacité pertinente évite un message inutile

Ajouter une notification dans l'administration WordPress, pour informer un utilisateur qu'une configuration est incomplète ou qu'une action est requise, semble simple à première vue : le hook `admin_notices` suffit techniquement. Mais en pratique, beaucoup de notices personnalisées souffrent des mêmes défauts : elles s'affichent sur tous les écrans sans distinction, elles réapparaissent après avoir été fermées, ou elles s'accumulent au point de rendre l'administration illisible.

Cet article détaille comment implémenter une notice admin qui respecte l'utilisateur : ciblée, réellement descartable, et qui ne revient pas sans raison.

## La structure de base d'une notice

Le hook `admin_notices` affiche du contenu HTML directement dans la zone dédiée de l'administration, juste sous le titre de la page :

```
add_action( 'admin_notices', function() {
    echo '<div class="notice notice-warning">';
    echo '<p>La configuration du module de paiement est incomplète.</p>';
    echo '</div>';
} );
```

Les classes CSS natives `notice-success`, `notice-warning`, `notice-error` et `notice-info` définissent la couleur de la bordure et du fond, à choisir selon la gravité réelle du message. Un message qui n'est pas critique ne devrait jamais utiliser `notice-error`, sous peine de banaliser les vraies erreurs.

## Cibler un écran précis

Sans condition, une notice s'affiche sur tous les écrans de l'administration, y compris ceux où elle n'a aucune pertinence. La fonction `get_current_screen()` permet de restreindre l'affichage :

```
add_action( 'admin_notices', function() {
    $ecran = get_current_screen();
    if ( ! $ecran || 'edit-produit' !== $ecran->id ) {
        return;
    }
    echo '<div class="notice notice-warning">';
    echo '<p>Certains produits n’ont pas de référence renseignée.</p>';
    echo '</div>';
} );
```

> L'essentiel à retenir : admin_notices doit toujours cibler un écran précis ; Une notice descartable se ferme réellement côté serveur ; Une capacité pertinente évite un message inutile

## Rendre une notice réellement descartable

La classe `is-dismissible` ajoute une croix de fermeture visuelle, mais celle-ci ne fait par défaut que masquer la notice côté JavaScript, le temps de la session : au rechargement de la page, elle réapparaît. Pour une fermeture persistante, il faut enregistrer l'action côté serveur, généralement via une requête AJAX déclenchée au clic :

```
add_action( 'admin_notices', function() {
    if ( get_user_meta( get_current_user_id(), 'notice_paiement_masquee', true ) ) {
        return;
    }
    echo '<div class="notice notice-warning is-dismissible" data-notice="paiement">';
    echo '<p>Pensez à configurer le module de paiement.</p>';
    echo '</div>';
} );

add_action( 'admin_footer', function() {
    ?>
    <script>
    jQuery( document ).on( 'click', '[data-notice="paiement"] .notice-dismiss', function() {
        jQuery.post( ajaxurl, {
            action: 'masquer_notice_paiement',
            nonce: '<?php echo esc_js( wp_create_nonce( 'masquer_notice_paiement' ) ); ?>'
        } );
    } );
    </script>
    <?php
} );

add_action( 'wp_ajax_masquer_notice_paiement', function() {
    check_ajax_referer( 'masquer_notice_paiement', 'nonce' );
    update_user_meta( get_current_user_id(), 'notice_paiement_masquee', 1 );
    wp_die();
} );
```

Cette approche enregistre la préférence par utilisateur, via une métadonnée utilisateur : chaque personne connectée peut ainsi fermer la notice indépendamment, sans affecter les autres comptes du site.

## Limiter la notice à certains rôles

Une notice pertinente pour un administrateur ne l'est pas forcément pour un simple auteur. Un contrôle de capacité en amont évite d'afficher un message d'action à quelqu'un qui n'a de toute façon pas les droits d'agir dessus :

```
add_action( 'admin_notices', function() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    // Contenu de la notice
} );
```

## Éviter l'accumulation de notices

Sur un site avec plusieurs extensions actives, chacune ajoutant ses propres notices, l'administration peut vite devenir illisible. Quelques principes limitent ce risque côté développement :

- Ne jamais afficher plus d'une notice à la fois pour un même sujet, en centralisant la logique plutôt qu'en multipliant les hooks
- Toujours proposer une action concrète dans le texte de la notice, pas juste un constat sans solution
- Réserver `admin_notices` aux messages réellement actionnables, pas à de la simple information secondaire
- Tester le rendu avec plusieurs notices simultanées actives, pour vérifier que l'empilement reste lisible

> Une notice qui revient après chaque clic sur la croix de fermeture finit par être ignorée totalement par l'utilisateur, y compris le jour où elle porte un message réellement important.

## En résumé

Une notification d'administration bien conçue cible un écran précis, s'appuie sur une capacité pertinente, et se ferme réellement de façon persistante une fois traitée par l'utilisateur. Ces quelques précautions, souvent négligées, font toute la différence entre une notice utile et un message que plus personne ne lit après la deuxième apparition.
