{"id":125497,"date":"2020-07-28T06:01:00","date_gmt":"2020-07-28T06:01:00","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/occupancy-plan\/"},"modified":"2026-08-21T05:21:28","modified_gmt":"2026-08-21T05:21:28","slug":"occupancy-plan","status":"publish","type":"plugin","link":"https:\/\/cor.wordpress.org\/plugins\/occupancy-plan\/","author":18105416,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.6.0","stable_tag":"1.6.0","tested":"7.1","requires":"4.9","requires_php":"5.3","requires_plugins":null,"header_name":"Occupancy Plan","header_author":"Alexander Kunze Software Consulting","header_description":"Management of Occupancy Plans","assets_banners_color":"f7f7e7","last_updated":"2026-08-21 05:21:28","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.software-kunze.de\/","header_plugin_uri":"https:\/\/www.software-kunze.de\/plugins\/occupancy-plan\/","header_author_uri":"https:\/\/www.software-kunze.de","rating":5,"author_block_rating":0,"active_installs":100,"downloads":15080,"num_ratings":5,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"tharkun69","date":"2020-07-28 08:03:11"},"1.0.1":{"tag":"1.0.1","author":"tharkun69","date":"2020-07-30 09:32:59"},"1.0.10":{"tag":"1.0.10","author":"tharkun69","date":"2020-11-02 13:53:12"},"1.0.11":{"tag":"1.0.11","author":"tharkun69","date":"2020-11-28 15:06:29"},"1.0.12":{"tag":"1.0.12","author":"tharkun69","date":"2020-12-30 17:41:11"},"1.0.2":{"tag":"1.0.2","author":"tharkun69","date":"2020-07-30 15:05:05"},"1.0.3":{"tag":"1.0.3","author":"tharkun69","date":"2020-08-12 06:42:38"},"1.0.4":{"tag":"1.0.4","author":"tharkun69","date":"2020-08-12 08:15:48"},"1.0.5":{"tag":"1.0.5","author":"tharkun69","date":"2020-09-07 06:42:17"},"1.0.6":{"tag":"1.0.6","author":"tharkun69","date":"2020-10-25 06:53:29"},"1.0.7":{"tag":"1.0.7","author":"tharkun69","date":"2020-10-27 11:14:26"},"1.0.8":{"tag":"1.0.8","author":"tharkun69","date":"2020-10-28 07:07:31"},"1.0.9":{"tag":"1.0.9","author":"tharkun69","date":"2020-10-30 10:54:47"},"1.1":{"tag":"1.1","author":"tharkun69","date":"2020-12-30 17:37:37"},"1.1.0":{"tag":"1.1.0","author":"tharkun69","date":"2021-01-03 15:31:43"},"1.1.1":{"tag":"1.1.1","author":"tharkun69","date":"2021-02-04 14:00:58"},"1.1.2":{"tag":"1.1.2","author":"tharkun69","date":"2021-03-06 09:26:01"},"1.1.3":{"tag":"1.1.3","author":"tharkun69","date":"2021-04-10 14:00:28"},"1.1.4":{"tag":"1.1.4","author":"tharkun69","date":"2021-04-10 14:01:38"},"1.1.5":{"tag":"1.1.5","author":"tharkun69","date":"2021-06-27 16:49:13"},"1.1.6":{"tag":"1.1.6","author":"tharkun69","date":"2021-07-05 09:27:34"},"1.1.7":{"tag":"1.1.7","author":"tharkun69","date":"2021-07-09 16:13:16"},"1.2.1":{"tag":"1.2.1","author":"tharkun69","date":"2021-09-03 07:42:49"},"1.2.3":{"tag":"1.2.3","author":"tharkun69","date":"2022-01-13 15:26:44"},"1.2.4":{"tag":"1.2.4","author":"tharkun69","date":"2022-01-22 15:50:30"},"1.2.5":{"tag":"1.2.5","author":"tharkun69","date":"2022-01-22 16:21:22"},"1.2.6":{"tag":"1.2.6","author":"tharkun69","date":"2022-01-26 14:31:10"},"1.2.7":{"tag":"1.2.7","author":"tharkun69","date":"2022-02-07 06:58:11"},"1.2.8":{"tag":"1.2.8","author":"tharkun69","date":"2022-02-15 16:34:07"},"1.2.9":{"tag":"1.2.9","author":"tharkun69","date":"2022-03-09 07:19:50"},"1.3.0":{"tag":"1.3.0","author":"tharkun69","date":"2022-03-24 06:41:39"},"1.3.1":{"tag":"1.3.1","author":"tharkun69","date":"2022-05-02 08:12:27"},"1.3.10":{"tag":"1.3.10","author":"tharkun69","date":"2023-01-25 12:39:04"},"1.3.12":{"tag":"1.3.12","author":"tharkun69","date":"2023-03-14 16:28:21"},"1.3.13":{"tag":"1.3.13","author":"tharkun69","date":"2023-03-24 10:16:49"},"1.3.14":{"tag":"1.3.14","author":"tharkun69","date":"2023-04-14 09:28:49"},"1.3.15":{"tag":"1.3.15","author":"tharkun69","date":"2023-06-09 06:41:41"},"1.3.16":{"tag":"1.3.16","author":"tharkun69","date":"2023-08-18 15:47:02"},"1.3.17":{"tag":"1.3.17","author":"tharkun69","date":"2023-09-21 14:46:09"},"1.3.18":{"tag":"1.3.18","author":"tharkun69","date":"2023-09-26 06:54:54"},"1.3.19":{"tag":"1.3.19","author":"tharkun69","date":"2024-01-02 08:51:44"},"1.3.2":{"tag":"1.3.2","author":"tharkun69","date":"2022-05-23 06:00:53"},"1.3.20":{"tag":"1.3.20","author":"tharkun69","date":"2024-03-27 09:04:05"},"1.3.3":{"tag":"1.3.3","author":"tharkun69","date":"2022-07-11 06:59:28"},"1.3.4":{"tag":"1.3.4","author":"tharkun69","date":"2022-07-16 09:05:04"},"1.3.5":{"tag":"1.3.5","author":"tharkun69","date":"2022-09-02 08:50:13"},"1.3.6":{"tag":"1.3.6","author":"tharkun69","date":"2022-10-04 11:23:17"},"1.3.7":{"tag":"1.3.7","author":"tharkun69","date":"2022-10-04 14:13:39"},"1.3.8":{"tag":"1.3.8","author":"tharkun69","date":"2022-11-04 13:16:04"},"1.3.9":{"tag":"1.3.9","author":"tharkun69","date":"2023-01-17 17:07:42"},"1.4":{"tag":"1.4","author":"tharkun69","date":"2024-04-10 11:15:24"},"1.4.1":{"tag":"1.4.1","author":"tharkun69","date":"2024-04-11 09:44:32"},"1.4.10":{"tag":"1.4.10","author":"tharkun69","date":"2024-12-14 16:33:12"},"1.4.11":{"tag":"1.4.11","author":"tharkun69","date":"2025-05-12 06:14:26"},"1.4.12":{"tag":"1.4.12","author":"tharkun69","date":"2025-10-23 14:14:28"},"1.4.13":{"tag":"1.4.13","author":"tharkun69","date":"2025-11-19 08:16:07"},"1.4.14":{"tag":"1.4.14","author":"tharkun69","date":"2025-12-08 13:28:15"},"1.4.15":{"tag":"1.4.15","author":"tharkun69","date":"2025-12-18 11:50:45"},"1.4.16":{"tag":"1.4.16","author":"tharkun69","date":"2025-12-29 16:06:29"},"1.4.17":{"tag":"1.4.17","author":"tharkun69","date":"2026-02-16 15:58:05"},"1.4.18":{"tag":"1.4.18","author":"tharkun69","date":"2026-03-16 09:30:12"},"1.4.19":{"tag":"1.4.19","author":"tharkun69","date":"2026-04-07 16:01:27"},"1.4.2":{"tag":"1.4.2","author":"tharkun69","date":"2024-04-24 10:44:05"},"1.4.20":{"tag":"1.4.20","author":"tharkun69","date":"2026-07-03 14:45:52"},"1.4.3":{"tag":"1.4.3","author":"tharkun69","date":"2024-06-16 16:46:26"},"1.4.4":{"tag":"1.4.4","author":"tharkun69","date":"2024-06-18 08:56:50"},"1.4.5":{"tag":"1.4.5","author":"tharkun69","date":"2024-08-29 12:00:33"},"1.4.6":{"tag":"1.4.6","author":"tharkun69","date":"2024-11-27 07:53:34"},"1.4.7":{"tag":"1.4.7","author":"tharkun69","date":"2024-11-18 14:59:33"},"1.4.8":{"tag":"1.4.8","author":"tharkun69","date":"2024-11-27 07:54:20"},"1.4.9":{"tag":"1.4.9","author":"tharkun69","date":"2024-12-05 09:35:09"},"1.5":{"tag":"1.5","author":"tharkun69","date":"2026-07-21 05:06:50"},"1.5.7":{"tag":"1.5.7","author":"tharkun69","date":"2026-08-17 10:42:04"},"1.5.9":{"tag":"1.5.9","author":"tharkun69","date":"2026-08-19 06:26:10"},"1.6.0":{"tag":"1.6.0","author":"tharkun69","date":"2026-08-21 05:21:28"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":5},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":2347591,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":2347591,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.10","1.0.11","1.0.12","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.0.9","1.1","1.1.0","1.1.1","1.1.2","1.1.3","1.1.4","1.1.5","1.1.6","1.1.7","1.2.1","1.2.3","1.2.4","1.2.5","1.2.6","1.2.7","1.2.8","1.2.9","1.3.0","1.3.1","1.3.10","1.3.12","1.3.13","1.3.14","1.3.15","1.3.16","1.3.17","1.3.18","1.3.19","1.3.2","1.3.20","1.3.3","1.3.4","1.3.5","1.3.6","1.3.7","1.3.8","1.3.9","1.4","1.4.1","1.4.10","1.4.11","1.4.12","1.4.13","1.4.14","1.4.15","1.4.16","1.4.17","1.4.18","1.4.19","1.4.2","1.4.20","1.4.3","1.4.4","1.4.5","1.4.6","1.4.7","1.4.8","1.4.9","1.5","1.5.7","1.5.9","1.6.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":2347591,"resolution":"1","location":"assets","locale":"","width":1084,"height":499},"screenshot-2.png":{"filename":"screenshot-2.png","revision":2347591,"resolution":"2","location":"assets","locale":"","width":542,"height":393},"screenshot-3.png":{"filename":"screenshot-3.png","revision":2347591,"resolution":"3","location":"assets","locale":"","width":610,"height":666},"screenshot-4.png":{"filename":"screenshot-4.png","revision":2347591,"resolution":"4","location":"assets","locale":"","width":469,"height":506},"screenshot-5.png":{"filename":"screenshot-5.png","revision":2347591,"resolution":"5","location":"assets","locale":"","width":295,"height":600},"screenshot-6.png":{"filename":"screenshot-6.png","revision":2349179,"resolution":"6","location":"assets","locale":"","width":619,"height":492}},"screenshots":{"1":"Weekly occupancy schedule in the frontend","2":"Occupancy schedule configuration in the administration area","3":"Booking details and recurring interval configuration","4":"Frontend booking details dialog","5":"Frontend booking request dialog","6":"Email notification and approval configuration"}},"plugin_section":[262246],"plugin_tags":[4484,269,188887,188888,46704],"plugin_category":[],"plugin_contributors":[188847],"plugin_business_model":[],"class_list":["post-125497","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-belegungsplan","plugin_tags-booking","plugin_tags-buchungen","plugin_tags-hallenbelegung","plugin_tags-occupancy-plan","plugin_contributors-tharkun69","plugin_committers-tharkun69"],"banners":{"banner":"https:\/\/ps.w.org\/occupancy-plan\/assets\/banner-772x250.png?rev=2347591","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/occupancy-plan\/assets\/icon-128x128.png?rev=2347591","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/occupancy-plan\/assets\/screenshot-1.png?rev=2347591","caption":"Weekly occupancy schedule in the frontend"},{"src":"https:\/\/ps.w.org\/occupancy-plan\/assets\/screenshot-2.png?rev=2347591","caption":"Occupancy schedule configuration in the administration area"},{"src":"https:\/\/ps.w.org\/occupancy-plan\/assets\/screenshot-3.png?rev=2347591","caption":"Booking details and recurring interval configuration"},{"src":"https:\/\/ps.w.org\/occupancy-plan\/assets\/screenshot-4.png?rev=2347591","caption":"Frontend booking details dialog"},{"src":"https:\/\/ps.w.org\/occupancy-plan\/assets\/screenshot-5.png?rev=2347591","caption":"Frontend booking request dialog"},{"src":"https:\/\/ps.w.org\/occupancy-plan\/assets\/screenshot-6.png?rev=2349179","caption":"Email notification and approval configuration"}],"raw_content":"<!--section=description-->\n<p>Occupancy Plan provides schedules for sports facilities, rooms, courts, halls and other shared resources. Create schedules in WordPress and publish each with a shortcode.<\/p>\n\n<p>Visitors can browse available periods without reloading the complete page. Depending on the schedule configuration and their permissions, guests or logged-in users can create bookings, view details and manage existing bookings directly in the frontend.<\/p>\n\n<p><strong>SCHEDULE DISPLAY AND NAVIGATION<\/strong>\n* Daily, one-week, two-week, monthly and yearly schedule views\n* Responsive desktop and mobile layouts\n* AJAX navigation between dates, weeks, months, years and courts without reloading the page\n* Optional compact monthly week picker for fast navigation in weekly views\n* Configurable weekday selection, abbreviated weekday names and optional navigation header\n* Print-optimized schedule, including the date below each weekday in the weekly view\n* Configurable header, text, border, booking background and booking text colors\n* Anonymized frontend display and configurable booking tooltips<\/p>\n\n<p><strong>PLANS, COURTS AND TIME SLOTS<\/strong>\n* Create and manage multiple independent occupancy schedules\n* Limit each schedule to a configurable start and end date\n* Configure operating hours and time intervals from 5 to 90 minutes\n* Define break periods and optional breaks between consecutive slots\n* Use automatically generated periods or individually configured fixed time slots with display names\n* Manage multiple courts, rooms or other resources with custom names, short names and sort order\n* Divide resources into named child courts or sub-resources\n* Configure schedules for time-based or full-day bookings<\/p>\n\n<p><strong>BOOKINGS AND SERIES<\/strong>\n* Create, edit, delete and move authorized bookings in the frontend\n* Create and manage bookings in the WordPress administration area\n* One-time, weekly, monthly, flexible and every-second-week booking intervals\n* Exceptions for individual dates in recurring bookings, for example holidays\n* Conflict detection for times, courts, child courts and recurring bookings\n* Configurable booking window that limits how many days in advance a booking can be made\n* Booking priorities to control the display order of overlapping entries\n* Prepared booking templates for frequently used booking data\n* Custom booking colors, contact information, comments and authorized users\n* Up to four configurable custom fields, including mandatory fields and selectable values<\/p>\n\n<p><strong>PERMISSIONS, PRIVACY AND APPROVALS<\/strong>\n* Optional guest booking or capability-based access for logged-in users\n* Dedicated Occupancy User, Editor, Owner and Manager roles\n* Users can be allowed to edit their own bookings; managers retain full administration access\n* Separate permissions for changing booking times, intervals and courts in the frontend\n* Optional provisional booking and approval workflow\n* Confirm or reject requests in the administration area and send corresponding notifications\n* Optional confirmation checkbox, information text and information link in the booking dialog\n* Server-side validation, nonce protection and escaped frontend output for protected booking actions<\/p>\n\n<p><strong>ADMINISTRATION, EMAIL AND DATA EXCHANGE<\/strong>\n* Searchable administration lists and bulk deletion for schedule data\n* Context-sensitive help for schedule, booking, template, court, time-slot, exception and preview pages\n* Copyable shortcode reference with defaults and practical examples\n* CSV import and export for schedules and bookings\n* Protected iCalendar download and secret subscription feed with recurrence rules and exceptions\n* Configurable email notifications to administrators and booking users\n* Custom sender, recipients, CC, subjects and message templates with booking placeholders\n* Dashboard widget for occupancy managers showing the latest bookings\n* Optional automatic cleanup of old bookings\n* Complete bundled German translation and WordPress.org-compatible localization support<\/p>\n\n<h3>Usage<\/h3>\n\n<p>Create a schedule in <strong>Occupancy Plan<\/strong> in the WordPress administration area. The schedule ID is shown in the schedule overview. Add the shortcode to a page or post:<\/p>\n\n<pre><code>[occupancy_plan id=\"1\"]\n<\/code><\/pre>\n\n<p>The <code>id<\/code> attribute is required. The following optional attributes are supported:<\/p>\n\n<ul>\n<li><code>mode<\/code>: <code>daily<\/code>, <code>weekly<\/code>, <code>monthly<\/code> or <code>yearly<\/code> (default: <code>weekly<\/code>); use <code>weekly!<\/code> to force the weekly view even with many sub-courts<\/li>\n<li><code>weekdays<\/code>: visible weekdays as digits from <code>1<\/code> (Monday) to <code>7<\/code> (Sunday), for example <code>12345<\/code><\/li>\n<li><code>showheader<\/code>: set to <code>false<\/code> to hide the frontend navigation header<\/li>\n<li><code>shortweekdays<\/code>: set to <code>true<\/code> to use abbreviated weekday names<\/li>\n<li><code>weeks<\/code>: <code>1<\/code> or <code>2<\/code> consecutive weeks in weekly mode (default: <code>1<\/code>); navigation advances by one week<\/li>\n<li><code>monthpicker<\/code>: set to <code>true<\/code> to replace the week field and date range with the compact monthly week picker (default: <code>false<\/code>)<\/li>\n<li><code>calendar<\/code>: set to <code>true<\/code> to show protected iCalendar actions to occupancy managers<\/li>\n<li><code>columns<\/code>: number of month columns in the yearly view (default: <code>3<\/code>)<\/li>\n<\/ul>\n\n<p>Examples:<\/p>\n\n<pre><code>[occupancy_plan id=\"1\" mode=\"weekly\" weekdays=\"12345\" shortweekdays=\"true\"]\n\n[occupancy_plan id=\"1\" mode=\"weekly\" weeks=\"2\" monthpicker=\"true\" calendar=\"true\"]\n\n[occupancy_plan id=\"1\" mode=\"daily\"]\n\n[occupancy_plan id=\"1\" mode=\"yearly\" columns=\"3\"]\n<\/code><\/pre>\n\n<p><strong>SUPPORT<\/strong>\nThe plugin is continuously developed and supported. Please send support inquiries by email to <a href=\"mailto:support@software-kunze.de\">support@software-kunze.de<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin ZIP through <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong>, or copy the <code>occupancy-plan<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate <strong>Occupancy Plan<\/strong> in the WordPress plugin list.<\/li>\n<li>Open <strong>Occupancy Plan<\/strong> in the administration area and create or configure a schedule.<\/li>\n<li>Configure courts, time slots, booking permissions, email notifications and optional approval settings.<\/li>\n<li>Insert <code>[occupancy_plan id=\"1\"]<\/code> into a page or post and replace <code>1<\/code> with the ID of your schedule.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Tested with WordPress version 7.1<\/li>\n<li>Fix: Let Occupancy Editors edit, move and delete bookings they created themselves while keeping Authorized Users restricted to Occupancy Owners and managers<\/li>\n<li>Fix: Delete frontend bookings through a dedicated authenticated AJAX endpoint with nonce, schedule and ownership checks<\/li>\n<li>Fix: Decouple the core frontend click\/AJAX script from optional jQuery UI and color-picker dependencies so optimization or theme changes cannot suppress booking interaction entirely<\/li>\n<li>Compatibility: Enqueue Occupancy Plan assets during the regular wp_enqueue_scripts phase when the shortcode is present, with shortcode-time loading retained as a fallback for dynamic builders<\/li>\n<li>Fix: Repair missing capabilities on existing Occupancy Plan roles during normal plugin updates, including legacy Occupancy Editor installations, so editors retain permission to create frontend bookings<\/li>\n<li>Fix: Keep the current day bookable when a booking window is configured; compare booking windows by calendar date instead of clock time.<\/li>\n<li>Fix: Make frontend availability cache-safe: render structurally available slots independently of the cached viewer and verify booking permission when the AJAX dialog is requested<\/li>\n<li>Privacy: Populate logged-in user name and email only in the fresh AJAX booking dialog instead of embedding user-specific defaults in cacheable schedule markup<\/li>\n<li>Fix: Ensure clicks on free frontend slots always reach the booking dialog, even if optional jQuery UI drag\/drop or color-picker enhancements are unavailable or loaded late<\/li>\n<li>Fix: Read booking slot metadata robustly from the clickable schedule cell and its inner element<\/li>\n<li>Fix: Route frontend booking saves through WordPress AJAX and return structured validation errors<\/li>\n<li>Fix: Restore reliable frontend booking dialogs on cached pages while keeping booking writes protected by a fresh nonce<\/li>\n<li>Fix: Use the localized admin-post endpoint and the fresh dialog nonce for frontend booking actions<\/li>\n<li>Fix: Render the administration preview without stripping shortcode form controls<\/li>\n<li>Fix: Load frontend schedule assets early enough for a correctly styled administration preview<\/li>\n<li>Internationalization: Rebuild the translation catalog from the current plugin source<\/li>\n<li>Translation: Complete the bundled German translation for all current plugin strings<\/li>\n<li>Translation: Add missing strings introduced after the previous POT generation<\/li>\n<li>Translation: Rely on WordPress just-in-time localization using the plugin Text Domain and Domain Path metadata<\/li>\n<li>Maintenance: Add a reproducible WP-CLI translation update script for future releases<\/li>\n<li>Improvement: Increase horizontal spacing in the compact weekly date range for readability<\/li>\n<\/ul>\n\n<h4>1.5.9<\/h4>\n\n<ul>\n<li>Improvement: Shorten the weekly date range by omitting repeated month and year components<\/li>\n<li>Improvement: Remove the \"from\"\/\"to\" labels, emphasize the separator and add more horizontal breathing room<\/li>\n<li>Fix: Critical-Error in admin help page <\/li>\n<\/ul>\n\n<h4>1.5.8<\/h4>\n\n<ul>\n<li>Improvement: Redesign the frontend period selector as a compact toolbar with grouped navigation, date range and resource selector<\/li>\n<li>Improvement: Add clearer hover\/focus states and responsive wrapping for narrow screens<\/li>\n<\/ul>\n\n<h4>1.5.7<\/h4>\n\n<ul>\n<li>Fix: Remove theme-added borders around the empty top-left schedule corner, including collapsed table-border conflicts<\/li>\n<li>Accessibility: Mark structural empty corner cells as hidden from assistive technology<\/li>\n<li>Repository: Use the numeric stable tag 1.5.7 for the corresponding WordPress.org SVN release tag<\/li>\n<\/ul>\n\n<h4>1.5.6<\/h4>\n\n<ul>\n<li>Maintenance: Correct PHPCS suppression scopes for 15 prepared queries that use trusted plugin table identifiers<\/li>\n<li>Compatibility: Retain the declared WordPress 4.9 baseline instead of requiring the newer %i identifier placeholder<\/li>\n<\/ul>\n\n<h4>1.5.3<\/h4>\n\n<ul>\n<li>Compatibility: Replace deprecated readonly() calls with a WordPress 4.9-compatible plugin helper<\/li>\n<li>Maintenance: Clarify translator comments for CSV upload-size placeholders<\/li>\n<li>Maintenance: Document trusted plugin table identifiers and prepared query variables for static analysis<\/li>\n<li>Maintenance: Mark the WordPress core plugin_locale filter as an intentional unprefixed hook<\/li>\n<\/ul>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>Security: Add direct-access protection to executable PHP files<\/li>\n<li>Security: Validate and unslash request values, enforce nonces and capabilities for protected actions<\/li>\n<li>Security: Prepare dynamic database queries and allowlist list-table sorting and bulk operations<\/li>\n<li>Security: Escape frontend and administration output according to HTML, attribute, URL and style context<\/li>\n<li>Security: Validate remote email-template URLs and retrieve them through the WordPress HTTP API<\/li>\n<li>Compatibility: Remove PHP string helpers unavailable on the declared WordPress baseline and use WordPress-aware date handling<\/li>\n<li>Reliability: Correct sample schedule installation formats, default color values and schedule defaults<\/li>\n<li>Reliability: Fix time-slot initialization, weekday rendering, exception edit links and several malformed or duplicated form controls<\/li>\n<li>Maintenance: Normalize line endings, resource versions, footer loading, translation comments and plugin text domains<\/li>\n<li>Maintenance: Consolidate permanent data removal in uninstall.php and remove all plugin roles, capabilities, options, calendar tokens and tables<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Fix: Keep booking dialogs visible and scrollable on narrow Android screens<\/li>\n<li>Troubleshooting: If forms are blank after an update, clear browser cache and site data (including cookies), then reload<\/li>\n<li>Improvement: Add a responsive CSV import with validation and progress feedback<\/li>\n<li>Reliability: Support long rows and UTF-8 BOM; fix upload validation and field mappings<\/li>\n<li>Documentation: Add administration help for lists, forms, CSV, previews, templates, resources, time slots and exceptions<\/li>\n<li>Documentation: Add practical shortcode examples to the schedule settings<\/li>\n<li>Improvement: Make the monthly week picker optional with <code>monthpicker=\"true\"<\/code>; the default uses the week field and date range<\/li>\n<li>Improvement: Add contextual schedule help and a copyable shortcode reference<\/li>\n<li>Documentation: Share shortcode defaults between frontend and administration help<\/li>\n<li>Feature: Show one or two consecutive weeks with the <code>weeks<\/code> shortcode attribute<\/li>\n<li>Feature: Select weeks from a compact, AJAX-powered monthly overview<\/li>\n<li>Feature: Export bookings as iCalendar files or subscribe through a secret calendar URL<\/li>\n<li>Calendar: Include recurring bookings, recurrence exceptions, courts, details and contact data<\/li>\n<li>Privacy: Restrict calendar management to occupancy managers and allow subscription tokens to be reset<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Documentation: Complete the description, feature overview, shortcode usage and installation instructions<\/li>\n<li>Improvement: Keep fixed time-slot labels readable in the first schedule column<\/li>\n<li>Improvement: Show each day's date below the weekday in the weekly print view<\/li>\n<li>Improvement: Navigate between schedule periods without reloading the complete page<\/li>\n<li>Improvement: Load frontend dialog markup only when requested via AJAX<\/li>\n<li>Fix: Preserve an existing booking ID in AJAX edit dialogs to prevent self-conflicts<\/li>\n<li>Fix: Complete AJAX rendering for frontend booking and details dialogs<\/li>\n<li>Fix: Keep frontend dialog behavior consistent for guests and logged-in users<\/li>\n<li>Fix: Detect booking conflicts for edits, enclosing time ranges and recurring bookings<\/li>\n<li>Fix: Show the actual server error when a frontend booking cannot be saved<\/li>\n<li>Security: Enforce capabilities and nonces for all backend write actions<\/li>\n<li>Security: Restrict frontend booking updates, moves and deletes to authorized users<\/li>\n<li>Security: Validate booking plans, dates, times, courts, booking windows and colors server-side<\/li>\n<li>Security: Escape stored booking data and configuration before frontend output<\/li>\n<li>Privacy: Show the booking dashboard widget only to occupancy managers<\/li>\n<\/ul>\n\n<h4>1.4.20<\/h4>\n\n<ul>\n<li>Fix: Import CSV =&gt; Set of correct court number<\/li>\n<li>Fix: Select correct plan tab<\/li>\n<li>Tested with WordPress version 7.0<\/li>\n<li>New Feature: Booking window - Number of days in advance that an booking can be booked<\/li>\n<\/ul>\n\n<h4>1.4.19<\/h4>\n\n<ul>\n<li>Fix: Correct check for number of courts<\/li>\n<\/ul>\n\n<h4>1.4.18<\/h4>\n\n<ul>\n<li>Fix: Delete of block exceptions<\/li>\n<li>Tested with WordPress version 6.9.4<\/li>\n<li>Improvements to the block table =&gt; Changed from POST to GET<\/li>\n<\/ul>\n\n<h4>1.4.17<\/h4>\n\n<ul>\n<li>Fix: CSV Import of schedules and blocks<\/li>\n<li>Tested with WordPress version 6.9.1<\/li>\n<\/ul>\n\n<h4>1.4.16<\/h4>\n\n<ul>\n<li>Fix: Display of the correct week when the first week begins in the previous year<\/li>\n<\/ul>\n\n<h4>Earlier versions<\/h4>\n\n<p>Release notes before version 1.4.16 are available in <code>changelog.txt<\/code>.<\/p>","raw_excerpt":"Create configurable occupancy schedules and let visitors view, request and manage bookings directly in the WordPress frontend.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/125497","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=125497"}],"author":[{"embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tharkun69"}],"wp:attachment":[{"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=125497"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=125497"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=125497"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=125497"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=125497"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=125497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}