Hooks prise de rendez-vous

Disponible dans :Free

Ces hooks modifient la façon dont HappenBoard propose et enregistre les rendez-vous : horaires réservables, hôte attribué, prix, mode de paiement et suite donnée à chaque étape. Ils servent par exemple à bloquer des horaires venus d’un autre outil, à ajouter un choix de salle, à faire varier le prix selon l’heure ou à synchroniser un CRM.

Pour une première approche des hooks de HappenBoard, lisez Étendre HappenBoard avec les hooks. La fonctionnalité est présentée dans Prise de rendez-vous : vue d’ensemble. Les e-mails envoyés par ces actions ont leurs propres hooks notifications et e-mails.

Statuts de réservation et actions déclenchées

Chaque réservation est enregistrée avec un statut, puis change quand elle est payée, validée, refusée, annulée ou déplacée. Le tableau donne les actions déclenchées à chaque étape, dans l’ordre, sans leur préfixe happenboard_booking_.

Ce qui se passeStatut enregistréActions, dans l’ordre
Réservation directe, sans validation ni paiementconfirmedcreated, confirmed
Demande sur un type soumis à validationpending_approvalcreated, requested
Paiement en ligne (Pro)pending_payment, puis confirmedcreated, payment_pending, puis paid, confirmed
Demande avec empreinte bancaire (Pro)pending_payment, puis pending_approvalcreated, payment_pending, puis payment_authorized, requested
Demande validéeconfirmedapproved, confirmed, puis payment_captured si une empreinte a été débitée
Demande refuséedeclineddeclined, cancelled
Réservation annuléecancelledcancelled
Paiement jamais terminécancelledpayment_abandoned
Réservation déplacéeinchangérescheduled
Marquée terminée ou absente (no-show), une fois commencéecompleted ou no_showaucune

Comment les horaires proposés sont vérifiés

  • Le bloc Booking Page demande les horaires mois par mois. Une requête couvre 186 jours au plus et renvoie 750 créneaux au plus.
  • Quand une réservation est créée ou déplacée, HappenBoard relance le moteur pour ce jour, sans cache, et refuse un début qu’il ne propose plus. happenboard_booking_slots décide donc de ce qui est réservable, pas seulement de ce qui est affiché.
  • Cette vérification et l’enregistrement se font sous un verrou unique pour tout le site : deux visiteurs qui choisissent le même horaire passent l’un après l’autre.
  • Un visiteur qui attend le verrou plus de 10 secondes est invité à réessayer (happenboard_booking_busy, HTTP 503). Gardez rapides les filtres appelés pendant la vérification, sans requête distante.
  • Un hôte est occupé pendant chacune de ses réservations, quel que soit le type de rendez-vous, marges de ce type comprises.
  • Les places ne se partagent qu’entre réservations du même type qui commencent à la même heure. Les types à la journée et ceux dont le client choisit la durée partagent leur capacité entre réservations qui se chevauchent.
  • Le plafond journalier d’un type masque un hôte pour la journée dès que ses réservations qui commencent ce jour-là, dans le fuseau du site, atteignent le plafond.
  • Les listes de créneaux ne sont mises en cache que si le site a un cache d’objets persistant. Un navigateur ou un CDN peut réutiliser 60 secondes la liste d’un visiteur anonyme.

Prix et paiement en ligne

L’extension gratuite affiche un prix par place et le paiement se fait sur place. Le prix d’une réservation est calculé une seule fois par happenboard_booking_price, puis enregistré sur la réservation avec sa devise. Les e-mails, l’écran Bookings et la page de paiement reprennent ce montant, même si les prix changent ensuite.

HappenBoard Pro encaisse par Stripe. Il répond à happenboard_booking_awaiting_payment (paiement immédiat) ou, pour une demande, à happenboard_booking_authorize_payment (empreinte bancaire jusqu’à votre validation). Il envoie ensuite le client vers Stripe par happenboard_booking_payment_url et débite l’empreinte par happenboard_booking_capture_payment.

Quand le montant encaissé est inférieur au prix, la réservation est enregistrée avec un acompte, le reste étant dû sur place. La durée pendant laquelle Pro garde une empreinte avant de refuser la demande se règle avec happenboard_pro_booking_hold_hours.

happenboard_booking_slots

Filtre Free src/Service/Booking/Availability/SlotGenerator.php

Filtre les horaires libres d’un type de rendez-vous, une fois appliqués les règles de disponibilité, les délais, les marges, les plafonds journaliers et la capacité. Chaque horaire proposé passe ici : c’est le seul endroit où ajouter ou retirer des créneaux réservables.

Signature

apply_filters( 'happenboard_booking_slots', array $list, int $booking_type_id, string $from, string $to, array $context )

Paramètres

$list array<int,array<string,mixed>>
Créneaux triés par début. Chacun contient start_utc et end_utc (UTC Y-m-d H:i:s) et start (ISO 8601 dans le fuseau du visiteur). S’y ajoutent les textes d’affichage label, day_label et time_label, hosts (ID des utilisateurs libres), host_seats (ID d’hôte vers places restantes) et capacity_left (le plus grand nombre de places d’un hôte).
$booking_type_id int
Le type de rendez-vous (ID de l’article hboard_booking_type).
$from string
Premier jour de la fenêtre, tel que le moteur l’a reçu (une date Y-m-d dans le fuseau du site sur la route publique).
$to string
Dernier jour de la fenêtre.
$context array{length:int,ignore_booking_id:int}
length : combien de durées du type couvre chaque créneau. ignore_booking_id : une réservation en cours de déplacement, dont les places ne doivent pas compter, ou 0.

Valeur de retour

array<int,array<string,mixed>> Une liste de créneaux indexée à partir de 0.

Exemple

add_filter(
    'happenboard_booking_slots',
    function ( $slots, $booking_type_id ) {
        if ( 42 !== $booking_type_id ) {
            return $slots;
        }

        // Pas de réservation le vendredi après-midi, heure du site.
        $slots = array_filter(
            $slots,
            function ( $slot ) {
                $local = ( new DateTimeImmutable( $slot['start_utc'], new DateTimeZone( 'UTC' ) ) )->setTimezone( wp_timezone() );
                return ! ( '5' === $local->format( 'N' ) && (int) $local->format( 'G' ) >= 12 );
            }
        );

        return array_values( $slots );
    },
    10,
    2
);

Remarques

  • Jusqu’à cinq arguments : utilisez add_filter( ..., 10, 5 ) pour recevoir $context. Un callback qui déduit sa propre occupation doit ignorer la réservation indiquée par ignore_booking_id, comme le fait le moteur.
  • Il décide aussi de ce qui peut être enregistré. Créer ou déplacer une réservation relance le moteur, sans cache, et refuse un début absent de votre liste. Un créneau que vous ajoutez doit avoir start_utc en UTC Y-m-d H:i:s, de vrais ID d’utilisateurs dans hosts et assez de places dans host_seats ou capacity_left.
  • Renvoyez une liste : terminez par array_values(). Une liste à trous arrive au navigateur sous forme d’objet JSON et casse le bloc Booking Page.
  • Lors de l’enregistrement, la fenêtre fait un jour et les textes d’affichage sont en UTC : basez votre logique sur start_utc. HappenBoard Pro s’accroche aux priorités 10 (ressources partagées), 20 (agendas externes) et 30 (un prix par créneau) : utilisez une priorité supérieure à 30 pour voir la liste finale.

