Description
Mairie Reservation de Salles is a turnkey booking system for town halls (mairies) that want to digitize the reservation of their municipal rooms. The interface is in French, designed for French local authorities.
Citizens check availability online 24/7 through an interactive calendar and submit a request in a few clicks. Municipal staff manage requests from the WordPress admin with validation, deposit payment tracking, and automated emails.
For citizens
- Check availability online, on desktop or mobile
- Select multiple dates in one click on the calendar
- Four-step form: time slot, equipment, information, confirmation
- Automatic confirmation email for the request
- Choose between individual, association, or local association
For town hall staff
- Complete dashboard with multiple menus inside WordPress
- Filtering and search of requests
- Validation, refusal, cancellation, and deposit payment tracking
- Twelve-month yearly view with color coding
- Detailed monthly calendar per room
- Block a time slot for internal use (council meeting, maintenance, etc.)
- Management of local associations with a configurable deposit discount
- Global and per-room equipment catalog with real-time stock checking
- Fully editable email templates
- PDF rules document automatically attached to emails
- One-click JSON backup and restore
- Advanced statistics with charts (bookings per month, per room, occupancy rate)
- Granular permission system with role presets (Mayor, Deputy, Agent, Secretary)
- PDF calendar export (monthly and yearly views)
- Optional anti-bot protection via Cloudflare Turnstile
Available shortcodes
[mrds_reservation_salle]– Full multi-step booking form[mrds_reservation_salle_directe salle="slug"]– Form with a pre-selected room[mrds_reservation_sans_salles]– Companion form for the calendar[mrds_calendrier_salle]– Interactive multi-date calendar[mrds_salles_disponibilites]– Room presentation cards
External services
This plugin can optionally use Cloudflare Turnstile to protect the public form from bots. When enabled by the administrator, the Turnstile script is loaded from Cloudflare and the submitted token is verified against Cloudflare’s API. This only happens if you enter your own Turnstile keys in the settings. See the Cloudflare Turnstile terms (https://www.cloudflare.com/website-terms/) and privacy policy (https://www.cloudflare.com/privacypolicy/).
Installation
- Download the plugin ZIP file
- In WordPress: Plugins > Add New > Upload Plugin
- Select the ZIP and click Install
- Activate the plugin
- Go to Reservations > Rooms to configure your rooms
- Add the shortcode
[mrds_reservation_salle]or[mrds_calendrier_salle]to a page
FAQ
-
Is the plugin compatible with my theme?
-
Yes. The plugin uses standard WordPress shortcodes and works with any standards-compliant theme. No theme modification is required.
-
How many rooms can I manage?
-
There is no limit. You can manage one or dozens of rooms, each with its own opening hours, capacity, deposit, and equipment.
-
How does the double-booking check work?
-
On every booking attempt, the system checks in real time that no other active request overlaps the time slot, which prevents duplicates even with simultaneous submissions.
-
Are the emails customizable?
-
Yes. The email templates (acknowledgement, validation, refusal, and more) are fully editable from the admin. Dynamic variables are available, such as first name, last name, room, date, time slot, and subject.
-
Can I attach a rules document to the emails?
-
Yes. Upload a PDF in Reservations > Rules. You can have one global document or a specific document per room. It is attached automatically to the configured emails.
-
How can I protect the form from bots?
-
The plugin integrates Cloudflare Turnstile (free). Create your keys on the Cloudflare dashboard, paste them into the settings, and the form is protected immediately.
-
Which PHP versions are supported?
-
The plugin requires PHP 7.4 or higher and has been tested up to PHP 8.3.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Mairie Réservation de Salles” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Mairie Réservation de Salles” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.7.1
- Correction : l’URL du plugin dans l’en-tête pointait vers un slug obsolète (mairie-reservation) au lieu du slug réel (mairie-reservation-de-salles).
- Audit complet de l’extension : vérification que chaque require_once a son fichier, que les 40 callbacks de hooks et les 14 handlers AJAX pointent vers des fonctions existantes, cohérence des 103 requêtes préparées, des 1201 appels de traduction et des scripts localisés. Chargement du plugin simulé de bout en bout (46 hooks, 13 pages admin, 7 shortcodes) sans erreur ni avertissement.
1.7.0
- i18n : les 797 chaînes source du plugin sont désormais écrites en anglais (au lieu du français), conformément à la convention WordPress.org. Le français redevient une traduction comme les autres, fournie via un fichier .mo bundlé (au lieu d’être la langue de repli implicite du code).
- Remplacement effectué uniquement à l’intérieur des appels de traduction (__, _e, esc_html__, esc_html_e, esc_attr__, esc_attr_e, _n) — noms de fonctions, shortcodes, capacités, valeurs de statut en base, et le nom du plugin lui-même n’ont pas été touchés.
- Ajout : languages/mairie-reservation-de-salles-fr_FR.po + .mo (775 chaînes, compilé avec msgfmt, testé sans erreur) pour un affichage en français immédiat sur un site de test, en attendant la prise en charge par translate.wordpress.org.
- Correction : les anciens fichiers de langue portaient un préfixe de nom incorrect (mairie-reservation-.po au lieu de mairie-reservation-de-salles-.po), ce qui les rendait invisibles pour WordPress même s’ils avaient été compilés. Supprimés et remplacés.
- Technique : réactivation de load_plugin_textdomain() (nécessaire tant que le plugin n’est pas hébergé sur WordPress.org avec traductions approuvées via GlotPress ; sera automatiquement supplanté par le language pack officiel une fois disponible).
- .pot mis à jour (759 chaînes uniques, en anglais).
1.6.10
- i18n : audit complet de tous les appels de traduction du plugin (798 chaînes) — text-domain vérifié systématiquement correct sur chaque appel, tous les sprintf()/printf() à placeholder(s) confirmés pourvus d’un commentaire “translators:”.
- Correction : un fragment de message d’erreur (détail du conflit de créneau) était écrit en dur en français, jamais passé par __() — il est désormais traduisible, avec commentaire translators.
- Ajout : fichier modèle languages/mairie-reservation-de-salles.pot généré à partir des 798 chaînes traduisibles du plugin, conforme au format attendu par WordPress.org / GlotPress.
1.6.9
- Correction : le bouton « 🔁 Récurrence » restait affiché sur une réservation annulée ou refusée issue d’une récurrence, permettant d’ouvrir à tort le formulaire de modification. Il n’apparaît désormais que sur une occurrence encore active (en attente, validée, confirmée) — les autres occurrences actives du même groupe de récurrence conservent normalement leur propre bouton.
1.6.8
- Correction : dans le formulaire « Nouvelle réservation », le bloc manifestation (case « Afficher dans le calendrier des manifestations » + case « Inclure dans les liens à partager », visible pour le demandeur MAIRIE) pouvait se placer de façon incohérente dans la grille flexible du formulaire — même cause que le bug corrigé en 1.6.7 sur « Bloquer un créneau ». Il est désormais regroupé sur sa propre ligne pleine largeur.
- Nouveauté : le champ « Type » (Réservation ordinaire / Manifestation) est remplacé par une case à cocher « Afficher dans le calendrier des manifestations », visuellement identique à celle de « Bloquer un créneau », pour les demandeurs Association et MAIRIE.
- Confirmé : l’option de demandeur est déjà « MAIRIE » (et non « Autre / Mairie ») ; si l’ancien libellé apparaît encore côté navigateur, un rafraîchissement du cache (Ctrl+Maj+R) résout l’affichage.
1.6.7
- Correction : dans le formulaire « Bloquer un créneau », les cases « Afficher dans le calendrier des manifestations » et « Inclure dans les liens à partager » se plaçaient parfois de façon incohérente (repli automatique dans la grille flexible du formulaire). Elles sont désormais toujours affichées l’une sous l’autre, dans cet ordre, sur leur propre ligne.
- Nouveauté : dans le widget public et le flux calendrier, un créneau visible uniquement via « Liens à partager » (sans être marqué « manifestation ») affiche désormais un badge « Info » et une couleur de date neutre (gris), pour le distinguer visuellement des véritables manifestations. Le flux .ics porte la même distinction via une catégorie (« Manifestation » / « Information »).
1.6.6
- Correction : dans la liste des réservations, le bouton « Marquer manifestation » rendait automatiquement la réservation publique (visible dans le widget + flux calendrier). Ce n’est plus le cas — marquer une réservation « manifestation » ne modifie plus sa visibilité publique, qui reste un réglage manuel et distinct.
- Nouveauté : le bouton de visibilité publique (🌐 Publique / 🔒 Masquée) est maintenant disponible sur toute réservation active éligible (association, association connue, admin), qu’elle soit ou non déjà marquée « manifestation » — les deux réglages sont désormais indépendants partout dans l’administration, comme dans le formulaire « Bloquer un créneau ».
1.6.5
- Correction : cocher uniquement « Inclure dans les liens à partager » n’affiche plus le créneau comme manifestation dans les listes et exports internes — les deux réglages sont désormais entièrement indépendants au niveau de la base de données, pas seulement dans le formulaire.
- Technique : le widget public et le flux calendrier ne filtrent plus que sur « visible sur le widget public » ; le tag « manifestation » ne sert plus qu’au classement interne (listes, exports PDF).
- Sécurité : la colonne « visible sur le widget public » passe de DEFAULT 1 à DEFAULT 0 — aucune réservation n’est publique par défaut. Les 4 points de création de réservation (formulaire public, récurrence, espace association, blocage de créneau) fixent désormais explicitement cette valeur à 0 sauf choix contraire de l’agent.
1.6.4
- Correction : dans le formulaire « Bloquer un créneau », les cases « Afficher dans le calendrier des manifestations » et « Inclure dans les liens à partager » sont désormais totalement indépendantes — cocher l’une, l’autre, ou les deux, dans n’importe quelle combinaison. Auparavant, décocher la première masquait la seconde et empêchait de la choisir.
- Précision technique : le widget public et le flux calendrier n’affichant que les créneaux marqués « manifestation », cocher uniquement « Inclure dans les liens à partager » marque désormais aussi le créneau comme manifestation en interne (sinon ce choix n’aurait aucun effet visible).
1.6.3
- Correction : le bouton « Marquer manifestation » (et le bouton de visibilité publique) n’apparaît plus sur les réservations annulées, refusées ou bloquées dans la liste des réservations — il n’était visible que pour les statuts actifs (en attente, validé, confirmé).
- Nouveauté : le formulaire « Bloquer un créneau » permet désormais de choisir, au moment de la création, si le créneau doit être affiché dans le calendrier des manifestations et/ou inclus dans les liens à partager (widget embarquable + flux calendrier).
1.6.2
- Sécurité (conformité WordPress.org) : les chaînes traduites concaténées directement dans le HTML retourné par le shortcode principal (
shortcode.php, branche d’accès bloqué — liens « Se connecter » / « Créer un compte ») sont désormais échappées avecesc_html__()au lieu de__(). - Audit : vérification exhaustive de tous les shortcodes du plugin (5 fichiers, 7 shortcodes) — les autres retours passent déjà par
ob_get_clean()avec un échappement correct à l’intérieur du template ; aucune autre régression trouvée.
1.6.1
- Sécurité (conformité WordPress.org — mêmes corrections que 1.5.15/1.5.16) : vérification de nonce sur toutes les navigations GET de l’administration (vue annuelle, calendrier mensuel, statistiques, export PDF, filtres de la liste des réservations) — sans nonce valide, retour aux valeurs par défaut sûres.
- Sécurité : le statut du filtre de la liste est validé contre la liste fermée des valeurs connues ; années bornées 2000-2100, mois bornés 1-12.
- Sécurité : la requête de la liste des réservations et celle de l’export PDF multi-salles sont désormais entièrement littérales (plus de clause WHERE ni de placeholders construits dynamiquement).
- Sécurité : les tableaux $_FILES (import de sauvegarde, règlements PDF) sont sanitizés champ par champ (sanitize_file_name, sanitize_mime_type, casts entiers), avec vérification is_uploaded_file() et contrôle d’extension.
- Sécurité : les chaînes JSON reçues en POST sont sanitizées avant décodage ; le matériel demandé est reconstruit champ par champ côté serveur (id/quantite castés, nom/icône/caution repris depuis la base — le JSON brut n’est plus jamais réencodé tel quel).
- Sécurité : les requêtes ALTER de migration sont des littéraux SQL complets figés dans le code, seule la table passe par le placeholder %i.
- Sécurité : les messages de confirmation post-redirection (salles, matériel, associations) sont protégés par nonce.
- Technique : le chargement de Chart.js utilise le paramètre $hook officiel de admin_enqueue_scripts (plus aucune lecture de superglobale).
- Technique : « Requires at least » passe à WordPress 6.2 (placeholder %i de $wpdb->prepare()).
1.6.0
- ⚠️ CHANGEMENT IMPORTANT (conformité WordPress.org) : tous les shortcodes sont désormais préfixés
mrds_pour éviter tout conflit avec d’autres extensions. Si vous utilisiez déjà [reservation_salle], [reservation_sans_salles], [reservation_salle_directe], [calendrier_salle], [calendrier_simple], [salles_cartes] ou [salles_disponibilites] sur une page, remplacez-les respectivement par [mrds_reservation_salle], [mrds_reservation_sans_salles], [mrds_reservation_salle_directe], [mrds_calendrier_salle], [mrds_calendrier_simple], [mrds_salles_cartes], [mrds_salles_disponibilites]. Il n’y a pas d’alias de compatibilité automatique. - Sécurité (conformité WordPress.org) : la restauration de sauvegarde utilise désormais une liste blanche stricte des options réellement utilisées par le plugin, plutôt qu’un simple test de préfixe.
- Nouveau : type « Salle » ou « Lieu » par endroit (plan d’eau, bibliothèque, terrain…), avec badges visuels.
- Nouveau : trois réglages indépendants par endroit — actif, visible sur le formulaire public, réservable par les associations.
- Nouveau : autorisations fines par lieu — choix des associations précises ayant le droit de le réserver, affichage en lecture seule sur la fiche association.
- Nouveau : capacité « voir tous les lieux masqués côté public », cochable par rôle (en plus de l’accès automatique pour les agents).
- Nouveau : lien entre une association et un compte WordPress (garde d’unicité : un compte = une association).
- Nouveau : espace « Mes réservations » pour les associations connectées — création de réservations, modification de la date uniquement (l’annulation reste réservée à la mairie, choix RGPD), cloisonnement strict par association.
- Nouveau : impression / export des réservations depuis l’espace association (filtre période + statut, format liste ou calendrier, portrait/paysage).
- Nouveau : couleurs de fond configurables par type (Salle / Lieu), appliquées de façon cohérente sur la gestion des salles, le calendrier mensuel, la vue annuelle, le formulaire public et le shortcode [mrds_salles_cartes].
- Nouveau : export PDF — choix de l’orientation (portrait par défaut, paysage en option) et option « une page par salle » pour l’export multi-salles, chaque salle avec son propre en-tête/pied de page.
- Nouveau : widget public des manifestations — page HTML embarquable en iframe sur un autre site, et flux calendrier .ics pour abonnement (Google Calendar, Outlook, Apple Calendar). Activation globale dans Paramètres, visibilité réglable manifestation par manifestation.
- Amélioration : export PDF — renforcement des sauts de page pour garantir qu’un calendrier mensuel n’est jamais coupé entre deux feuilles.
- Correction : badges (Active, Lieu, Masqué public, Assos) repositionnés sous le nom de la salle pour ne plus déborder des cartes de gestion.
1.5.8
- Conformité revue WordPress.org : préfixe unique « mrds_ » sur toutes les fonctions, constantes, options, hooks AJAX et capacités (migration automatique des données existantes).
- Sécurité : l’import de sauvegarde ne peut plus écraser que les options du plugin (préfixe), jamais des options WordPress arbitraires.
- Permissions : pages Réservations / Calendrier / Vue annuelle protégées par capacité (plus seulement « read »).
1.5.7
- Manifestations : marquage d’une réservation comme « Manifestation » et nouvel export « Calendrier des manifestations » de l’année (liste par mois ou calendrier visuel 12 mois).
- Récurrences : nouvelles options « ne pas réserver pendant les vacances scolaires » et « ignorer les jours fériés » (l’association reprend après la coupure, le nombre d’occurrences est respecté).
- Vacances scolaires : sélection de zone (A/B/C) et couleur de surlignage dans Identité mairie, report sur les calendriers exportés.
- Impression : option « Toutes les salles » (présentation empilée ou grille par jour), par mois ou par année.
- Édition d’une récurrence avec propagation aux dates à venir.
- Jours fériés et dimanches grisés à l’impression.
1.5.6
- Version de validation pour la soumission au répertoire WordPress.org (revue de conformité).
- Aucune nouvelle fonctionnalité : reprend l’ensemble des corrections de la 1.5.5 (enqueue des scripts/styles, wp_json_encode, Chart.js 4.5.1, sécurité).
1.5.5
- Conformité revue WordPress.org : tous les blocs / inline migrés vers wp_enqueue_script / wp_enqueue_style / wp_add_inline_script / wp_add_inline_style.
- Données dynamiques passées au JS via variables (wp_json_encode) au lieu de PHP interpolé dans le JavaScript.
- json_encode remplacé par wp_json_encode partout (sortie et stockage).
- Bibliothèque Chart.js mise à jour de 4.4.1 vers 4.5.1.
- Renforcements de sécurité (nonces sanitizés, sorties échappées, text domain unifié).
1.5.4
- New “Town hall identity” page: contact details, mayor, and a variable number of deputies and councillors
- PDF “All months” export now starts with a cover page (town hall name, room, year, elected officials, contact details)
1.5.3
- PDF export: new “All months” mode – one detailed page per month (12 pages) in a single print job
- PDF export options now stacked vertically for better readability
- Input handling hardening (wp_unslash and sanitization on form data)
1.5.2
- Granular permission system: capabilities with role presets (Mayor, Deputy, Agent, Secretary)
- PDF calendar export module (monthly and yearly views)
- Compatibility and security hardening for WordPress.org review (output escaping, file handling, local script bundling)
1.5.1
- Fixed validation of known associations (contact details retrieved from the database)
- Fixed progress bar synchronization when clicking from the calendar
- Removed scroll jump when moving from calendar to form
- Visual grouping of multi-date bookings in the admin list
- Cascading actions on groups (validate/refuse/cancel several dates in one click)
- Admin menu: All reservations moved back to first position
- Advanced statistics page with charts
- Permanent deletion of a reservation (admin only)
- Cancel button on every step of the form
- Explicit error message with the ID of the conflicting reservation
- Null safety for PHP 8.1+
1.5.0
- Email templates page – fully editable templates
- Rules document page – global or per-room PDF upload
- Manager fields (first name, last name) on associations
- Hidden contact details for known associations
