Douze équipes, un calendrier remanié presque chaque semaine au gré des reports de match et des indisponibilités de terrain, saisi par un bénévole entre deux entraînements sur son téléphone : c’est le contexte dans lequel ce club sportif amateur a fait le choix d’exposer son calendrier via une API REST plutôt que de continuer à publier des tableaux dans des articles de blog impossibles à filtrer.
Le budget du projet était nul en dehors du temps bénévole déjà investi dans le club. Aucune extension payante, aucun service tiers d’hébergement supplémentaire : uniquement WordPress, un type de contenu personnalisé et un front statique généré une fois par nuit.
Modéliser un match sans complexité inutile
Un type de contenu personnalisé match a suffi, avec des champs simples plutôt qu’une usine à gaz relationnelle entre équipes, terrains et compétitions distincts en tant que contenus séparés :
register_post_type( 'match', array(
'label' => 'Matchs',
'public' => true,
'show_in_rest' => true,
'supports' => array( 'title', 'custom-fields' ),
) );
Les champs personnalisés — équipe adverse, date, lieu, résultat — ont été ajoutés via des champs personnalisés natifs plutôt qu’une extension de champs avancés, pour rester sur une base entièrement gratuite du début à la fin du projet.
Exposer le calendrier sans écrire de route personnalisée
Avec show_in_rest activé, le type de contenu match est immédiatement disponible sur /wp/v2/match, sans qu’aucune route sur mesure n’ait été nécessaire pour ce besoin précis. Seul un filtre a été ajouté pour exposer les champs personnalisés dans la réponse :
add_action( 'rest_api_init', function() {
register_rest_field( 'match', 'infos', array(
'get_callback' => function( $post ) {
return array(
'adversaire' => get_post_meta( $post['id'], 'adversaire', true ),
'date_match' => get_post_meta( $post['id'], 'date_match', true ),
'lieu' => get_post_meta( $post['id'], 'lieu', true ),
);
},
) );
} );

Un front volontairement modeste
Le front, un site statique généré une fois par nuit via une action planifiée gratuite, affiche le calendrier de la semaine, filtré côté build plutôt que par une logique côté client complexe. Aucun rafraîchissement en temps réel n’était nécessaire : un match reporté le lundi soir apparaît correctement dès le lendemain matin sur le site.
- Génération statique nocturne, sans surveillance de webhook en continu
- Hébergement du front sur une offre gratuite adaptée aux petits volumes de trafic
- Aucune dépendance à un service de recherche ou de cache payant
Ce que le bénévole a gagné au quotidien
Avant ce projet, chaque report de match imposait de retrouver l’ancien article de blog concerné, de le modifier, puis de vérifier que le tableau HTML qu’il contenait restait lisible sur mobile. Avec le type de contenu personnalisé, une simple modification du champ date_match depuis l’administration WordPress suffit, sans jamais toucher à une mise en forme HTML fragile.
Ce gain, difficile à chiffrer précisément, s’est traduit très concrètement par une baisse du nombre de messages échangés entre bénévoles pour signaler une erreur d’affichage, un problème auparavant récurrent avec l’ancien système de publication en articles de blog.
Les limites assumées de cette approche
Un report de match annoncé en pleine journée n’apparaît sur le site qu’à la génération suivante, ce qui a été jugé acceptable par le club au regard du gain de simplicité et de coût. Un club avec des enjeux de billetterie ou de diffusion en direct n’aurait pas pu se satisfaire de cette latence.
Un projet sans budget n’est pas un projet au rabais ; c’est un projet où chaque brique doit se justifier avant d’être ajoutée.
En résumé
Un type de contenu personnalisé bien pensé, exposé nativement par l’API REST sans route sur mesure, a suffi à ce club amateur pour publier un calendrier fiable sur un front léger, sans dépenser le moindre euro. Ce cas ne traite pas la question de la billetterie, qui aurait imposé des contraintes de sécurité et de paiement totalement différentes.