Description
Occupancy Plan provides schedules for sports facilities, rooms, courts, halls and other shared resources. Create schedules in WordPress and publish each with a shortcode.
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.
SCHEDULE DISPLAY AND NAVIGATION
* Daily, one-week, two-week, monthly and yearly schedule views
* Responsive desktop and mobile layouts
* AJAX navigation between dates, weeks, months, years and courts without reloading the page
* Optional compact monthly week picker for fast navigation in weekly views
* Configurable weekday selection, abbreviated weekday names and optional navigation header
* Print-optimized schedule, including the date below each weekday in the weekly view
* Configurable header, text, border, booking background and booking text colors
* Eight selectable frontend themes via shortcode: Classic, Modern, Cards, Minimal, Dark, Soft, Outline and Sport
* Independent display density via shortcode: Normal, Compact or Spacious
* Anonymized frontend display and configurable booking tooltips
PLANS, COURTS AND TIME SLOTS
* Create and manage multiple independent occupancy schedules
* Limit each schedule to a configurable start and end date
* Configure operating hours and time intervals from 5 to 90 minutes
* Define break periods and optional breaks between consecutive slots
* Use automatically generated periods or individually configured fixed time slots with display names
* Manage multiple courts, rooms or other resources with custom names, short names and sort order
* Divide resources into named child courts or sub-resources
* Configure schedules for time-based or full-day bookings
BOOKINGS AND SERIES
* Create, edit, delete and move authorized bookings in the frontend
* When enabled per schedule, reserve a second court/resource with one logical booking; both entries stay synchronized
* Create and manage bookings in the WordPress administration area
* One-time, weekly, monthly, flexible and every-second-week booking intervals
* Exceptions for individual dates in recurring bookings, for example holidays
* Conflict detection for times, courts, child courts and recurring bookings
* Configurable booking window with independent minimum and maximum lead times
* Booking priorities to control the display order of overlapping entries
* Prepared booking templates for frequently used booking data
* Custom booking colors, contact information, comments and authorized users
* Up to four configurable custom fields, including mandatory fields and selectable values
PERMISSIONS, PRIVACY AND APPROVALS
* Optional guest booking or capability-based access for logged-in users
* Dedicated Occupancy User, Editor, Owner and Manager roles
* Users can be allowed to edit their own bookings; managers retain full administration access
* Separate permissions for changing booking times, intervals and courts in the frontend
* Optional provisional booking and approval workflow
* Confirm or reject requests in the administration area and send corresponding notifications
* Optional confirmation checkbox, information text and information link in the booking dialog
* Server-side validation, nonce protection and escaped frontend output for protected booking actions
ADMINISTRATION, EMAIL AND DATA EXCHANGE
* Searchable administration lists and bulk deletion for schedule data
* Context-sensitive help for schedule, booking, template, court, time-slot, exception and preview pages
* Copyable shortcode reference with defaults and practical examples
* CSV import and export for schedules and bookings
* Protected iCalendar download and secret subscription feed with recurrence rules and exceptions
* Configurable email notifications to administrators and booking users
* Custom sender, recipients, CC, subjects and message templates with booking placeholders
* Dashboard widget for occupancy managers showing the latest bookings
* Optional automatic cleanup of old bookings
* Complete bundled German translation and WordPress.org-compatible localization support
Usage
Create a schedule in Occupancy Plan in the WordPress administration area. The schedule ID is shown in the schedule overview. Add the shortcode to a page or post:
[occupancy_plan id="1"]
The id attribute is required. The following optional attributes are supported:
mode:daily,weekly,monthlyoryearly(default:weekly); useweekly!to force the weekly view even with many sub-courtsweekdays: visible weekdays as digits from1(Monday) to7(Sunday), for example12345showheader: set tofalseto hide the frontend navigation headershortweekdays: set totrueto use abbreviated weekday namesweeks:1or2consecutive weeks in weekly mode (default:1); navigation advances by one weekmonthpicker: set totrueto replace the week field and date range with the compact monthly week picker (default:false)calendar: set totrueto show protected iCalendar actions to occupancy managerscolumns: number of month columns in the yearly view (default:3)theme:classic,modern,cards,minimalordark(default:classic)
Examples:
[occupancy_plan id="1" mode="weekly" weekdays="12345" shortweekdays="true"]
[occupancy_plan id="1" mode="weekly" weeks="2" monthpicker="true" calendar="true"]
[occupancy_plan id="1" mode="daily"]
[occupancy_plan id="1" theme="modern"]
[occupancy_plan id="1" theme="cards" weeks="2"]
[occupancy_plan id="1" mode="yearly" columns="3" theme="minimal"]
SUPPORT
The plugin is continuously developed and supported. Please send support inquiries by email to support@software-kunze.de.
Screenshots






