Guide produit

Journal d’événements durable pour WordPress

Une outbox transactionnelle : chaque événement métier est écrit atomiquement puis livré à votre webhook signé ou à vos puits, avec reprises et tableau de bord.

Version publiée
0.6.3
Compatibilités
WordPress 6.3 minimum · 6.8.8, 7.0.4 et 7.1 recettés · PHP 8.2 à 8.4 recettés

Prérequis

Le journal fonctionne sans compte et sans service Novelience : aucune clé d’activation n’est demandée, aucune vérification de licence n’est effectuée et aucun appel n’est émis vers un serveur de Novelience. Les seules connexions sortantes vont vers l’adresse de webhook que vous renseignez et vers les puits que vous ajoutez par code, des destinations qui vous appartiennent et dont le secret partagé reste sur votre site. Une version installée continue de fonctionner à l’identique si votre abonnement prend fin ; l’abonnement ouvre le support et l’accès aux nouvelles versions.

ComposantVersions recettées
WordPress6.3 minimum · 6.8.8, 7.0.4 et 7.1 recettés
PHP8.2 minimum · 8.2, 8.3 et 8.4 recettés
Base de donnéesMySQL 8 ou MariaDB 10.6 et supérieurs, moteur InnoDB
WP-CronActif, ou déclenché par une tâche système toutes les cinq minutes pour une livraison régulière ; la purge des événements anciens s’exécute une fois par jour
DroitsUn compte administrateur pour installer ; manage_options pour ouvrir Réglages › Événements web, relancer une livraison et réessayer un événement (modifiable par le filtre wp_web_events_view_capability)
DestinationFacultative : une URL HTTPS capable de vérifier une signature HMAC-SHA256 (HTTP accepté uniquement pour localhost et 127.0.0.1), ou un puits ajouté par code sur le filtre wp_web_events_deliver, qui peut rester entièrement local. Sans destination, les événements sont conservés en attente.

Durable Lock Manager est facultatif : lorsqu’il est présent, il sérialise les écritures concurrentes d’une même clé d’idempotence.

Installation

  1. Téléchargez l’archive depuis Espace client › Mes produits et licences, puis vérifiez son empreinte SHA-256 avec celle affichée (sous Linux ou macOS : sha256sum durable-web-event-outbox-0.6.3.zip).
  2. Dans WordPress, ouvrez Extensions › Ajouter › Téléverser une extension, sélectionnez l’archive et cliquez sur Installer.
  3. Activez l’extension. Les tables nécessaires sont créées à l’activation ; un message d’erreur apparaît dans l’administration si la base de données refuse leur création.
  4. Affectez la licence au site dans votre espace client (Réaffecter ce droit) : c’est ce qui ouvre le support et les mises à jour pour ce site.

Une seule table est créée : {prefix}web_event_identities, qui porte les clés d’idempotence. Les événements eux-mêmes sont enregistrés comme contenus privés d’un type interne, dans les tables de contenus de WordPress.

Configuration

  1. Ouvrez Réglages › Événements web.
  2. Saisissez l’URL HTTPS de votre webhook et un secret partagé d’au moins 16 caractères, réglez le délai d’attente (2 à 30 secondes, 10 par défaut) et la durée de conservation des événements livrés ou échoués (1 à 3 650 jours, 30 par défaut).
  3. Cochez « Activer la livraison » et enregistrez. Tant que ces deux valeurs manquent, la livraison reste désactivée et les événements attendent sans être perdus.
  4. À l’enregistrement : le champ du secret revient toujours vide et le laisser vide conserve le secret déjà enregistré, qui peut donc être remplacé mais pas effacé depuis l’écran ; une URL invalide n’est pas enregistrée et l’ancienne est rétablie avec un message ; cocher la livraison sans URL ni secret suffisant la laisse désactivée mais enregistre le reste.
  5. Côté récepteur, vérifiez l’en-tête X-Web-Event-Signature : recalculez HMAC-SHA256(secret, "<horodatage>.<corps brut>") et comparez-le à v1 ; refusez un horodatage de plus de quelques minutes ; répondez par un statut 2xx.
Exemple de vérification (PHP) :
$header = $_SERVER['HTTP_X_WEB_EVENT_SIGNATURE']; // t=1725600000,v1=…
parse_str(str_replace(',', '&', $header), $parts);
$expected = hash_hmac('sha256', $parts['t'].'.'.file_get_contents('php://input'), $secret);
if (!hash_equals($expected, $parts['v1']) || abs(time() - (int) $parts['t']) > 300) { http_response_code(401); exit; }

Utilisation