happenboard_slot_cache_ttl

Filtre Free src/Service/Booking/Availability/SlotCache.php

Filtre la durée de mise en cache, en secondes, de la liste publique des créneaux d’un type de rendez-vous. Par défaut, les listes sont gardées 5 minutes si le site dispose d’un cache d’objets persistant, et pas du tout sinon.

Signature

apply_filters( 'happenboard_slot_cache_ttl', int $ttl )

Paramètres

$ttl int
300 avec un cache d’objets persistant, 0 sans.

Valeur de retour

int Durée en secondes. 0 coupe le cache, en lecture comme en écriture.

Exemple

add_filter(
    'happenboard_slot_cache_ttl',
    function ( $ttl ) {
        // Agenda partagé très actif : une minute au plus.
        return $ttl > 0 ? MINUTE_IN_SECONDS : 0;
    }
);

Remarques

  • Sans cache d’objets persistant, une valeur positive stocke chaque liste dans wp_options (souvent 60 à 230 Ko par entrée). Ces lignes restent après chaque changement de réservation, jusqu’au nettoyage des transients expirés par WordPress. Gardez 0 dans ce cas.
  • Le cache sert seulement à l’affichage. L’horaire choisi est revérifié, sans cache, au moment d’enregistrer la réservation : une liste périmée peut proposer un horaire ensuite refusé, jamais créer une double réservation.
  • Toutes les listes sont vidées quand une réservation est créée, confirmée, annulée, déplacée ou libérée faute de paiement, et quand un type de rendez-vous ou ses réglages changent. Les entrées dépendent du type, de la fenêtre, du fuseau, de la langue et de la durée.
  • La liste mise en cache est celle renvoyée par happenboard_booking_slots : la réponse de votre filtre de créneaux est donc aussi en cache.

happenboard_slots_max_age

Filtre Free src/REST/BookingSlots.php

Filtre combien de secondes un navigateur ou un CDN peut réutiliser la liste de créneaux envoyée à un visiteur anonyme. Par défaut, la route publique des créneaux envoie Cache-Control: public, max-age=60.

Signature

apply_filters( 'happenboard_slots_max_age', int $max_age )

Paramètres

$max_age int
60 par défaut.

Valeur de retour

int Secondes. 0 n’envoie aucun en-tête Cache-Control.

Exemple

add_filter(
    'happenboard_slots_max_age',
    function () {
        // Notre CDN met en cache les réponses REST : listes plus fraîches.
        return 15;
    }
);

Remarques

  • S’applique à GET /happenboard/v1/booking-types/{id}/slots pour les visiteurs non connectés. Les requêtes connectées, les horaires proposés pour déplacer une réservation et un refus 429 ne sont jamais déclarés réutilisables.
  • Une liste réutilisée peut encore montrer un horaire qui vient d’être réservé. La réservation est revérifiée à l’enregistrement : ce visiteur apprend que l’horaire est pris, et personne n’est réservé deux fois.
  • Un CDN n’est pas purgé quand une réservation est faite : cette valeur est le retard maximal d’une liste réutilisée.

happenboard_booking_location_labels

Filtre Free et Pro src/Block/BookingPage/Block.php

Filtre le texte affiché pour le mode de lieu d’un type de rendez-vous, par exemple « In person ». Servez-vous-en pour nommer le mode custom, sans libellé par défaut, ou pour renommer les autres.

Signature

apply_filters( 'happenboard_booking_location_labels', array $labels )

Paramètres

$labels array<string,string>
Slug du mode vers libellé : in_person (In person), virtual (Online), phone (By phone).

Valeur de retour

array<string,string> Les libellés. Un mode sans libellé n’affiche aucun lieu.

Exemple

add_filter(
    'happenboard_booking_location_labels',
    function ( $labels ) {
        $labels['custom'] = 'Dans vos locaux';

        return $labels;
    }
);

Remarques

  • Utilisé par les blocs Booking Page et Booking Availability, et par les résultats du bloc Find a Time de HappenBoard Pro.
  • Les libellés sont échappés à l’affichage : renvoyez du texte brut.

happenboard_booking_page_choices

Filtre Free src/Block/BookingPage/Block.php

Ajoute des sélecteurs, comme « Salle » ou « Table », au bloc Booking Page, avant le choix de l’horaire. Chaque sélecteur filtre les horaires affichés et part avec la réservation.

Signature

apply_filters( 'happenboard_booking_page_choices', array $choices, array $config )

Paramètres

$choices array<int,array<string,mixed>>
Les sélecteurs déjà présents. Sur un type fixed à plusieurs hôtes, l’extension gratuite ajoute un choix de l’hôte (clé host, champ hosts).
$config array<string,mixed>
La configuration du type de rendez-vous, avec id.

Valeur de retour

array<int,array<string,mixed>> Les sélecteurs, chacun avec key (envoyée en choices[key]), field (la clé du créneau qui liste les ID libres à cet horaire), label, any (le libellé « sans préférence », valeur 0) et options (paires value et label).

Exemple

add_filter(
    'happenboard_booking_page_choices',
    function ( $choices, $config ) {
        if ( 42 !== (int) $config['id'] ) {
            return $choices;
        }

        $choices[] = array(
            'key'     => 'table',
            'field'   => 'free_tables', // Ajouté à chaque créneau par votre filtre de créneaux.
            'label'   => 'Table',
            'any'     => 'Peu importe',
            'options' => array( array( 'value' => 1, 'label' => 'Fenêtre' ), array( 'value' => 2, 'label' => 'Terrasse' ) ),
        );
        return $choices;
    },
    10,
    2
);

Remarques

  • Deux arguments : enregistrez avec add_filter( ..., 10, 2 ).
  • Un horaire n’est affiché que si son créneau liste l’ID choisi sous field : ajoutez cette liste à chaque créneau dans happenboard_booking_slots.
  • Vérifiez et arrêtez la valeur envoyée dans happenboard_booking_choices : n’importe qui peut envoyer n’importe quelle valeur à la route REST.
  • HappenBoard Pro y ajoute son choix de ressource (clé resource, champ resources) quand un type de rendez-vous offre au client le choix entre au moins deux ressources actives.

happenboard_booking_person_types

Filtre Free src/Service/Booking/PersonTypes.php

