{"id":324892,"date":"2026-08-09T18:37:49","date_gmt":"2026-08-09T18:37:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mairie-reservation-de-salles\/"},"modified":"2026-08-17T11:20:51","modified_gmt":"2026-08-17T11:20:51","slug":"mairie-reservation-de-salles","status":"publish","type":"plugin","link":"https:\/\/test.wordpress.org\/plugins\/mairie-reservation-de-salles\/","author":14842865,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.7.1","stable_tag":"1.7.1","tested":"7.0.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Mairie R\u00e9servation de Salles","header_author":"Verturin","header_description":"Syst\u00e8me complet de r\u00e9servation de salles pour la mairie. R\u00e9servation \u00e0 l'heure, demi-journ\u00e9e ou journ\u00e9e. Validation par administrateur.","assets_banners_color":"325374","last_updated":"2026-08-17 11:20:51","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/mairie-reservation-de-salles\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":160,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.17":{"tag":"1.5.17","author":"verturin","date":"2026-08-09 18:37:14"},"1.6.10":{"tag":"1.6.10","author":"verturin","date":"2026-08-14 19:14:35"},"1.7.1":{"tag":"1.7.1","author":"verturin","date":"2026-08-17 11:20:51"}},"upgrade_notice":{"1.5.4":"<p>Adds a Town hall identity page (mayor, deputies, councillors) and a cover page for the annual PDF export.<\/p>","1.5.3":"<p>Adds an &quot;All months&quot; PDF export (one page per month) and minor input-handling improvements.<\/p>","1.5.2":"<p>Security and compatibility update prepared for the WordPress.org Plugin Directory. Recommended for all users.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3640909,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3639778,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3639778,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3640909,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.17","1.6.10","1.7.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Public calendar with multi-date selection","2":"Multi-step booking form","3":"Reservation list in the admin with filters","4":"Twelve-month yearly view","5":"Email template editor","6":"Advanced statistics with charts"}},"plugin_section":[],"plugin_tags":[269,416,722,12062,274922],"plugin_category":[40],"plugin_contributors":[95508],"plugin_business_model":[],"class_list":["post-324892","plugin","type-plugin","status-publish","hentry","plugin_tags-booking","plugin_tags-calendar","plugin_tags-reservation","plugin_tags-room","plugin_tags-town-hall","plugin_category-calendar-and-events","plugin_contributors-verturin","plugin_committers-verturin"],"banners":{"banner":"https:\/\/ps.w.org\/mairie-reservation-de-salles\/assets\/banner-772x250.png?rev=3640909","banner_2x":"https:\/\/ps.w.org\/mairie-reservation-de-salles\/assets\/banner-1544x500.png?rev=3639778","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/mairie-reservation-de-salles\/assets\/icon-128x128.png?rev=3640909","icon_2x":"https:\/\/ps.w.org\/mairie-reservation-de-salles\/assets\/icon-256x256.png?rev=3639778","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Mairie Reservation de Salles<\/strong> 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.<\/p>\n\n<p>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.<\/p>\n\n<h4>For citizens<\/h4>\n\n<ul>\n<li>Check availability online, on desktop or mobile<\/li>\n<li>Select multiple dates in one click on the calendar<\/li>\n<li>Four-step form: time slot, equipment, information, confirmation<\/li>\n<li>Automatic confirmation email for the request<\/li>\n<li>Choose between individual, association, or local association<\/li>\n<\/ul>\n\n<h4>For town hall staff<\/h4>\n\n<ul>\n<li>Complete dashboard with multiple menus inside WordPress<\/li>\n<li>Filtering and search of requests<\/li>\n<li>Validation, refusal, cancellation, and deposit payment tracking<\/li>\n<li>Twelve-month yearly view with color coding<\/li>\n<li>Detailed monthly calendar per room<\/li>\n<li>Block a time slot for internal use (council meeting, maintenance, etc.)<\/li>\n<li>Management of local associations with a configurable deposit discount<\/li>\n<li>Global and per-room equipment catalog with real-time stock checking<\/li>\n<li>Fully editable email templates<\/li>\n<li>PDF rules document automatically attached to emails<\/li>\n<li>One-click JSON backup and restore<\/li>\n<li>Advanced statistics with charts (bookings per month, per room, occupancy rate)<\/li>\n<li>Granular permission system with role presets (Mayor, Deputy, Agent, Secretary)<\/li>\n<li>PDF calendar export (monthly and yearly views)<\/li>\n<li>Optional anti-bot protection via Cloudflare Turnstile<\/li>\n<\/ul>\n\n<h4>Available shortcodes<\/h4>\n\n<ul>\n<li><code>[mrds_reservation_salle]<\/code> - Full multi-step booking form<\/li>\n<li><code>[mrds_reservation_salle_directe salle=\"slug\"]<\/code> - Form with a pre-selected room<\/li>\n<li><code>[mrds_reservation_sans_salles]<\/code> - Companion form for the calendar<\/li>\n<li><code>[mrds_calendrier_salle]<\/code> - Interactive multi-date calendar<\/li>\n<li><code>[mrds_salles_disponibilites]<\/code> - Room presentation cards<\/li>\n<\/ul>\n\n<h4>External services<\/h4>\n\n<p>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\/).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Download the plugin ZIP file<\/li>\n<li>In WordPress: Plugins &gt; Add New &gt; Upload Plugin<\/li>\n<li>Select the ZIP and click Install<\/li>\n<li>Activate the plugin<\/li>\n<li>Go to Reservations &gt; Rooms to configure your rooms<\/li>\n<li>Add the shortcode <code>[mrds_reservation_salle]<\/code> or <code>[mrds_calendrier_salle]<\/code> to a page<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20the%20plugin%20compatible%20with%20my%20theme%3F\"><h3>Is the plugin compatible with my theme?<\/h3><\/dt>\n<dd><p>Yes. The plugin uses standard WordPress shortcodes and works with any standards-compliant theme. No theme modification is required.<\/p><\/dd>\n<dt id=\"how%20many%20rooms%20can%20i%20manage%3F\"><h3>How many rooms can I manage?<\/h3><\/dt>\n<dd><p>There is no limit. You can manage one or dozens of rooms, each with its own opening hours, capacity, deposit, and equipment.<\/p><\/dd>\n<dt id=\"how%20does%20the%20double-booking%20check%20work%3F\"><h3>How does the double-booking check work?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"are%20the%20emails%20customizable%3F\"><h3>Are the emails customizable?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20attach%20a%20rules%20document%20to%20the%20emails%3F\"><h3>Can I attach a rules document to the emails?<\/h3><\/dt>\n<dd><p>Yes. Upload a PDF in Reservations &gt; Rules. You can have one global document or a specific document per room. It is attached automatically to the configured emails.<\/p><\/dd>\n<dt id=\"how%20can%20i%20protect%20the%20form%20from%20bots%3F\"><h3>How can I protect the form from bots?<\/h3><\/dt>\n<dd><p>The plugin integrates Cloudflare Turnstile (free). Create your keys on the Cloudflare dashboard, paste them into the settings, and the form is protected immediately.<\/p><\/dd>\n<dt id=\"which%20php%20versions%20are%20supported%3F\"><h3>Which PHP versions are supported?<\/h3><\/dt>\n<dd><p>The plugin requires PHP 7.4 or higher and has been tested up to PHP 8.3.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Correction : l'URL du plugin dans l'en-t\u00eate pointait vers un slug obsol\u00e8te (mairie-reservation) au lieu du slug r\u00e9el (mairie-reservation-de-salles).<\/li>\n<li>Audit complet de l'extension : v\u00e9rification que chaque require_once a son fichier, que les 40 callbacks de hooks et les 14 handlers AJAX pointent vers des fonctions existantes, coh\u00e9rence des 103 requ\u00eates pr\u00e9par\u00e9es, des 1201 appels de traduction et des scripts localis\u00e9s. Chargement du plugin simul\u00e9 de bout en bout (46 hooks, 13 pages admin, 7 shortcodes) sans erreur ni avertissement.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>i18n : les 797 cha\u00eenes source du plugin sont d\u00e9sormais \u00e9crites en anglais (au lieu du fran\u00e7ais), conform\u00e9ment \u00e0 la convention WordPress.org. Le fran\u00e7ais redevient une traduction comme les autres, fournie via un fichier .mo bundl\u00e9 (au lieu d'\u00eatre la langue de repli implicite du code).<\/li>\n<li>Remplacement effectu\u00e9 uniquement \u00e0 l'int\u00e9rieur des appels de traduction (__, _e, esc_html__, esc_html_e, esc_attr__, esc_attr_e, _n) \u2014 noms de fonctions, shortcodes, capacit\u00e9s, valeurs de statut en base, et le nom du plugin lui-m\u00eame n'ont pas \u00e9t\u00e9 touch\u00e9s.<\/li>\n<li>Ajout : languages\/mairie-reservation-de-salles-fr_FR.po + .mo (775 cha\u00eenes, compil\u00e9 avec msgfmt, test\u00e9 sans erreur) pour un affichage en fran\u00e7ais imm\u00e9diat sur un site de test, en attendant la prise en charge par translate.wordpress.org.<\/li>\n<li>Correction : les anciens fichiers de langue portaient un pr\u00e9fixe de nom incorrect (mairie-reservation-<em>.po au lieu de mairie-reservation-de-salles-<\/em>.po), ce qui les rendait invisibles pour WordPress m\u00eame s'ils avaient \u00e9t\u00e9 compil\u00e9s. Supprim\u00e9s et remplac\u00e9s.<\/li>\n<li>Technique : r\u00e9activation de load_plugin_textdomain() (n\u00e9cessaire tant que le plugin n'est pas h\u00e9berg\u00e9 sur WordPress.org avec traductions approuv\u00e9es via GlotPress ; sera automatiquement supplant\u00e9 par le language pack officiel une fois disponible).<\/li>\n<li>.pot mis \u00e0 jour (759 cha\u00eenes uniques, en anglais).<\/li>\n<\/ul>\n\n<h4>1.6.10<\/h4>\n\n<ul>\n<li>i18n : audit complet de tous les appels de traduction du plugin (798 cha\u00eenes) \u2014 text-domain v\u00e9rifi\u00e9 syst\u00e9matiquement correct sur chaque appel, tous les sprintf()\/printf() \u00e0 placeholder(s) confirm\u00e9s pourvus d'un commentaire \"translators:\".<\/li>\n<li>Correction : un fragment de message d'erreur (d\u00e9tail du conflit de cr\u00e9neau) \u00e9tait \u00e9crit en dur en fran\u00e7ais, jamais pass\u00e9 par __() \u2014 il est d\u00e9sormais traduisible, avec commentaire translators.<\/li>\n<li>Ajout : fichier mod\u00e8le languages\/mairie-reservation-de-salles.pot g\u00e9n\u00e9r\u00e9 \u00e0 partir des 798 cha\u00eenes traduisibles du plugin, conforme au format attendu par WordPress.org \/ GlotPress.<\/li>\n<\/ul>\n\n<h4>1.6.9<\/h4>\n\n<ul>\n<li>Correction : le bouton \u00ab \ud83d\udd01 R\u00e9currence \u00bb restait affich\u00e9 sur une r\u00e9servation annul\u00e9e ou refus\u00e9e issue d'une r\u00e9currence, permettant d'ouvrir \u00e0 tort le formulaire de modification. Il n'appara\u00eet d\u00e9sormais que sur une occurrence encore active (en attente, valid\u00e9e, confirm\u00e9e) \u2014 les autres occurrences actives du m\u00eame groupe de r\u00e9currence conservent normalement leur propre bouton.<\/li>\n<\/ul>\n\n<h4>1.6.8<\/h4>\n\n<ul>\n<li>Correction : dans le formulaire \u00ab Nouvelle r\u00e9servation \u00bb, le bloc manifestation (case \u00ab Afficher dans le calendrier des manifestations \u00bb + case \u00ab Inclure dans les liens \u00e0 partager \u00bb, visible pour le demandeur MAIRIE) pouvait se placer de fa\u00e7on incoh\u00e9rente dans la grille flexible du formulaire \u2014 m\u00eame cause que le bug corrig\u00e9 en 1.6.7 sur \u00ab Bloquer un cr\u00e9neau \u00bb. Il est d\u00e9sormais regroup\u00e9 sur sa propre ligne pleine largeur.<\/li>\n<li>Nouveaut\u00e9 : le champ \u00ab Type \u00bb (R\u00e9servation ordinaire \/ Manifestation) est remplac\u00e9 par une case \u00e0 cocher \u00ab Afficher dans le calendrier des manifestations \u00bb, visuellement identique \u00e0 celle de \u00ab Bloquer un cr\u00e9neau \u00bb, pour les demandeurs Association et MAIRIE.<\/li>\n<li>Confirm\u00e9 : l'option de demandeur est d\u00e9j\u00e0 \u00ab MAIRIE \u00bb (et non \u00ab Autre \/ Mairie \u00bb) ; si l'ancien libell\u00e9 appara\u00eet encore c\u00f4t\u00e9 navigateur, un rafra\u00eechissement du cache (Ctrl+Maj+R) r\u00e9sout l'affichage.<\/li>\n<\/ul>\n\n<h4>1.6.7<\/h4>\n\n<ul>\n<li>Correction : dans le formulaire \u00ab Bloquer un cr\u00e9neau \u00bb, les cases \u00ab Afficher dans le calendrier des manifestations \u00bb et \u00ab Inclure dans les liens \u00e0 partager \u00bb se pla\u00e7aient parfois de fa\u00e7on incoh\u00e9rente (repli automatique dans la grille flexible du formulaire). Elles sont d\u00e9sormais toujours affich\u00e9es l'une sous l'autre, dans cet ordre, sur leur propre ligne.<\/li>\n<li>Nouveaut\u00e9 : dans le widget public et le flux calendrier, un cr\u00e9neau visible uniquement via \u00ab Liens \u00e0 partager \u00bb (sans \u00eatre marqu\u00e9 \u00ab manifestation \u00bb) affiche d\u00e9sormais un badge \u00ab Info \u00bb et une couleur de date neutre (gris), pour le distinguer visuellement des v\u00e9ritables manifestations. Le flux .ics porte la m\u00eame distinction via une cat\u00e9gorie (\u00ab Manifestation \u00bb \/ \u00ab Information \u00bb).<\/li>\n<\/ul>\n\n<h4>1.6.6<\/h4>\n\n<ul>\n<li>Correction : dans la liste des r\u00e9servations, le bouton \u00ab Marquer manifestation \u00bb rendait automatiquement la r\u00e9servation publique (visible dans le widget + flux calendrier). Ce n'est plus le cas \u2014 marquer une r\u00e9servation \u00ab manifestation \u00bb ne modifie plus sa visibilit\u00e9 publique, qui reste un r\u00e9glage manuel et distinct.<\/li>\n<li>Nouveaut\u00e9 : le bouton de visibilit\u00e9 publique (\ud83c\udf10 Publique \/ \ud83d\udd12 Masqu\u00e9e) est maintenant disponible sur toute r\u00e9servation active \u00e9ligible (association, association connue, admin), qu'elle soit ou non d\u00e9j\u00e0 marqu\u00e9e \u00ab manifestation \u00bb \u2014 les deux r\u00e9glages sont d\u00e9sormais ind\u00e9pendants partout dans l'administration, comme dans le formulaire \u00ab Bloquer un cr\u00e9neau \u00bb.<\/li>\n<\/ul>\n\n<h4>1.6.5<\/h4>\n\n<ul>\n<li>Correction : cocher uniquement \u00ab Inclure dans les liens \u00e0 partager \u00bb n'affiche plus le cr\u00e9neau comme manifestation dans les listes et exports internes \u2014 les deux r\u00e9glages sont d\u00e9sormais enti\u00e8rement ind\u00e9pendants au niveau de la base de donn\u00e9es, pas seulement dans le formulaire.<\/li>\n<li>Technique : le widget public et le flux calendrier ne filtrent plus que sur \u00ab visible sur le widget public \u00bb ; le tag \u00ab manifestation \u00bb ne sert plus qu'au classement interne (listes, exports PDF).<\/li>\n<li>S\u00e9curit\u00e9 : la colonne \u00ab visible sur le widget public \u00bb passe de DEFAULT 1 \u00e0 DEFAULT 0 \u2014 aucune r\u00e9servation n'est publique par d\u00e9faut. Les 4 points de cr\u00e9ation de r\u00e9servation (formulaire public, r\u00e9currence, espace association, blocage de cr\u00e9neau) fixent d\u00e9sormais explicitement cette valeur \u00e0 0 sauf choix contraire de l'agent.<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Correction : dans le formulaire \u00ab Bloquer un cr\u00e9neau \u00bb, les cases \u00ab Afficher dans le calendrier des manifestations \u00bb et \u00ab Inclure dans les liens \u00e0 partager \u00bb sont d\u00e9sormais totalement ind\u00e9pendantes \u2014 cocher l'une, l'autre, ou les deux, dans n'importe quelle combinaison. Auparavant, d\u00e9cocher la premi\u00e8re masquait la seconde et emp\u00eachait de la choisir.<\/li>\n<li>Pr\u00e9cision technique : le widget public et le flux calendrier n'affichant que les cr\u00e9neaux marqu\u00e9s \u00ab manifestation \u00bb, cocher uniquement \u00ab Inclure dans les liens \u00e0 partager \u00bb marque d\u00e9sormais aussi le cr\u00e9neau comme manifestation en interne (sinon ce choix n'aurait aucun effet visible).<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Correction : le bouton \u00ab Marquer manifestation \u00bb (et le bouton de visibilit\u00e9 publique) n'appara\u00eet plus sur les r\u00e9servations annul\u00e9es, refus\u00e9es ou bloqu\u00e9es dans la liste des r\u00e9servations \u2014 il n'\u00e9tait visible que pour les statuts actifs (en attente, valid\u00e9, confirm\u00e9).<\/li>\n<li>Nouveaut\u00e9 : le formulaire \u00ab Bloquer un cr\u00e9neau \u00bb permet d\u00e9sormais de choisir, au moment de la cr\u00e9ation, si le cr\u00e9neau doit \u00eatre affich\u00e9 dans le calendrier des manifestations et\/ou inclus dans les liens \u00e0 partager (widget embarquable + flux calendrier).<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>S\u00e9curit\u00e9 (conformit\u00e9 WordPress.org) : les cha\u00eenes traduites concat\u00e9n\u00e9es directement dans le HTML retourn\u00e9 par le shortcode principal (<code>shortcode.php<\/code>, branche d'acc\u00e8s bloqu\u00e9 \u2014 liens \u00ab Se connecter \u00bb \/ \u00ab Cr\u00e9er un compte \u00bb) sont d\u00e9sormais \u00e9chapp\u00e9es avec <code>esc_html__()<\/code> au lieu de <code>__()<\/code>.<\/li>\n<li>Audit : v\u00e9rification exhaustive de tous les shortcodes du plugin (5 fichiers, 7 shortcodes) \u2014 les autres retours passent d\u00e9j\u00e0 par <code>ob_get_clean()<\/code> avec un \u00e9chappement correct \u00e0 l'int\u00e9rieur du template ; aucune autre r\u00e9gression trouv\u00e9e.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>S\u00e9curit\u00e9 (conformit\u00e9 WordPress.org \u2014 m\u00eames corrections que 1.5.15\/1.5.16) : v\u00e9rification de nonce sur toutes les navigations GET de l'administration (vue annuelle, calendrier mensuel, statistiques, export PDF, filtres de la liste des r\u00e9servations) \u2014 sans nonce valide, retour aux valeurs par d\u00e9faut s\u00fbres.<\/li>\n<li>S\u00e9curit\u00e9 : le statut du filtre de la liste est valid\u00e9 contre la liste ferm\u00e9e des valeurs connues ; ann\u00e9es born\u00e9es 2000-2100, mois born\u00e9s 1-12.<\/li>\n<li>S\u00e9curit\u00e9 : la requ\u00eate de la liste des r\u00e9servations et celle de l'export PDF multi-salles sont d\u00e9sormais enti\u00e8rement litt\u00e9rales (plus de clause WHERE ni de placeholders construits dynamiquement).<\/li>\n<li>S\u00e9curit\u00e9 : les tableaux $_FILES (import de sauvegarde, r\u00e8glements PDF) sont sanitiz\u00e9s champ par champ (sanitize_file_name, sanitize_mime_type, casts entiers), avec v\u00e9rification is_uploaded_file() et contr\u00f4le d'extension.<\/li>\n<li>S\u00e9curit\u00e9 : les cha\u00eenes JSON re\u00e7ues en POST sont sanitiz\u00e9es avant d\u00e9codage ; le mat\u00e9riel demand\u00e9 est reconstruit champ par champ c\u00f4t\u00e9 serveur (id\/quantite cast\u00e9s, nom\/ic\u00f4ne\/caution repris depuis la base \u2014 le JSON brut n'est plus jamais r\u00e9encod\u00e9 tel quel).<\/li>\n<li>S\u00e9curit\u00e9 : les requ\u00eates ALTER de migration sont des litt\u00e9raux SQL complets fig\u00e9s dans le code, seule la table passe par le placeholder %i.<\/li>\n<li>S\u00e9curit\u00e9 : les messages de confirmation post-redirection (salles, mat\u00e9riel, associations) sont prot\u00e9g\u00e9s par nonce.<\/li>\n<li>Technique : le chargement de Chart.js utilise le param\u00e8tre $hook officiel de admin_enqueue_scripts (plus aucune lecture de superglobale).<\/li>\n<li>Technique : \u00ab Requires at least \u00bb passe \u00e0 WordPress 6.2 (placeholder %i de $wpdb-&gt;prepare()).<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>\u26a0\ufe0f CHANGEMENT IMPORTANT (conformit\u00e9 WordPress.org) : tous les shortcodes sont d\u00e9sormais pr\u00e9fix\u00e9s <code>mrds_<\/code> pour \u00e9viter tout conflit avec d'autres extensions. Si vous utilisiez d\u00e9j\u00e0 [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\u00e9 automatique.<\/li>\n<li>S\u00e9curit\u00e9 (conformit\u00e9 WordPress.org) : la restauration de sauvegarde utilise d\u00e9sormais une liste blanche stricte des options r\u00e9ellement utilis\u00e9es par le plugin, plut\u00f4t qu'un simple test de pr\u00e9fixe.<\/li>\n<li>Nouveau : type \u00ab Salle \u00bb ou \u00ab Lieu \u00bb par endroit (plan d'eau, biblioth\u00e8que, terrain\u2026), avec badges visuels.<\/li>\n<li>Nouveau : trois r\u00e9glages ind\u00e9pendants par endroit \u2014 actif, visible sur le formulaire public, r\u00e9servable par les associations.<\/li>\n<li>Nouveau : autorisations fines par lieu \u2014 choix des associations pr\u00e9cises ayant le droit de le r\u00e9server, affichage en lecture seule sur la fiche association.<\/li>\n<li>Nouveau : capacit\u00e9 \u00ab voir tous les lieux masqu\u00e9s c\u00f4t\u00e9 public \u00bb, cochable par r\u00f4le (en plus de l'acc\u00e8s automatique pour les agents).<\/li>\n<li>Nouveau : lien entre une association et un compte WordPress (garde d'unicit\u00e9 : un compte = une association).<\/li>\n<li>Nouveau : espace \u00ab Mes r\u00e9servations \u00bb pour les associations connect\u00e9es \u2014 cr\u00e9ation de r\u00e9servations, modification de la date uniquement (l'annulation reste r\u00e9serv\u00e9e \u00e0 la mairie, choix RGPD), cloisonnement strict par association.<\/li>\n<li>Nouveau : impression \/ export des r\u00e9servations depuis l'espace association (filtre p\u00e9riode + statut, format liste ou calendrier, portrait\/paysage).<\/li>\n<li>Nouveau : couleurs de fond configurables par type (Salle \/ Lieu), appliqu\u00e9es de fa\u00e7on coh\u00e9rente sur la gestion des salles, le calendrier mensuel, la vue annuelle, le formulaire public et le shortcode [mrds_salles_cartes].<\/li>\n<li>Nouveau : export PDF \u2014 choix de l'orientation (portrait par d\u00e9faut, paysage en option) et option \u00ab une page par salle \u00bb pour l'export multi-salles, chaque salle avec son propre en-t\u00eate\/pied de page.<\/li>\n<li>Nouveau : widget public des manifestations \u2014 page HTML embarquable en iframe sur un autre site, et flux calendrier .ics pour abonnement (Google Calendar, Outlook, Apple Calendar). Activation globale dans Param\u00e8tres, visibilit\u00e9 r\u00e9glable manifestation par manifestation.<\/li>\n<li>Am\u00e9lioration : export PDF \u2014 renforcement des sauts de page pour garantir qu'un calendrier mensuel n'est jamais coup\u00e9 entre deux feuilles.<\/li>\n<li>Correction : badges (Active, Lieu, Masqu\u00e9 public, Assos) repositionn\u00e9s sous le nom de la salle pour ne plus d\u00e9border des cartes de gestion.<\/li>\n<\/ul>\n\n<h4>1.5.8<\/h4>\n\n<ul>\n<li>Conformit\u00e9 revue WordPress.org : pr\u00e9fixe unique \u00ab mrds_ \u00bb sur toutes les fonctions, constantes, options, hooks AJAX et capacit\u00e9s (migration automatique des donn\u00e9es existantes).<\/li>\n<li>S\u00e9curit\u00e9 : l'import de sauvegarde ne peut plus \u00e9craser que les options du plugin (pr\u00e9fixe), jamais des options WordPress arbitraires.<\/li>\n<li>Permissions : pages R\u00e9servations \/ Calendrier \/ Vue annuelle prot\u00e9g\u00e9es par capacit\u00e9 (plus seulement \u00ab read \u00bb).<\/li>\n<\/ul>\n\n<h4>1.5.7<\/h4>\n\n<ul>\n<li>Manifestations : marquage d'une r\u00e9servation comme \u00ab Manifestation \u00bb et nouvel export \u00ab Calendrier des manifestations \u00bb de l'ann\u00e9e (liste par mois ou calendrier visuel 12 mois).<\/li>\n<li>R\u00e9currences : nouvelles options \u00ab ne pas r\u00e9server pendant les vacances scolaires \u00bb et \u00ab ignorer les jours f\u00e9ri\u00e9s \u00bb (l'association reprend apr\u00e8s la coupure, le nombre d'occurrences est respect\u00e9).<\/li>\n<li>Vacances scolaires : s\u00e9lection de zone (A\/B\/C) et couleur de surlignage dans Identit\u00e9 mairie, report sur les calendriers export\u00e9s.<\/li>\n<li>Impression : option \u00ab Toutes les salles \u00bb (pr\u00e9sentation empil\u00e9e ou grille par jour), par mois ou par ann\u00e9e.<\/li>\n<li>\u00c9dition d'une r\u00e9currence avec propagation aux dates \u00e0 venir.<\/li>\n<li>Jours f\u00e9ri\u00e9s et dimanches gris\u00e9s \u00e0 l'impression.<\/li>\n<\/ul>\n\n<h4>1.5.6<\/h4>\n\n<ul>\n<li>Version de validation pour la soumission au r\u00e9pertoire WordPress.org (revue de conformit\u00e9).<\/li>\n<li>Aucune nouvelle fonctionnalit\u00e9 : reprend l'ensemble des corrections de la 1.5.5 (enqueue des scripts\/styles, wp_json_encode, Chart.js 4.5.1, s\u00e9curit\u00e9).<\/li>\n<\/ul>\n\n<h4>1.5.5<\/h4>\n\n<ul>\n<li>Conformit\u00e9 revue WordPress.org : tous les blocs \/ inline migr\u00e9s vers wp_enqueue_script \/ wp_enqueue_style \/ wp_add_inline_script \/ wp_add_inline_style.<\/li>\n<li>Donn\u00e9es dynamiques pass\u00e9es au JS via variables (wp_json_encode) au lieu de PHP interpol\u00e9 dans le JavaScript.<\/li>\n<li>json_encode remplac\u00e9 par wp_json_encode partout (sortie et stockage).<\/li>\n<li>Biblioth\u00e8que Chart.js mise \u00e0 jour de 4.4.1 vers 4.5.1.<\/li>\n<li>Renforcements de s\u00e9curit\u00e9 (nonces sanitiz\u00e9s, sorties \u00e9chapp\u00e9es, text domain unifi\u00e9).<\/li>\n<\/ul>\n\n<h4>1.5.4<\/h4>\n\n<ul>\n<li>New \"Town hall identity\" page: contact details, mayor, and a variable number of deputies and councillors<\/li>\n<li>PDF \"All months\" export now starts with a cover page (town hall name, room, year, elected officials, contact details)<\/li>\n<\/ul>\n\n<h4>1.5.3<\/h4>\n\n<ul>\n<li>PDF export: new \"All months\" mode - one detailed page per month (12 pages) in a single print job<\/li>\n<li>PDF export options now stacked vertically for better readability<\/li>\n<li>Input handling hardening (wp_unslash and sanitization on form data)<\/li>\n<\/ul>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>Granular permission system: capabilities with role presets (Mayor, Deputy, Agent, Secretary)<\/li>\n<li>PDF calendar export module (monthly and yearly views)<\/li>\n<li>Compatibility and security hardening for WordPress.org review (output escaping, file handling, local script bundling)<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Fixed validation of known associations (contact details retrieved from the database)<\/li>\n<li>Fixed progress bar synchronization when clicking from the calendar<\/li>\n<li>Removed scroll jump when moving from calendar to form<\/li>\n<li>Visual grouping of multi-date bookings in the admin list<\/li>\n<li>Cascading actions on groups (validate\/refuse\/cancel several dates in one click)<\/li>\n<li>Admin menu: All reservations moved back to first position<\/li>\n<li>Advanced statistics page with charts<\/li>\n<li>Permanent deletion of a reservation (admin only)<\/li>\n<li>Cancel button on every step of the form<\/li>\n<li>Explicit error message with the ID of the conflicting reservation<\/li>\n<li>Null safety for PHP 8.1+<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Email templates page - fully editable templates<\/li>\n<li>Rules document page - global or per-room PDF upload<\/li>\n<li>Manager fields (first name, last name) on associations<\/li>\n<li>Hidden contact details for known associations<\/li>\n<\/ul>","raw_excerpt":"A complete room booking system for town halls: online calendar, agent validation, automated emails, and association management.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/324892","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=324892"}],"author":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/verturin"}],"wp:attachment":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=324892"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=324892"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=324892"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=324892"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=324892"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=324892"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}