# Un livre d’or numérique pour des pompes funèbres, modéré avant publication

> Un CPT avec statut personnalisé permet une validation humaine avant affichage, sans complexité de workflow éditorial lourd, pour un livre d'or sensible.

- Auteur : Clément Hadrot
- Publié le : 2024-06-21
- Mis à jour le : 2024-06-21
- Catégorie : Extensions
- URL : https://wpmoderne.dev.wordpress-developpement.fr/extensions/livre-or-numerique-pompes-funebres-modere/

## L’essentiel

- register_post_status ajoute un statut intermédiaire dédié
- Le message doit rester invisible tant qu'il n'est pas validé
- Une notification informe le modérateur sans surcharger son quotidien

Une entreprise de pompes funèbres, qui souhaitait proposer sur chaque page dédiée à un défunt un livre d'or où les proches peuvent laisser un message, avait une exigence non négociable : aucun message ne devait apparaître publiquement sans validation humaine préalable, compte tenu de la sensibilité du contexte et du risque de messages inappropriés ou de spam.

Ce besoin, qui pourrait sembler nécessiter un système de commentaires personnalisé complexe, se résout avec un seul statut personnalisé ajouté au type de contenu du livre d'or, sans workflow éditorial à plusieurs étapes.

## Le problème du statut « en attente » standard

WordPress fournit déjà un statut `pending` pour les articles en attente de relecture, mais son usage habituel dans l'interface d'administration standard reste pensé pour des rédacteurs qui soumettent du contenu éditorial à un administrateur, pas pour des messages soumis par le grand public depuis une page publique du site. Réutiliser `pending` tel quel aurait mélangé les messages du livre d'or avec d'éventuels autres contenus en attente, dans le même écran de gestion.

La solution retenue introduit un statut dédié, `message_a_valider`, propre au type de contenu `message_livre_or`, ce qui isole complètement la file de modération du reste de l'administration du site.

## Déclarer le statut personnalisé

> L'essentiel à retenir : register_post_status ajoute un statut intermédiaire dédié ; Le message doit rester invisible tant qu'il n'est pas validé ; Une notification informe le modérateur sans surcharger son quotidien

```
add_action( 'init', function () {
    register_post_status( 'message_a_valider', [
        'label'                     => 'En attente de validation',
        'public'                    => false,
        'internal'                  => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop(
            'En attente de validation (%s)',
            'En attente de validation (%s)'
        ),
    ] );
} );
```

Le paramètre `public` à `false` garantit qu'un message dans ce statut n'apparaît jamais sur une URL publique, même en cas d'erreur d'affichage ailleurs dans le thème. Le paramètre `show_in_admin_status_list` ajoute ce statut au filtre par statut de l'écran de liste, ce qui simplifie la vie du modérateur qui veut isoler rapidement les messages en attente.

## La soumission depuis le formulaire public

Le formulaire public, affiché sur la page du défunt, crée directement le message avec ce statut, jamais avec le statut `publish` :

```
function livre_or_enregistrer_message( array $donnees, int $defunt_id ): int {
    return wp_insert_post( [
        'post_type'    => 'message_livre_or',
        'post_status'  => 'message_a_valider',
        'post_title'   => sanitize_text_field( $donnees['nom'] ),
        'post_content' => sanitize_textarea_field( $donnees['message'] ),
        'post_parent'  => $defunt_id,
    ] );
}
```

## Notifier sans surcharger le modérateur

Plutôt qu'un e-mail par message soumis, qui deviendrait vite ingérable en cas d'affluence sur une page très visitée, une notification groupée est envoyée une fois par jour via une tâche planifiée, uniquement s'il existe au moins un message en attente :

```
add_action( 'livre_or_notification_quotidienne', function () {
    $en_attente = get_posts( [
        'post_type'   => 'message_livre_or',
        'post_status' => 'message_a_valider',
        'numberposts' => -1,
    ] );

    if ( empty( $en_attente ) ) {
        return;
    }

    wp_mail(
        get_option( 'admin_email' ),
        sprintf( '%d message(s) en attente de validation', count( $en_attente ) ),
        'Rendez-vous dans l\'administration pour les valider.'
    );
} );
```

## Points de vigilance de cette approche

- Vérifier que le thème n'affiche jamais de requête qui ignore le filtre par statut par défaut de WordPress, qui exclut naturellement les statuts non publics des requêtes de front standard.
- Ajouter une action de validation en masse dans l'écran de liste, via les actions groupées natives, pour accélérer la modération lors des pics d'affluence.
- Conserver une trace de la date de validation, via une métadonnée dédiée, utile en cas de litige sur un message publié puis contesté.

> Le conseil que je donne sur ce type de projet sensible : ne jamais réutiliser un statut existant à des fins qu'il n'a pas été pensé pour couvrir, même si cela semble économiser du code. Un statut dédié coûte quelques lignes et clarifie durablement l'intention.

## En résumé

Un statut personnalisé, appliqué à un type de contenu dédié, suffit à construire une file de modération fiable pour un contenu sensible soumis par le public. Ce sujet couvre la modération des messages eux-mêmes ; la gestion des faire-part et de leur diffusion reste un besoin distinct non traité par cette recette.