Définit les catégories de personnes d’un type de rendez-vous, comme Adulte et Enfant, pour réserver « 2 × Adulte, 1 × Enfant » plutôt qu’un nombre de places. L’extension gratuite n’en définit aucune ; HappenBoard Pro renvoie celles réglées sur le type.

Signature

apply_filters( 'happenboard_booking_person_types', array $types, array $config )

Paramètres

$types array<int,array<string,mixed>>
Vide par défaut.
$config array<string,mixed>
La configuration du type de rendez-vous, avec id.

Valeur de retour

array<int,array<string,mixed>> Les catégories, chacune avec key, label, min, max (0 pour aucune limite propre) et seats (si chaque personne occupe une place).

Exemple

add_filter(
    'happenboard_booking_person_types',
    function ( $types, $config ) {
        if ( array() !== $types || 42 !== (int) $config['id'] ) {
            return $types;
        }

        return array(
            array( 'key' => 'adult', 'label' => 'Adulte', 'min' => 1, 'max' => 0, 'seats' => true ),
            array( 'key' => 'child', 'label' => 'Enfant', 'min' => 0, 'max' => 4, 'seats' => true ),
            // Les bébés restent sur les genoux : aucune place occupée.
            array( 'key' => 'infant', 'label' => 'Bébé', 'min' => 0, 'max' => 2, 'seats' => false ),
        );
    },
    5,
    2
);

Remarques

  • Deux arguments : enregistrez avec add_filter( ..., 10, 2 ). HappenBoard Pro répond à la priorité 10 et garde une liste non vide reçue : une priorité plus basse l’emporte.
  • La liste est nettoyée : 10 catégories au plus, des nombres jusqu’à 50, des libellés jusqu’à 60 caractères, et seats vrai sauf indication contraire.
  • Dès qu’un type a des catégories, la réservation d’un visiteur doit envoyer les nombres, sinon elle est refusée (happenboard_booking_persons_invalid, HTTP 400). Les places réservées deviennent le nombre de personnes qui occupent une place, au moins 1.
  • La répartition est enregistrée sur la réservation, libellés compris, et transmise à happenboard_booking_price et happenboard_booking_choices. L’extension gratuite facture toujours à la place ; les prix par catégorie viennent de Pro.

happenboard_booking_price

Filtre Free src/Service/Booking/BookingPrice.php

Filtre le prix d’une réservation, en unités mineures de la devise du site (centimes pour l’euro). L’extension gratuite renvoie le prix du type de rendez-vous multiplié par le nombre de places.

Signature

apply_filters( 'happenboard_booking_price', int $price, array $config, array $booking )

Paramètres

$price int
Prix fixe multiplié par les places, en unités mineures.
$config array<string,mixed>
La configuration du type de rendez-vous.
$booking array{start_utc:string,host_user_id:int,quantity:int,length:int,persons:array<string,int>}
start_utc, host_user_id (0 tant qu’aucun hôte n’est choisi), quantity (places), length (nombre de durées, 1 sur un type à durée fixe) et persons (clé de catégorie vers nombre).

Valeur de retour

int Le prix en unités mineures. Une valeur négative devient 0.

Exemple

add_filter(
    'happenboard_booking_price',
    function ( $price, $config, $booking ) {
        $start = new DateTimeImmutable( $booking['start_utc'], new DateTimeZone( 'UTC' ) );

        // Majoration de 20 % en soirée à partir de 18 h, heure du site.
        if ( (int) $start->setTimezone( wp_timezone() )->format( 'G' ) >= 18 ) {
            $price = (int) round( $price * 1.2 );
        }

        return $price;
    },
    20,
    3
);

Remarques

  • Trois arguments : enregistrez avec add_filter( ..., 10, 3 ).
  • Le résultat est enregistré sur la réservation (price_cents et currency) au moment où elle est faite. Les e-mails, l’écran Bookings et la page de paiement reprennent ce montant, même si votre règle change ensuite.
  • La route publique de devis (GET /happenboard/v1/booking-types/{id}/quote) l’interroge aussi : le bloc Booking Page affiche ainsi le montant enregistré ensuite. Évitez tout effet de bord.
  • HappenBoard Pro applique ses règles de prix à la priorité 10 et, avec des catégories de personnes, calcule chaque catégorie en ignorant le montant reçu. Accrochez-vous après 10 pour ajuster son résultat.

happenboard_booking_price_label

Filtre Free src/Service/Booking/BookingPrice.php

Filtre le prix affiché pour un type de rendez-vous avant le choix d’un horaire, dans les blocs Booking Page, Booking Availability et Booking Types.

Signature

apply_filters( 'happenboard_booking_price_label', string $label, array $config )

Paramètres

$label string
Le prix fixe formaté dans la devise du site, ou '' s’il vaut 0.
$config array<string,mixed>
La configuration du type de rendez-vous.

Valeur de retour

string Du texte brut, ou '' pour n’afficher aucun prix.

Exemple

add_filter(
    'happenboard_booking_price_label',
    function ( $label, $config ) {
        // Un service chiffré après un premier échange.
        return 42 === (int) $config['id'] ? 'Sur devis' : $label;
    },
    20,
    2
);

Remarques

  • Deux arguments : enregistrez avec add_filter( ..., 10, 2 ).
  • Il ne change que le texte. Le montant dû ou débité vient de happenboard_booking_price.
  • HappenBoard Pro renvoie un prix « From » à la priorité 10 quand ses règles de prix font dépendre le prix de l’horaire.
  • Les blocs échappent le libellé : renvoyez du texte brut, pas du HTML.

happenboard_currency

Filtre Free src/Service/Money.php

Filtre la devise du site, sous forme de code ISO 4217 à trois lettres. C’est la devise de tous les prix de réservation que HappenBoard affiche et enregistre.

Signature

apply_filters( 'happenboard_currency', string $code )

Paramètres

$code string
La devise enregistrée dans les réglages généraux de HappenBoard, USD par défaut.

Valeur de retour

string Un code à trois lettres. Toute autre valeur devient USD.

Exemple

add_filter(
    'happenboard_currency',
    function ( $code ) {
        // Suivre la devise de la boutique WooCommerce quand elle est active.
        return function_exists( 'get_woocommerce_currency' ) ? get_woocommerce_currency() : $code;
    }
);

Remarques

  • Rien n’est converti : changer de devise renomme seulement la devise des prix de vos types de rendez-vous.
  • Chaque réservation garde la devise dans laquelle elle a été faite : un changement ultérieur ne touche pas les réservations existantes.
  • HappenBoard Pro coupe le paiement en ligne des réservations quand sa devise Stripe n’a pas le même nombre de décimales que celle-ci (USD et JPY, par exemple).
  • Lisez la devise avec \HappenBoard\Service\Money::currency() plutôt que le réglage brut, pour que votre code et l’extension s’accordent.

happenboard_booking_client_ip

Filtre Free et Pro src/REST/Bookings.php

