# Salon professionnel : basculer automatiquement les inscrits en liste d’attente

> Quand un atelier affiche complet, l'inscription suivante doit basculer en liste d'attente sans double clic ni survente. Voici la mécanique pas à pas.

- Auteur : WordPress Développement
- Publié le : 2022-11-23
- Mis à jour le : 2022-11-23
- Catégorie : Extensions
- URL : https://www.wpmoderne.fr/extensions/salon-professionnel-liste-attente-quotas/

## L’essentiel

- Un statut de post dédié plutôt qu'un simple booléen
- Verrou via transient pour éviter la course de concurrence
- Notification automatique dès qu'une place se libère

Cinquante places, pas une de plus : c'est le quota fixé pour l'atelier « Cybersécurité des PME » d'un salon professionnel, et dès la cinquante-et-unième inscription, il faut faire basculer le visiteur en liste d'attente sans qu'aucun organisateur n'ait à surveiller un tableau Excel en temps réel. Le problème n'est pas de compter jusqu'à cinquante : c'est de le faire de façon fiable quand deux visiteurs cliquent sur « s'inscrire » à la même seconde.

Ce type de dispositif ne nécessite pas un plugin de billetterie complet. Une extension légère, construite autour d'un type de contenu personnalisé et d'un verrou de concurrence, suffit largement pour un salon B2B où les ateliers ont des jauges fixes et connues à l'avance.

## Étape 1 : modéliser l'inscription comme un post à statut

Plutôt qu'une simple case « en attente » dans une table à part, chaque inscription devient un post du type personnalisé `inscription_atelier`, avec un statut personnalisé enregistré via `register_post_status()` :

```
add_action( 'init', function() {
    register_post_type( 'inscription_atelier', array(
        'public'   => false,
        'supports' => array( 'title', 'custom-fields' ),
    ) );

    register_post_status( 'liste_attente', array(
        'label'                     => 'En liste d’attente',
        'internal'                  => true,
        'label_count'               => _n_noop( 'En liste d’attente (%s)', 'En liste d’attente (%s)' ),
    ) );
} );
```

Ce statut personnalisé permet d'utiliser `wp_count_posts( 'inscription_atelier' )` pour connaître instantanément le nombre d'inscriptions confirmées, sans requête SQL manuelle.

## Étape 2 : verrouiller le comptage avec un transient

> L'essentiel à retenir : Un statut de post dédié plutôt qu'un simple booléen ; Verrou via transient pour éviter la course de concurrence ; Notification automatique dès qu'une place se libère

Le vrai risque n'est pas le calcul du quota, mais la concurrence : deux visiteurs qui valident leur formulaire au même instant peuvent tous les deux lire « 49 places prises » et passer tous les deux en statut confirmé, ce qui fait 51 confirmations pour 50 places. Un verrou court, posé via l'API des transients, évite ce chevauchement :

```
function atelier_inscrire( $atelier_id, $participant ) {
    $verrou = 'lock_atelier_' . $atelier_id;

    if ( false !== get_transient( $verrou ) ) {
        usleep( 200000 );
        return atelier_inscrire( $atelier_id, $participant );
    }

    set_transient( $verrou, 1, 5 );

    $quota      = (int) get_post_meta( $atelier_id, 'quota', true );
    $confirmes  = atelier_compter_confirmes( $atelier_id );
    $statut     = ( $confirmes < $quota ) ? 'publish' : 'liste_attente';

    $id = wp_insert_post( array(
        'post_type'   => 'inscription_atelier',
        'post_status' => $statut,
        'post_title'  => $participant['nom'],
        'post_parent' => $atelier_id,
    ) );

    delete_transient( $verrou );

    return array( 'id' => $id, 'statut' => $statut );
}
```

Le délai de cinq secondes sur le transient est volontairement court : il ne sert qu'à sérialiser les inscriptions concurrentes, pas à bloquer durablement le formulaire.

## Étape 3 : notifier automatiquement en cas de désistement

Quand un inscrit confirmé annule sa participation, son post passe en statut `trash` ou reçoit un statut `annule` personnalisé. C'est le moment de promouvoir automatiquement le premier de la liste d'attente. Le hook `transition_post_status` est l'endroit naturel pour cette logique :

```
add_action( 'transition_post_status', function( $new, $old, $post ) {
    if ( 'inscription_atelier' !== $post->post_type || 'annule' !== $new ) {
        return;
    }

    $suivant = get_posts( array(
        'post_type'   => 'inscription_atelier',
        'post_status' => 'liste_attente',
        'post_parent' => $post->post_parent,
        'orderby'     => 'date',
        'order'       => 'ASC',
        'numberposts' => 1,
    ) );

    if ( $suivant ) {
        wp_update_post( array( 'ID' => $suivant[0]->ID, 'post_status' => 'publish' ) );
        wp_mail( get_post_meta( $suivant[0]->ID, 'email', true ), 'Une place s’est libérée', 'Votre inscription est confirmée.' );
    }
}, 10, 3 );
```

Cette promotion automatique évite à l'équipe organisatrice de surveiller manuellement les désistements pendant les semaines précédant l'événement.

## Étape 4 : afficher une jauge honnête côté visiteur

Sur la page publique de l'atelier, il est préférable d'afficher un état réel plutôt qu'un simple « complet » ou « ouvert ». Un shortcode qui interroge `atelier_compter_confirmes()` et le quota permet d'afficher : « 47 places sur 50 prises » avant complet, puis « Liste d'attente : 6 personnes » une fois le seuil dépassé. Cette transparence réduit sensiblement le nombre de messages de réclamation reçus par l'organisation après l'événement.

## Points de vigilance sur la volumétrie

- Un salon avec plusieurs dizaines d'ateliers simultanés génère autant de clés de transient : préfixer chaque clé par l'identifiant de l'atelier évite tout conflit entre eux.
- Le comptage via `wp_count_posts()` ne filtre pas par `post_parent` : il faut passer par `WP_Query` avec `fields => 'ids'` pour un comptage précis par atelier.
- Un désistement de dernière minute, la veille de l'événement, doit rester possible sans réactiver le formulaire public : un lien d'annulation à usage unique, basé sur un jeton stocké en meta, répond à ce besoin sans compte utilisateur.

## Notre verdict

Pour un salon professionnel aux ateliers en nombre limité, ce mécanisme reste plus fiable qu'un compteur JavaScript côté client, car tout le contrôle de concurrence se fait côté serveur, au moment de l'écriture. Le coût de développement est raisonnable, et l'organisation garde une vue précise, atelier par atelier, sur l'état réel des inscriptions sans dépendre d'une billetterie tierce.