wp_web_events_emit('order.paid', ['order_id' => 42, 'total' => '42.00'], 'order-42-paid');
  • Le premier argument est le nom, le deuxième la charge utile, le troisième une clé d’idempotence facultative : la même clé, pour le même nom d’événement, renvoie l’événement déjà enregistré ; un contenu différent sous ce même couple est refusé. Deux noms différents portant la même clé restent deux événements.
  • Le nom est normalisé avant enregistrement : mis en minuscules et réduit aux lettres non accentuées, chiffres, points, tirets et tirets bas, les autres caractères étant supprimés sans erreur. Il est refusé s’il est vide après normalisation ou s’il dépasse 100 octets.
  • La fonction renvoie l’identifiant de l’événement, ou une erreur WordPress : nom invalide, émission suspendue par une politique, charge utile refusée, conflit d’idempotence, ressource occupée, écriture impossible. Testez systématiquement le retour.
  • La charge utile est contrôlée avant tout enregistrement. L’émission est refusée au-delà de 32 768 octets une fois encodée en JSON, au-delà de huit niveaux d’imbrication, au-delà de 256 éléments tous niveaux confondus, pour une chaîne de plus de 4 096 octets ou un nom de clé de plus de 100 octets, et pour toute valeur qui n’est ni une chaîne, ni un entier, ni un booléen, ni un nombre décimal fini, ni une valeur absente, ni un tableau de ces types. La clé d’idempotence est bornée à 512 octets.
  • Le refus des données sensibles porte sur le nom de la clé et sur la forme des valeurs, et il est volontairement large. Sont refusées les clés key et toutes celles qui se terminent par _key, ainsi que celles dont un mot est email, e_mail, phone, telephone, mobile, message, token, nonce, password, secret, authorization, credential, cookie, session, document, medical, health, address, name, first_name, last_name, full_name, iban, card, ssn, nir ou birth. Les clés courantes name, message, document et order_key sont donc refusées : nommez product_label plutôt que product_name. Côté valeurs sont refusées une adresse électronique, un numéro de téléphone français, un paramètre token, nonce, key ou password dans une chaîne de requête, un en-tête d’autorisation porteur et un jeton web JSON.
  • Le webhook reçoit un JSON {id, name, occurred_at, attempt, payload} et les en-têtes X-Web-Event-Id, X-Web-Event-Name, X-Web-Event-Timestamp, X-Web-Event-Signature.
  • Livraison : quelques secondes après l’émission, puis toutes les cinq minutes ; en cas d’échec, nouvelle tentative avec temporisation exponentielle plafonnée à six heures, jusqu’à dix tentatives, puis état « Échoué » relançable.
  • Le tableau de bord de Réglages › Événements web montre les compteurs par état, l’événement en attente le plus ancien, le prochain cycle, les 25 derniers événements avec leur dernier résultat, et propose « Livrer maintenant les événements en attente » et « Réessayer maintenant ».
  • WP-CLI, facultatif : wp web-events status affiche tous les compteurs, dont celui des événements en attente faute de destination ; wp web-events dispatch lance un cycle, éventuellement restreint à des identifiants ; wp web-events retry <id> relance un événement en échec.

Points d’extension

CrochetRôle
wp_web_events_deliverAjoute un puits : chaque rappel ajoute un booléen ; l’événement est livré quand tous valent exactement true. Une valeur simplement évaluable comme vraie ne suffit pas.
wp_web_events_should_emit · wp_web_events_payloadPolitique d’émission et enrichissement de la charge utile. Toute valeur autre que true suspend l’émission ; une erreur WordPress renvoyée est transmise telle quelle à l’appelant.
wp_web_events_store_meta · wp_web_events_pending_query_args · wp_web_events_dispatch_eventsÉcriture d’une métadonnée, requête de sélection des événements à livrer et liste retenue pour un cycle.
wp_web_events_diagnostic · wp_web_events_schema_errorActions de diagnostic : verrou perdu, exception d’un puits ou d’un rappel, création ou migration du schéma impossible.
wp_web_events_dispatch · wp_web_events_retentionLes deux tâches planifiées, déclenchables à la main pour livrer ou purger immédiatement.
wp_web_events_webhook_request_args · wp_web_events_webhook_responseArguments HTTP du webhook intégré et observation de la réponse.
wp_web_events_delivered · wp_web_events_failed · wp_web_events_no_sinkActions de cycle de vie.
wp_web_events_retention_days · wp_web_events_view_capabilityRétention et capacité d’accès au tableau de bord ; la capacité vaut manage_options par défaut et y revient si le filtre renvoie une valeur vide.

Limites et sécurité

  • Le journal garantit la conservation et la relivraison ; il ne garantit pas l’ordre strict entre événements différents.
  • Un événement livré à plusieurs puits n’est marqué livré que si tous ont réussi ; un puits défaillant provoque la relivraison à tous.
  • Le secret est conservé en clair dans la table des options WordPress ; restreignez l’accès administrateur en conséquence.
  • La purge s’exécute une fois par jour et retire au plus 200 événements par passage, uniquement parmi ceux qui sont livrés ou en échec ; elle supprime en même temps leur ligne d’identité.

Désinstaller depuis Extensions › Supprimer retire les événements, la table d’identités, les réglages et les tâches planifiées. Désactiver sans supprimer conserve les événements, la table d’identités et les réglages ; les deux tâches planifiées sont retirées à la désactivation et recréées à la réactivation.

Journal des versions

VersionChangements
0.6.3Une valeur négative de réglage n’est plus transformée en sa valeur absolue : la borne basse qui la suit s’applique enfin. Une durée de conservation négative était enregistrée comme une durée positive.
0.6.2L’en-tête d’agent transmis au webhook annonce la version réellement installée. L’extension n’interroge plus le répertoire WordPress.org pour ses mises à jour.
0.6.1Fichier d’identité du produit ajouté dans l’archive : nom commercial, référence, version livrée et socles requis.
0.6.0Webhook signé intégré avec délai et reprises, tableau de bord et actions de relance, commandes WP-CLI, livraison toutes les cinq minutes et juste après émission, traduction française, désinstallation propre, type de capacité dédié.
0.5.0Version initiale publiée, retirée de la distribution le 6 septembre 2026.
  1. Un e-mail vous prévient à chaque nouvelle version ; l’archive et son empreinte sont dans Espace client › Mes produits et licences.
  2. Téléversez la nouvelle archive dans Extensions › Ajouter › Téléverser une extension et confirmez le remplacement de la version installée. Les données et réglages sont conservés ; les migrations de schéma s’exécutent au premier chargement.
  3. Après une mise à jour, contrôlez le journal des versions ci-dessous : il indique les changements de comportement à vérifier.

Support

Une question sur l’installation ou la configuration ?