Filtre l’adresse IP du visiteur sur laquelle les routes publiques de réservation comptent les requêtes. Utilisez-le derrière un proxy inverse ou un CDN, où tous les visiteurs arrivent sinon avec l’adresse du proxy.

Signature

apply_filters( 'happenboard_booking_client_ip', string $ip )

Paramètres

$ip string
REMOTE_ADDR si c’est une IP valide, sinon ''.

Valeur de retour

string Une adresse IP, ou '' pour ne rien compter.

Exemple

add_filter(
    'happenboard_booking_client_ip',
    function ( $ip ) {
        // Derrière Cloudflare : l'adresse du visiteur qu'il transmet.
        $real = filter_var( $_SERVER['HTTP_CF_CONNECTING_IP'] ?? '', FILTER_VALIDATE_IP );

        return $real ? $real : $ip;
    }
);

Remarques

  • Lu par l’envoi des réservations (8 par minute et par adresse, 5 par heure et par e-mail) et par la recherche Find a Time de HappenBoard Pro (20 par minute). Les recherches de créneaux et de devis ont droit à 60 par minute, comptées seulement avec un cache d’objets persistant, sauf avis contraire de happenboard_throttle_public_reads.
  • À l’envoi d’une réservation, la même adresse part vers Cloudflare Turnstile et Akismet quand ils sont activés.
  • Ne faites confiance qu’à un en-tête posé par votre proxy. Si le site est aussi joignable en direct, n’importe qui peut envoyer cet en-tête et choisir son adresse.
  • Renvoyer '' coupe les limites par adresse. Les inscriptions et le paiement des billets lisent happenboard_rsvp_client_ip : ajoutez-y le même callback.

happenboard_booking_choices

Filtre Free src/Service/Booking/BookingService.php

Vérifie et arrête les choix d’extension d’une réservation sur le point d’être enregistrée, comme une salle choisie dans le bloc Booking Page. Renvoyez une WP_Error pour refuser la réservation ou le déplacement.

Signature

apply_filters( 'happenboard_booking_choices', array $choices, array $context, array $slot )

Paramètres

$choices array<string,int>|WP_Error
Clé de choix vers ID, tirée de la demande (0 signifie sans préférence). Vide lors d’un déplacement. Peut déjà être une WP_Error d’un callback précédent.
$context array<string,mixed>
action (create ou reschedule), booking_type_id, booking_id (0 à la création), start_utc, end_utc, host_user_id, quantity, length et persons.
$slot array<string,mixed>
Le créneau à jour, jamais une version en cache, avec ce que votre callback happenboard_booking_slots y a ajouté.

Valeur de retour

array<string,int>|WP_Error Les choix arrêtés, ou une WP_Error avec un status, par exemple 409.

Exemple

add_filter(
    'happenboard_booking_choices',
    function ( $choices, $context, $slot ) {
        if ( is_wp_error( $choices ) || ! isset( $choices['table'] ) ) {
            return $choices;
        }

        // 'free_tables' a été ajouté à chaque créneau par votre filtre de créneaux.
        $free   = array_map( 'intval', (array) ( $slot['free_tables'] ?? array() ) );
        $wanted = (int) $choices['table'];
        if ( array() === $free || ( $wanted > 0 && ! in_array( $wanted, $free, true ) ) ) {
            return new WP_Error( 'acme_table_taken', 'Cette table n’est plus libre.', array( 'status' => 409 ) );
        }

        // « Sans préférence » : première table libre.
        $choices['table'] = $wanted > 0 ? $wanted : $free[0];
        return $choices;
    },
    10,
    3
);

Remarques

  • Trois arguments : enregistrez avec add_filter( ..., 10, 3 ). Transmettez telle quelle une WP_Error reçue.
  • Il s’exécute sous le verrou d’écriture des réservations, après les vérifications de l’extension gratuite : gardez-le rapide.
  • L’extension gratuite n’enregistre pas les choix. Les valeurs arrêtées arrivent dans happenboard_booking_created (troisième argument) et happenboard_booking_rescheduled (quatrième) : enregistrez-les là.
  • La route publique accepte 10 choix au plus, clés passées par sanitize_key() et ID en nombres entiers. HappenBoard Pro arrête ici son choix resource à la priorité 10.

happenboard_booking_assignment_strategy

Filtre Free src/Service/Booking/BookingService.php

Remplace l’objet qui choisit l’hôte d’une nouvelle réservation parmi les hôtes libres à cet horaire. Il sert aussi quand l’hôte d’une réservation déplacée n’est pas libre au nouvel horaire.

Signature

apply_filters( 'happenboard_booking_assignment_strategy', \HappenBoard\Service\Booking\Assignment\Strategy $strategy, string $assignment )

Paramètres

$strategy \HappenBoard\Service\Booking\Assignment\Strategy
LeastLoaded (l’hôte qui a le moins de rendez-vous à venir) pour round_robin, Fixed (l’hôte choisi, sinon le premier libre) pour tout autre mode.
$assignment string
Le mode du type de rendez-vous : fixed ou round_robin, les deux que propose l’éditeur.

Valeur de retour

\HappenBoard\Service\Booking\Assignment\Strategy Un objet dont pick( array $candidate_host_ids, int $booking_type_id, string $slot_utc ) renvoie un ID d’utilisateur, ou 0 si aucun.

Exemple

add_filter(
    'happenboard_booking_assignment_strategy',
    function ( $strategy, $assignment ) {
        if ( 'round_robin' !== $assignment ) {
            return $strategy;
        }

        // Confier la réservation à l'hôte 12 dès qu'il est libre.
        return new class( $strategy ) implements \HappenBoard\Service\Booking\Assignment\Strategy {
            public function __construct( private $fallback ) {}

            public function pick( array $candidate_host_ids, int $booking_type_id, string $slot_utc ): int {
                return in_array( 12, $candidate_host_ids, true )
                    ? 12
                    : $this->fallback->pick( $candidate_host_ids, $booking_type_id, $slot_utc );
            }
        };
    },
    10,
    2
);

Remarques

  • Deux arguments : enregistrez avec add_filter( ..., 10, 2 ). Renvoyer autre chose qu’une Strategy lève une TypeError.
  • Les candidats sont les hôtes qui ont assez de places libres à cet horaire, ou seulement l’hôte choisi par le visiteur s’il est libre. L’ID renvoyé par pick() n’est pas revérifié : renvoyez un candidat, ou 0 pour refuser la réservation (happenboard_booking_no_host, HTTP 409).
  • Lors d’un déplacement, un type fixed n’y passe jamais : le déplacement est refusé si l’hôte de la réservation est occupé (happenboard_booking_host_unavailable, HTTP 409).
  • Seul round_robin a sa propre stratégie. Les autres modes enregistrés (collective, weighted, priority) se comportent comme fixed, et HappenBoard Pro n’ajoute aucune stratégie aujourd’hui.

happenboard_booking_awaiting_payment

Filtre Free src/Service/Booking/BookingService.php

