Le WordPress d'aujourd'hui, décodé pour les développeurs

Extensions

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.

Par WordPress Développement • 23 novembre 2022 • 5 min de lecture • Aucun commentaire
Salon professionnel : basculer automatiquement les inscrits en liste d'attente

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

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

Voir tous ses articles

Dans la même veine

À lire aussi