Installation
- Upload the plugin ZIP through Plugins > Add New > Upload Plugin, or copy the
occupancy-planfolder to/wp-content/plugins/. - Activate Occupancy Plan in the WordPress plugin list.
- Open Occupancy Plan in the administration area and create or configure a schedule.
- Configure courts, time slots, booking permissions, email notifications and optional approval settings.
- Insert
[occupancy_plan id="1"]into a page or post and replace1with the ID of your schedule.
Reviews
Contributors & Developers
“Occupancy Plan” is open source software. The following people have contributed to this plugin.
Contributors“Occupancy Plan” has been translated into 1 locale. Thank you to the translators for their contributions.
Translate “Occupancy Plan” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.6.4
- Feature: Turn the one-sided booking limit into a true booking window with independent Start and End values
- Feature: Booking Window Start is a signed calendar-day offset; negative values allow retrospective bookings, zero starts today and positive values block spontaneous bookings by requiring lead time
- Feature: Booking Window End continues to limit how far in advance bookings are allowed; zero means no upper limit, so 0/0 means today onward without a future limit
- Compatibility: Migrate the former
bookingwindowvalue tobookingwindowendand initializebookingwindowstartwith zero - Security: Enforce both booking-window boundaries when opening, creating and drag-and-drop moving frontend bookings, not only when rendering available slots
- Data exchange: Export the new booking-window fields and remain compatible with legacy schedule CSV imports
- UI: Update schedule fields, tooltips and contextual help for the two-sided booking window
- Localization: Polish the bundled German translation, including booking-window wording and consistent backend terminology
- Localization: Merge bundled translations as a fallback after the normal WordPress language pack so newly added release strings do not temporarily remain untranslated
- Compatibility: Resolve Plugin Check findings for the WordPress 4.9 translation fallback and safely escaped plugin-owned table identifiers during the 1.6.4 schema migration
1.6.3
- Fix: Run the database/role migration check on
initinstead ofplugins_loadedso localized role names no longer trigger WordPress 6.7+_load_textdomain_just_in_timenotices. - UI: Compact the read-only frontend booking details dialog to 24px fields with reduced row spacing
- Fix: Frontend details remain available when booking is disabled; current pages use the detail endpoint directly and stale cached edit markup is resolved server-side without a 403 round-trip.
- Feature: Add the
themeshortcode parameter with Classic, Modern, Cards, Minimal, Dark, Soft, Outline and Sport frontend themes - Feature: Add the independent
densityshortcode parameter with Normal, Compact and Spacious spacing - UI: Add Theme and Density selectors to the backend Preview and show the resulting shortcode for easy reuse
- Compatibility: Keep Classic and Normal as defaults so existing shortcodes retain their current appearance
- Improvement: Preserve theme and density during AJAX date, week, month, year and court navigation
- Improvement: Scope schedule colors per plan and expose them as CSS custom properties so multiple themed schedules can coexist on one page
- Documentation: Add theme/density parameters and practical examples to the contextual shortcode help
- UI: Refine the Dark theme so weekday/resource headers and the complete time column stay consistently dark while individual booking colors remain unchanged
- UI: Make frontend booking form controls more compact and resistant to oversized theme defaults
- UI: Further reduce booking field heights and remove the explanatory Court 2 text for a denser dialog
- Feature: Make the optional second court selectable per schedule; existing grouped bookings remain editable when the option is switched off
- Fix: Restore reliable confirmation/privacy checkbox interaction and validate required confirmation on the server
- Fix: Preserve the explicitly configured weekday of recurring weekly, monthly and biweekly bookings when an existing booking is opened and saved
- Fix: Reconcile stale cached court IDs with current court/child-court labels before rendering a new booking dialog
1.6.2
- UI: Align the contextual Help panel with the Create/Edit Booking panel and keep a consistent gutter between both columns
- Fix: Restore the backend booking form on current WordPress/PHP versions by replacing the unavailable required() helper with a plugin-owned compatibility helper
- Maintenance: Silence five false-positive prepared-SQL warnings by attaching PHPCS exceptions directly to trusted plugin table identifiers
- Compatibility: Verified PHP syntax with PHP 8.4
1.6.1
- Feature: Add an optional second court/resource to frontend bookings
- Feature: Store multi-court reservations as synchronized booking groups while continuing to render one normal booking per court
- Validation: Check both selected resources for conflicts before saving and prevent overlapping selections within the same booking
- Improvement: Editing or deleting either entry updates or deletes the complete multi-court booking
- Improvement: Keep recurring-booking exceptions synchronized across both resources
- Improvement: Move one-time grouped bookings together when using drag and drop
- Improvement: Make administration and bulk deletion group-aware
- Data exchange: Preserve booking group identifiers in block CSV export/import
1.6.0
- Tested with WordPress version 7.1
- Fix: Let Occupancy Editors edit, move and delete bookings they created themselves while keeping Authorized Users restricted to Occupancy Owners and managers
- Fix: Delete frontend bookings through a dedicated authenticated AJAX endpoint with nonce, schedule and ownership checks
- 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
- 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
- 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
- Fix: Keep the current day bookable when a booking window is configured; compare booking windows by calendar date instead of clock time.
- 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
- 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
- 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
- Fix: Read booking slot metadata robustly from the clickable schedule cell and its inner element
- Fix: Route frontend booking saves through WordPress AJAX and return structured validation errors
- Fix: Restore reliable frontend booking dialogs on cached pages while keeping booking writes protected by a fresh nonce
- Fix: Use the localized admin-post endpoint and the fresh dialog nonce for frontend booking actions
- Fix: Render the administration preview without stripping shortcode form controls
- Fix: Load frontend schedule assets early enough for a correctly styled administration preview
- Internationalization: Rebuild the translation catalog from the current plugin source
- Translation: Complete the bundled German translation for all current plugin strings
- Translation: Add missing strings introduced after the previous POT generation
- Translation: Rely on WordPress just-in-time localization using the plugin Text Domain and Domain Path metadata
- Maintenance: Add a reproducible WP-CLI translation update script for future releases
- Improvement: Increase horizontal spacing in the compact weekly date range for readability
1.5.9
- Improvement: Shorten the weekly date range by omitting repeated month and year components
- Improvement: Remove the “from”/”to” labels, emphasize the separator and add more horizontal breathing room
- Fix: Critical-Error in admin help page
1.5.8
- Improvement: Redesign the frontend period selector as a compact toolbar with grouped navigation, date range and resource selector
- Improvement: Add clearer hover/focus states and responsive wrapping for narrow screens
1.5.7
- Fix: Remove theme-added borders around the empty top-left schedule corner, including collapsed table-border conflicts
- Accessibility: Mark structural empty corner cells as hidden from assistive technology
- Repository: Use the numeric stable tag 1.5.7 for the corresponding WordPress.org SVN release tag
1.5.6
- Maintenance: Correct PHPCS suppression scopes for 15 prepared queries that use trusted plugin table identifiers
- Compatibility: Retain the declared WordPress 4.9 baseline instead of requiring the newer %i identifier placeholder
1.5.3
- Compatibility: Replace deprecated readonly() calls with a WordPress 4.9-compatible plugin helper
- Maintenance: Clarify translator comments for CSV upload-size placeholders
- Maintenance: Document trusted plugin table identifiers and prepared query variables for static analysis
- Maintenance: Mark the WordPress core plugin_locale filter as an intentional unprefixed hook
1.5.2
- Security: Add direct-access protection to executable PHP files
- Security: Validate and unslash request values, enforce nonces and capabilities for protected actions
- Security: Prepare dynamic database queries and allowlist list-table sorting and bulk operations
- Security: Escape frontend and administration output according to HTML, attribute, URL and style context
- Security: Validate remote email-template URLs and retrieve them through the WordPress HTTP API
- Compatibility: Remove PHP string helpers unavailable on the declared WordPress baseline and use WordPress-aware date handling
- Reliability: Correct sample schedule installation formats, default color values and schedule defaults
- Reliability: Fix time-slot initialization, weekday rendering, exception edit links and several malformed or duplicated form controls
- Maintenance: Normalize line endings, resource versions, footer loading, translation comments and plugin text domains
- Maintenance: Consolidate permanent data removal in uninstall.php and remove all plugin roles, capabilities, options, calendar tokens and tables
1.5.1
- Fix: Keep booking dialogs visible and scrollable on narrow Android screens
- Troubleshooting: If forms are blank after an update, clear browser cache and site data (including cookies), then reload
- Improvement: Add a responsive CSV import with validation and progress feedback
- Reliability: Support long rows and UTF-8 BOM; fix upload validation and field mappings
- Documentation: Add administration help for lists, forms, CSV, previews, templates, resources, time slots and exceptions
- Documentation: Add practical shortcode examples to the schedule settings
- Improvement: Make the monthly week picker optional with
monthpicker="true"; the default uses the week field and date range - Improvement: Add contextual schedule help and a copyable shortcode reference
- Documentation: Share shortcode defaults between frontend and administration help
- Feature: Show one or two consecutive weeks with the
weeksshortcode attribute - Feature: Select weeks from a compact, AJAX-powered monthly overview
- Feature: Export bookings as iCalendar files or subscribe through a secret calendar URL
- Calendar: Include recurring bookings, recurrence exceptions, courts, details and contact data
- Privacy: Restrict calendar management to occupancy managers and allow subscription tokens to be reset
1.5.0
- Documentation: Complete the description, feature overview, shortcode usage and installation instructions
- Improvement: Keep fixed time-slot labels readable in the first schedule column
- Improvement: Show each day’s date below the weekday in the weekly print view
- Improvement: Navigate between schedule periods without reloading the complete page
- Improvement: Load frontend dialog markup only when requested via AJAX
- Fix: Preserve an existing booking ID in AJAX edit dialogs to prevent self-conflicts
- Fix: Complete AJAX rendering for frontend booking and details dialogs
- Fix: Keep frontend dialog behavior consistent for guests and logged-in users
- Fix: Detect booking conflicts for edits, enclosing time ranges and recurring bookings
- Fix: Show the actual server error when a frontend booking cannot be saved
- Security: Enforce capabilities and nonces for all backend write actions
- Security: Restrict frontend booking updates, moves and deletes to authorized users
- Security: Validate booking plans, dates, times, courts, booking windows and colors server-side
- Security: Escape stored booking data and configuration before frontend output
- Privacy: Show the booking dashboard widget only to occupancy managers
1.4.20
- Fix: Import CSV => Set of correct court number
- Fix: Select correct plan tab
- Tested with WordPress version 7.0
- New Feature: Booking window – Number of days in advance that an booking can be booked
1.4.19
- Fix: Correct check for number of courts
1.4.18
- Fix: Delete of block exceptions
- Tested with WordPress version 6.9.4
- Improvements to the block table => Changed from POST to GET
1.4.17
- Fix: CSV Import of schedules and blocks
- Tested with WordPress version 6.9.1
1.4.16
- Fix: Display of the correct week when the first week begins in the previous year
Earlier versions
Release notes before version 1.4.16 are available in changelog.txt.