Décide si une réservation doit être payée en ligne avant de compter. L’extension gratuite répond non (paiement sur place) ; HappenBoard Pro répond oui quand le paiement en ligne des réservations est activé et Stripe configuré.

Signature

apply_filters( 'happenboard_booking_awaiting_payment', bool $awaiting, int $booking_type_id, array $config, int $price_cents )

Paramètres

$awaiting bool
false par défaut.
$booking_type_id int
Le type de rendez-vous réservé.
$config array<string,mixed>
La configuration du type de rendez-vous, avec price_cents (prix fixe par place) et deposit_cents.
$price_cents int
Le prix de cette réservation, issu de happenboard_booking_price.

Valeur de retour

bool True pour enregistrer la réservation en pending_payment, qui garde l’horaire pendant le paiement.

Exemple

add_filter(
    'happenboard_booking_awaiting_payment',
    function ( $awaiting, $booking_type_id, $config, $price_cents ) {
        // Les petits montants se règlent sur place, même avec le paiement en ligne.
        return $awaiting && $price_cents >= 5000;
    },
    20,
    4
);

Remarques

  • Quatre arguments : enregistrez avec add_filter( ..., 10, 4 ).
  • Interrogé seulement pour une réservation payante faite par un visiteur, sur un type sans validation. Les demandes passent par happenboard_booking_authorize_payment.
  • Le bloc Booking Page et la route de devis l’interrogent aussi, pour annoncer le mode de paiement : évitez tout effet de bord.
  • Renvoyer true sans URL de happenboard_booking_payment_url libère aussitôt l’horaire, et le visiteur reçoit happenboard_booking_payment_unavailable (HTTP 502).

happenboard_booking_authorize_payment

Filtre Free src/Service/Booking/BookingService.php

Décide si une demande de réservation, sur un type soumis à validation, doit d’abord passer par une empreinte bancaire en ligne avant d’arriver dans votre file de validation. La carte est débitée quand vous validez et libérée quand vous refusez.

Signature

apply_filters( 'happenboard_booking_authorize_payment', bool $authorize, int $booking_type_id, array $config, int $price_cents )

Paramètres

$authorize bool
false par défaut.
$booking_type_id int
Le type de rendez-vous réservé.
$config array<string,mixed>
La configuration du type de rendez-vous, avec price_cents (prix fixe par place) et deposit_cents.
$price_cents int
Le prix de cette réservation, issu de happenboard_booking_price.

Valeur de retour

bool True pour envoyer le client vers une page de paiement qui prend une empreinte. La réservation garde son horaire en pending_payment pendant ce temps.

Exemple

add_filter(
    'happenboard_booking_authorize_payment',
    function ( $authorize, $booking_type_id, $config, $price_cents ) {
        // Empreinte seulement pour les demandes de 100,00 ou plus.
        return $authorize && $price_cents >= 10000;
    },
    20,
    4
);

Remarques

  • Quatre arguments : enregistrez avec add_filter( ..., 10, 4 ).
  • Interrogé seulement pour une demande payante faite par un visiteur. Une réservation saisie par un gestionnaire est confirmée tout de suite : le gestionnaire vaut validation.
  • Séparé de happenboard_booking_awaiting_payment exprès : un prestataire qui ne sait que débiter directement ferait sinon payer les demandes en entier.
  • HappenBoard Pro y répond avec la même règle que pour happenboard_booking_awaiting_payment. Le bloc Booking Page et la route de devis l’interrogent aussi : évitez tout effet de bord.

happenboard_booking_payment_url

Filtre Free src/Service/Booking/BookingService.php

Filtre l’adresse vers laquelle le client est envoyé après l’enregistrement d’une réservation en pending_payment, pour payer ou laisser une empreinte bancaire. HappenBoard Pro renvoie une URL Stripe Checkout.

Signature

apply_filters( 'happenboard_booking_payment_url', string $url, int $booking_id, array $booking )

Paramètres

$url string
Vide par défaut.
$booking_id int
ID de la réservation.
$booking array<string,mixed>
La réservation enregistrée, sans cancel_token. payment_status vaut pending (débit immédiat) ou authorizing (empreinte seulement) ; price_cents est son prix.

Valeur de retour

string Une URL absolue, ou ''.

Exemple

add_filter(
    'happenboard_booking_payment_url',
    function ( $url, $booking_id, $booking ) {
        // Garder une réponse précédente, sinon créer notre lien de paiement.
        return '' !== $url ? $url : acme_checkout_link( $booking_id, (int) $booking['price_cents'] );
    },
    20,
    3
);

Remarques

  • Jusqu’à trois arguments : enregistrez avec add_filter( ..., 10, 3 ) pour recevoir la ligne.
  • Une réponse vide annule aussitôt la réservation, remet l’horaire en vente et répond au visiteur par happenboard_booking_payment_unavailable (HTTP 502). Aucune action ne se déclenche.
  • Pour authorizing, la page de paiement doit seulement prendre une empreinte (capture_method manual chez Stripe), jamais débiter.
  • La page de paiement de HappenBoard Pro expire au bout de 31 minutes. Son webhook libère alors l’horaire et happenboard_booking_payment_abandoned se déclenche.

happenboard_booking_capture_payment

Filtre Free src/Service/Booking/BookingService.php

Débite la carte retenue pour une demande de réservation au moment où vous la validez. La demande n’est confirmée qu’une fois le débit annoncé ici.

Signature

apply_filters( 'happenboard_booking_capture_payment', array|WP_Error|null $result, int $booking_id, array $booking )

Paramètres

$result array<string,mixed>|WP_Error|null
null par défaut, ou la réponse d’un callback précédent.
$booking_id int
ID de la réservation.
$booking array<string,mixed>
La réservation, sans cancel_token. payment_intent contient la référence du prestataire enregistrée avec l’empreinte, paid_cents le montant retenu.

Valeur de retour

array<string,mixed>|WP_Error|null array( 'amount' => int ) une fois débité (en unités mineures), une WP_Error qui dit pourquoi non, ou null si rien ne peut débiter.

Exemple

add_filter(
    'happenboard_booking_capture_payment',
    function ( $result, $booking_id, $booking ) {
        $reference = (string) ( $booking['payment_intent'] ?? '' );

        // Ne pas toucher aux réponses déjà données ni aux empreintes d'autres prestataires.
        if ( null !== $result || ! str_starts_with( $reference, 'acme_' ) ) {
            return $result;
        }

        $charge = acme_gateway_capture( $reference ); // Doit pouvoir être relancé.

        return is_wp_error( $charge ) ? $charge : array( 'amount' => (int) $charge['amount'] );
    },
    5,
    3
);

Remarques

  • Trois arguments : enregistrez avec add_filter( ..., 10, 3 ). HappenBoard Pro débite l’empreinte Stripe à la priorité 10 : transmettez un $result non nul sauf si vous voulez le remplacer.
  • null : la validation est refusée (HTTP 503) et rien ne change. Une WP_Error : la demande reste dans la file, une note garde la raison et la validation répond HTTP 402. Un tableau : la réservation est confirmée.
  • Sans amount, le montant retenu est considéré comme débité. Un montant inférieur à price_cents est enregistré comme acompte.
  • Après un échec, le gestionnaire peut valider de nouveau, ce qui réinterroge ce filtre : le débit doit pouvoir être relancé sans risque.

happenboard_booking_payment_hold_hours

Filtre Free src/Service/Booking/PaymentHoldSweeper.php

Filtre combien de temps une réservation impayée peut garder son horaire avant que le nettoyage horaire ne la libère. C’est le filet de sécurité pour un webhook de paiement qui n’arrive jamais.

Signature

apply_filters( 'happenboard_booking_payment_hold_hours', int $hours )

Paramètres

$hours int
24 par défaut.

Valeur de retour

int Heures. Une valeur inférieure à 1 devient 1.

Exemple

add_filter(
    'happenboard_booking_payment_hold_hours',
    function () {
        // Jamais plus court que la session de paiement du prestataire.
        return 6;
    }
);

Remarques

  • Ne descendez jamais sous la durée de la page de paiement du prestataire, sinon un client peut payer un horaire déjà rendu. La page Stripe de HappenBoard Pro dure 31 minutes.
  • L’âge se compte depuis la création de la réservation, pas depuis son début. Chaque passage libère jusqu’à 500 réservations encore en pending_payment et déclenche happenboard_booking_payment_abandoned pour chacune.
  • Il tourne avec WP-Cron (happenboard_release_payment_holds, toutes les heures) : un site peu visité libère en retard.
  • À ne pas confondre avec happenboard_pro_booking_hold_hours, qui refuse les demandes dont l’empreinte dure depuis trop longtemps.

happenboard_booking_created

Action Free src/Service/Booking/BookingService.php

Se déclenche après l’enregistrement d’une nouvelle réservation, quel que soit son statut. Servez-vous-en pour synchroniser un CRM ou créer un lien de visioconférence.

Signature

do_action( 'happenboard_booking_created', int $booking_id, array $data, array $choices )

Paramètres

$booking_id int
ID de la réservation.
$data array<string,mixed>
La ligne enregistrée, sans cancel_token (ne transmettez jamais ce secret : quiconque le détient peut annuler ou déplacer la réservation).
$choices array<string,int>
Les choix d’extension arrêtés par happenboard_booking_choices.

Exemple

add_action(
    'happenboard_booking_created',
    function ( $booking_id, $data, $choices ) {
        // Envoyer la réservation au CRM.
        wp_remote_post(
            'https://crm.example.com/bookings',
            array(
                'timeout' => 5,
                'headers' => array( 'Content-Type' => 'application/json' ),
                'body'    => wp_json_encode( array(
                    'id'     => (int) $booking_id,
                    'status' => (string) $data['status'],
                    'start'  => (string) $data['start_utc'],
                    'email'  => (string) $data['customer_email'],
                ) ),
            )
        );
    },
    10,
    3
);

Remarques

  • Trois arguments : enregistrez avec add_action( ..., 10, 3 ).
  • status peut valoir confirmed, pending_approval ou pending_payment. Pour les seuls vrais rendez-vous, écoutez happenboard_booking_confirmed, qui couvre aussi les réservations confirmées plus tard.
  • Les valeurs arrivent en chaînes, telles que lues en base : convertissez-les avant de comparer, et lisez persons avec \HappenBoard\Service\Booking\PersonTypes::from_row().
  • Déjà accrochés : HappenBoard Pro à la priorité 5 enregistre la ressource de $choices. Le notifieur gratuit à 10 envoie l’e-mail de confirmation ou de demande reçue, et rien encore pour une réservation en attente de paiement.

happenboard_booking_payment_pending

Action Free src/Service/Booking/BookingService.php

Se déclenche quand une nouvelle réservation garde son horaire pendant que le client paie en ligne, ou pendant la prise d’empreinte d’une demande.

Signature

do_action( 'happenboard_booking_payment_pending', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_payment_pending',
    function ( $booking_id ) {
        // Compter les passages par la page de paiement.
        acme_metrics( 'booking_checkout_started', $booking_id );
    }
);

Remarques

  • Le payment_status de la ligne distingue les deux cas : pending (paiement en cours) ou authorizing (empreinte à prendre).
  • Ce n’est pas un engagement : si happenboard_booking_payment_url ne renvoie rien juste après, la réservation est annulée sur-le-champ et plus rien ne se déclenche.
  • Nommé _payment_pending parce que happenboard_booking_awaiting_payment est un filtre, et que WordPress range actions et filtres dans une seule liste.

happenboard_booking_requested

Action Free src/Service/Booking/BookingService.php

Se déclenche quand une demande de réservation arrive dans votre file de validation. Servez-vous-en pour prévenir la personne qui doit répondre.

Signature

do_action( 'happenboard_booking_requested', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_requested',
    function ( $booking_id ) {
        // Prévenir l'équipe sur Slack.
        acme_slack( sprintf( 'Demande de réservation n° %d en attente.', $booking_id ) );
    }
);

Remarques

  • Se déclenche à deux endroits : à la création pour une demande sans paiement en ligne, et juste après happenboard_booking_payment_authorized une fois l’empreinte prise.
  • happenboard_booking_confirmed ne se déclenche pas pour une demande. Il viendra plus tard, si vous la validez.
  • Déjà accroché : le notifieur gratuit prévient par e-mail l’hôte et l’administrateur du site qu’une demande attend.

happenboard_booking_confirmed

Action Free src/Service/Booking/BookingService.php

Se déclenche chaque fois qu’une réservation devient confirmée, quel que soit le parcours : réservée directement, payée en ligne ou validée. Écoutez ici tout ce qui doit arriver une fois par vrai rendez-vous.

Signature

do_action( 'happenboard_booking_confirmed', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_confirmed',
    function ( $booking_id ) {
        $booking = ( new \HappenBoard\Service\Booking\BookingRepository() )->find_by_id( (int) $booking_id );
        if ( null === $booking ) {
            return;
        }

        // Compter les rendez-vous confirmés par hôte.
        $host = (int) $booking['host_user_id'];
        update_user_meta( $host, 'acme_confirmed_count', (int) get_user_meta( $host, 'acme_confirmed_count', true ) + 1 );
    }
);

Remarques

  • Il suit happenboard_booking_created, happenboard_booking_paid ou happenboard_booking_approved, selon le parcours.
  • Seul l’ID est transmis. Le payment_status de la ligne indique le mode de paiement : none, on_site, paid ou deposit.
  • Déjà accroché : le notifieur gratuit prévient l’hôte et l’administrateur du site. La confirmation du client part de happenboard_booking_created, happenboard_booking_approved ou happenboard_booking_paid.

happenboard_booking_approved

Action Free src/Service/Booking/BookingService.php

Se déclenche quand une demande de réservation est validée et confirmée. Pour une demande avec empreinte bancaire, seulement une fois la carte débitée.

Signature

do_action( 'happenboard_booking_approved', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_approved',
    function ( $booking_id ) {
        // Garder une trace des validations.
        acme_log( 'booking_approved', $booking_id );
    }
);

Remarques

  • happenboard_booking_confirmed suit aussitôt. Valider une réservation qui n’attend pas de validation est refusé (HTTP 409) : l’action ne se déclenche jamais deux fois pour la même réservation.
  • La validation passe par PATCH /happenboard/v1/bookings/{id} avec status=confirmed. L’action se déclenche aussi quand le prestataire signale un débit fait ailleurs, par exemple depuis le tableau de bord Stripe.
  • Déjà accroché : le notifieur gratuit envoie au client la confirmation, avec son invitation d’agenda, et programme les rappels.

happenboard_booking_paid

Action Free src/Service/Booking/BookingService.php

Se déclenche quand le paiement en ligne d’une réservation arrive et que la réservation est confirmée. HappenBoard Pro y arrive depuis son webhook Stripe.

Signature

do_action( 'happenboard_booking_paid', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_paid',
    function ( $booking_id ) {
        // Émettre un reçu.
        acme_issue_receipt( $booking_id );
    }
);

Remarques

  • happenboard_booking_confirmed suit aussitôt. Un webhook reçu deux fois ne confirme qu’une fois : l’action se déclenche une fois par réservation.
  • Le montant encaissé est enregistré dans paid_cents. Un montant inférieur à price_cents est un acompte (payment_status deposit), le reste se règle sur place.
  • Une empreinte débitée à la validation ne la déclenche pas : voyez happenboard_booking_payment_captured.
  • Déjà accroché : le notifieur gratuit envoie l’e-mail de confirmation et programme les rappels.

happenboard_booking_payment_authorized

Action Free src/Service/Booking/BookingService.php

Se déclenche quand l’empreinte bancaire d’une demande est prise et que la demande arrive dans votre file de validation. Rien n’est encore débité.

Signature

do_action( 'happenboard_booking_payment_authorized', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_payment_authorized',
    function ( $booking_id ) {
        // Signaler la demande avec empreinte prise.
        acme_slack( sprintf( 'Demande n° %d en attente, empreinte prise.', $booking_id ) );
    }
);

Remarques

  • happenboard_booking_requested suit aussitôt. La réservation est maintenant en pending_approval, avec payment_status authorized et le montant retenu dans paid_cents.
  • Déjà accroché : le notifieur gratuit envoie au client l’e-mail de demande reçue, retenu pendant qu’il était sur la page de paiement.

happenboard_booking_payment_captured

Action Free src/Service/Booking/BookingService.php

Se déclenche quand la carte retenue pour une demande a été débitée et la réservation confirmée.

Signature

do_action( 'happenboard_booking_payment_captured', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_payment_captured',
    function ( $booking_id ) {
        // Émettre un reçu.
        acme_issue_receipt( $booking_id );
    }
);

Remarques

  • Se déclenche en dernier, après happenboard_booking_approved et happenboard_booking_confirmed, que la demande ait été validée par vous ou débitée ailleurs selon le prestataire.
  • happenboard_booking_paid ne se déclenche pas ici : le client reçoit un seul e-mail de confirmation.
  • Le montant est dans paid_cents. Un montant inférieur à price_cents est enregistré comme acompte.

happenboard_booking_payment_failed

Action Free src/Service/Booking/BookingService.php

Se déclenche la première fois que la carte retenue pour une demande ne peut pas être débitée à la validation. La demande reste dans la file, son horaire toujours retenu.

Signature

do_action( 'happenboard_booking_payment_failed', int $booking_id, WP_Error $error )

Paramètres

$booking_id int
ID de la réservation.
$error WP_Error
La raison du refus, telle que renvoyée par happenboard_booking_capture_payment.

Exemple

add_action(
    'happenboard_booking_payment_failed',
    function ( $booking_id, $error ) {
        // Journaliser la raison du refus.
        error_log( sprintf( 'Charge failed for booking %d: %s', $booking_id, $error->get_error_message() ) );
    },
    10,
    2
);

Remarques

  • Deux arguments : enregistrez avec add_action( ..., 10, 2 ).
  • Une seule fois : valider de nouveau retente le débit, mais un deuxième échec ne déclenche rien. Chaque échec ajoute tout de même une note à la réservation.
  • Déjà accroché : le notifieur gratuit prévient le client que sa carte n’a pas pu être débitée.

happenboard_booking_payment_released

Action Free src/Service/Booking/BookingService.php

Se déclenche quand l’empreinte d’une réservation est libérée sans rien débiter. Le payment_status de la réservation passe à voided.

Signature

do_action( 'happenboard_booking_payment_released', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_payment_released',
    function ( $booking_id ) {
        // Garder une trace de la libération.
        acme_log( 'card_hold_released', $booking_id );
    }
);

Remarques

  • HappenBoard Pro libère l’empreinte quand une demande avec empreinte est refusée ou annulée, et quand Stripe signale l’empreinte annulée ou expirée.
  • Ne se déclenche que si une empreinte existait vraiment (payment_status authorized ou failed), jamais pour une réservation payée.
  • Aucun e-mail ici : le client est prévenu du refus ou de l’annulation elle-même.

happenboard_booking_payment_abandoned

Action Free src/Service/Booking/BookingService.php

Se déclenche quand une réservation dont le paiement n’est jamais arrivé est libérée et que son horaire est remis en vente. Couvre aussi bien un paiement qu’une prise d’empreinte.

Signature

do_action( 'happenboard_booking_payment_abandoned', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_payment_abandoned',
    function ( $booking_id ) {
        // Mesurer les paiements abandonnés.
        acme_metrics( 'booking_checkout_abandoned', $booking_id );
    }
);

Remarques

  • Deux sources : le webhook Stripe de HappenBoard Pro quand la page de paiement expire ou qu’un paiement différé échoue, et le nettoyage horaire de l’extension gratuite pour les réservations plus anciennes que happenboard_booking_payment_hold_hours.
  • Le statut passe à cancelled, mais happenboard_booking_cancelled ne se déclenche pas : le client n’a jamais eu de réservation, aucun e-mail d’annulation ne part.

happenboard_booking_declined

Action Free src/Service/Booking/BookingService.php

Se déclenche quand une demande de réservation est refusée, juste avant happenboard_booking_cancelled. Le statut de la réservation est alors declined.

Signature

do_action( 'happenboard_booking_declined', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_declined',
    function ( $booking_id ) {
        // Garder une trace des refus.
        acme_log( 'booking_declined', $booking_id );
    }
);

Remarques

  • Atteint quand vous refusez une demande (PATCH /happenboard/v1/bookings/{id} avec status=declined), quand vous annulez une demande encore en attente de validation, et quand HappenBoard Pro refuse une demande dont l’empreinte a expiré ou va expirer.
  • Déjà accroché : le notifieur gratuit envoie au client l’e-mail de demande refusée, sans e-mail d’annulation.
  • Si une empreinte existait, HappenBoard Pro la libère sur happenboard_booking_cancelled, puis happenboard_booking_payment_released suit.

happenboard_booking_cancelled

Action Free src/Service/Booking/BookingService.php

Se déclenche quand une réservation est annulée par le client ou un gestionnaire, et après chaque refus. Servez-vous-en pour libérer ce que votre extension avait réservé.

Signature

do_action( 'happenboard_booking_cancelled', int $booking_id )

Paramètres

$booking_id int
ID de la réservation.

Exemple

add_action(
    'happenboard_booking_cancelled',
    function ( $booking_id ) {
        $booking = ( new \HappenBoard\Service\Booking\BookingRepository() )->find_by_id( (int) $booking_id );

        // Libérer la salle réservée par cette extension, dans les deux cas.
        if ( null !== $booking && in_array( $booking['status'], array( 'cancelled', 'declined' ), true ) ) {
            acme_release_room( (int) $booking_id );
        }
    }
);

Remarques

  • Lisez le status de la ligne pour distinguer une annulation (cancelled) d’une demande refusée (declined).
  • Annuler deux fois est refusé (HTTP 409) et ne déclenche rien. Le client ne peut plus annuler après le délai limite du type de rendez-vous ; un gestionnaire le peut.
  • Ne se déclenche pas pour un paiement jamais terminé (happenboard_booking_payment_abandoned) ni pour une réservation libérée faute d’URL de paiement.
  • Déjà accrochés : HappenBoard Pro à la priorité 5 libère une empreinte. Le notifieur gratuit à 10 envoie l’e-mail d’annulation (pas après un refus), prévient l’hôte et l’administrateur du site, et supprime les rappels.

happenboard_booking_rescheduled

Action Free src/Service/Booking/BookingService.php

Se déclenche après le déplacement d’une réservation. Le nouvel horaire a passé les mêmes contrôles de créneau, de places et d’hôte qu’une nouvelle réservation.

Signature

do_action( 'happenboard_booking_rescheduled', int $booking_id, string $old_start, string $new_start, array $choices )

Paramètres

$booking_id int
ID de la réservation.
$old_start string
Ancien début, UTC Y-m-d H:i:s.
$new_start string
Nouveau début, UTC Y-m-d H:i:s. La fin n’est pas transmise : lisez-la dans la ligne.
$choices array<string,int>
Les choix d’extension arrêtés par happenboard_booking_choices pour le déplacement.

Exemple

add_action(
    'happenboard_booking_rescheduled',
    function ( $booking_id, $old_start, $new_start ) {
        // Les deux horaires sont en UTC 'Y-m-d H:i:s'.
        acme_crm_update( $booking_id, array( 'start_utc' => $new_start, 'previous_start_utc' => $old_start ) );
    },
    10,
    3
);

Remarques

  • Jusqu’à quatre arguments : enregistrez avec 10, 3 pour les horaires, ou 10, 4 pour recevoir $choices.
  • L’hôte peut changer : sur un type qui attribue lui-même les hôtes, un hôte occupé est remplacé par un hôte libre. Lisez host_user_id dans la ligne.
  • Le client déplace sa réservation depuis le lien de ses e-mails (réservations confirmées et demandes, avant le délai limite d’annulation). Un gestionnaire passe par l’ability reschedule-booking, sans délai limite.
  • Déjà accrochés : HappenBoard Pro à la priorité 5 déplace la ressource de la réservation. Le notifieur gratuit à 10 reprogramme les rappels, envoie au client un e-mail de déplacement et prévient l’hôte et l’administrateur du site.

happenboard_rest_booking_response

Filtre Free src/REST/Bookings.php

Filtre une réservation telle que la reçoit l’écran Bookings de l’administration. Servez-vous-en pour ajouter un champ, en général affiché comme colonne en plus.

Signature

apply_filters( 'happenboard_rest_booking_response', array $serialized, array $row )

Paramètres

$serialized array<string,mixed>
Les données en camelCase que lit l’écran, comme id, status, startUtc, customerName, priceCents et paymentStatus.
$row array<string,mixed>
La ligne brute de la base, cancel_token compris.

Valeur de retour

array<string,mixed> Les données. Ajoutez des clés ; gardez celles que lit l’écran.

Exemple

add_filter(
    'happenboard_rest_booking_response',
    function ( $item, $row ) {
        // Chargé pour toute la page dans happenboard_rest_bookings_prefetch.
        $id             = (int) $row['booking_id'];
        $item['source'] = (string) ( $GLOBALS['acme_booking_sources'][ $id ] ?? acme_source_for_booking( $id ) );

        return $item;
    },
    10,
    2
);

Remarques

  • Deux arguments : enregistrez avec add_filter( ..., 10, 2 ).
  • Il s’applique à chaque ligne de l’écran Bookings et de l’export CSV, et à la réservation renvoyée quand un gestionnaire réserve pour un client. Le CSV garde ses propres colonnes : une clé ajoutée n’y apparaît pas.
  • Pour afficher la clé en colonne, ajoutez un champ DataViews à window.happenBoard.bookingsExtraFields dans un script d’administration chargé avant l’écran Bookings.
  • Ne copiez jamais cancel_token de $row dans les données. HappenBoard Pro ajoute resourceName à la priorité 10.

happenboard_rest_bookings_prefetch

Action Free src/REST/Bookings.php

Se déclenche une fois par page de la liste Bookings de l’administration, avant que happenboard_rest_booking_response ne filtre chaque ligne. Chargez ici les données de votre colonne, en une requête pour toute la page.

Signature

do_action( 'happenboard_rest_bookings_prefetch', array $rows, WP_REST_Request $request )

Paramètres

$rows array<int,array<string,mixed>>
Les lignes brutes de la page, valeurs en chaînes.
$request WP_REST_Request
La requête GET /happenboard/v1/bookings, avec sa page et ses filtres.

Exemple

add_action(
    'happenboard_rest_bookings_prefetch',
    function ( $rows ) {
        // Une requête pour toute la page au lieu d'une par ligne.
        $ids = array_map( 'intval', array_column( $rows, 'booking_id' ) );
        $GLOBALS['acme_booking_sources'] = acme_sources_for_bookings( $ids );
    }
);

Remarques

  • Deux arguments : enregistrez avec add_action( ..., 10, 2 ) pour recevoir la requête.
  • Seule la liste Bookings la déclenche. L’export CSV et la réservation saisie par un gestionnaire passent par le filtre de réponse sans elle : ce filtre doit gérer des lignes non préchargées.
  • Une page contient jusqu’à 200 lignes (50 par défaut).

Pour aller plus loin