BookingWP - #1 WordPress Appointment Booking Plugin icon

15 versions

BookingWP - #1 WordPress Appointment Booking Plugin history.

Every release of BookingWP - #1 WordPress Appointment Booking Plugin is archived here with its changelog, file size, and security scan result. Use the archive to roll back to a stable release or audit what changed between updates.

15 of 15 releases scanned clean
v5.4.15Latest
September 4, 20263.0 MBScanned
Other
  • Dev - Tests: AddonCartCostLiveTest covers day/night duration add-on fees (stack, zero-base, duration-only fee 0, fee without duration).
  • Dev - Tests: CartCheckoutLiveTest covers dangling order parent on inactive-cart cleanup and session load; hard-deleted orders assert cascade appointment removal.
  • Dev - Tests: weekday collectors treat max_bookable civil day as exclusive (partial max_check_to window; Johnsansom parity stable on America/New_York mornings).
Fixed
  • Product Add-ons: "Use once per recurring series" follows Can be recurring? on existing and newly added fields, including when the checkbox is toggled before save.
  • Product Add-ons: day/month/night products always include duration add-on fees (zero-base packages and priced bases); extended days still bill at the product rate. Duration-only options stay available: set the option price to 0 so the span grows and only the product rate applies.
  • Product Add-ons: a required Quantity (input multiplier) with min 0 again accepts 0 (base duration only; no add-on cart line).
  • Cart: deleting a draft (or any) order as cron/Action Scheduler again releases linked in-cart holds; abandoned-cart cleanup no longer treats a missing order ID as a live exemption.
September 3, 20263.0 MBScanned
Improved
  • Admin calendar: availability SSE snackbars name the change again (saved or deleted; bursts still collapse to a count).
  • Admin calendar: reorder-only availability rule saves no longer show an SSE snackbar.
  • Updated all translations for new and changed strings.
Other
  • Dev - Tests: live suite no longer strips shared WP/WC hooks to silence SSE; pushes gate via `wc_appointments_sse_push_enabled`, runtime queue reset, safer cache flush, and phpunit memory_limit 768M.
  • Dev - Tests: CartCheckoutLiveTest covers multi-line same-slot checkout (2 allow / 3 reject), confirmed-plus-holds, different times, staff-scoped holds, and single-hold qty 2; index on/off where capacity exclude matters.
  • Dev - Tests: BookingFormAtcLiveTest covers storefront add-to-cart capacity (confirmed/in-cart fill, qty above remaining, remaining seat allow) and sold-individually blocking a second cart line.
  • Dev - Tests: BookingScenarioWritePathLiveTest covers padding×capacity, per-day multi-line, staff automatic/all ATC, requires-confirmation occupancy/mixed cart, overnight multi-hold, addon×capacity, customer TZ ATC, unpaid occupancy, cross-product padding ATC, span=start ATC, admin vs storefront capacity parity, restricted days / min_date crafted POST ATC, multi-day overlap ATC, cancelled/was-in-cart vs complete occupancy, and independent products at the same wall time.
  • Dev - Tests: MyAccountRescheduleContractLiveTest covers reschedule self-exclude, full-slot reject, capacity-2 remaining seat, padding adjacent reject, and staff-all taken reject; CartCheckoutLiveTest locks Store API vs legacy checkout wrappers on multi-hold capacity; RestAppointmentsCreateLiveTest documents that REST create may overbook a storefront-full slot.
  • Dev - Tests: GcalStaffRemoveOnCancelLiveTest locks `remove_from_gcal()` staff fan-out: staff-only sync, main plus staff, and shared calendar with and without a main event (one DELETE per event).
  • Dev - Tests: IcsCancelContractLiveTest locks cancelled ICS export (no STATUS:CANCELLED) and that cancel emails skip ICS attachments; EmailCancelTransitionLiveTest covers single cancel notifications, series FUTURE suppress, and series ONE per-occurrence cancel; GcalInboundCancelLiveTest covers Google→WP CANCELLED (main cancel, staff detach, last-staff cancel).
Fixed
  • Checkout: two or more separate cart appointments for the same product and time slot no longer fail availability when their combined quantity still fits capacity.
  • Google Calendar: cancelling or trashing an appointment now removes the event from staff calendars when only staff calendars are connected (no site calendar or no site event).
  • Google Calendar: successful event DELETE clears the stored site/staff event IDs; inbound staff detach drops that staff’s event ID (staff event ID map merge no longer blocks removals or updates).
  • Admin calendar: fixed toolbar and day headers use locked SCSS spacing (no JS height measure); left tracks the admin menu via WP folded breakpoints so Chrome and Firefox stay flush.
August 28, 20263.0 MBScanned

No changelog available for this version.

v5.4.10Unavailable
August 20, 20263.0 MBScanned
Improved
  • Compatibility with WordPress 7.1.
Other
  • Dev - Opt-in Playwright smoke: `npm run test:e2e` (staff change + Show first available against staff-auto-select-in-separate-month on bookingwp.local).
  • Dev - Tests: GcalSharedCalendarMirrorLiveTest covers foreign busy import and write-back skip; GcalSyncUpdatedDescriptionLiveTest locks the description filter BC.
Fixed
  • Storefront: changing staff with auto-select on keeps the selected date and time when still available; otherwise shows Show first available next to No slots available.
  • Google Calendar: appointments from another site on a shared calendar import as busy rules (foreign `site_url`). Editing that busy rule no longer overwrites the Google appointment event.
  • Google Calendar: restored `woocommerce_appointments_gcal_sync_updated_description` on event updates (dropped in the 5.0 sync rewrite).
  • Admin panel: changing day or a duration add-on no longer jumps the form scroll back to the top of the mini calendar.
v5.4.9Unavailable
August 15, 20263.0 MBScanned
Improved
  • Admin panel create: WooCommerce Deposits uses the same outlined card as billing, with pay-deposit guidance and payment plans only while paying a deposit.
Other
  • Performance - Admin panel browse: month availability includes the day’s time slots in one request; open browse joins the in-flight prefetch.
  • Dev - Browse helpers: one `day_slots_by_date` map with shared month/day cache keys; dropped unused month abort wiring.
  • Dev - Tests: CartCheckoutLiveTest covers session load reverting `was-in-cart` holds and inactive-cart cleanup skipping order-linked holds.
  • Dev - Tests: AddonDurationSlotListingLiveTest covers get_slots AJAX listing vs cart for +60m, +30m, −30m, minute-unit, and span=start.
  • Dev - Emails: dropped native return/param types on subclassable `WC_Email_*` override points (PHPDoc kept); PHPStan ignores `missingType.return` / `missingType.parameter` on `includes/emails/class-wc-email*`.
Fixed
  • Cart: logging back in during checkout restores the in-cart hold; abandoned-cart cleanup no longer deletes a hold already linked to an order.
  • Admin panel: mini calendar marks a day available only when at least one slot has enough capacity for the quantity field (same rule as the time list).
  • Storefront: time slots refresh for the full add-on duration (longer or shorter), so late starts that no longer fit are removed from the list.
  • Emails: custom theme subclasses of appointment emails no longer fatal on PHP 8 when they override `trigger()` or `init_form_fields()` without a `: void` return type.
  • Storefront: add-ons after the calendar appear once a date (or month) is chosen, so extras that change duration stay visible when no times are left.
  • Admin calendar: third-party admin notices no longer push the grid down; calendar errors still show flush under the toolbar.
v5.4.8Unavailable
August 11, 20263.0 MBScanned
Added
  • Appointable product: set Padding Before and After separately on one row. Existing padding stays Before; After defaults to 0.
Improved
  • Availability / slots: the gap between appointments uses After from the earlier booking plus Before from the later one (timed, day, and shared staff). With only Before set (the default after upgrade), identical products keep the same handoff gap.
  • Admin panel: create/edit recurring uses the same outlined card as billing and add-ons; schedule fields use compact floating labels in one row.
  • Admin calendar: on narrow screens the period title opens a month or date picker (prev/next hide); week and list show a month label; tapping a month day opens Day view and Back returns to that month.
  • Admin panel: create opens upper-biased on narrow screens; tighter floating-label insets; availability dims while checking; status chips match border to label on create/edit; customer search drops the clear control; overnight +Nd sits beside the End date floating label.
  • Admin calendar: Screen Options/Help tuck with a peek and hide the toolbar when open; toolbar stays fixed under the admin bar; borderless period/view controls; wider padding on large screens.
  • Storefront: Customizer Selection color skips inline CSS when it matches the default.
Other
  • Dev - Padding: `padding_duration` remains buffer before; added `get_padding_after_duration()`, `get_padding_after_in_minutes()`, `set_padding_after_duration()`, and `get_padding_before_in_minutes()` (alias of `get_padding_duration_in_minutes()`). Overlap builders and `per_day_booked_totals` reserve both sides; day/month `get_padding_days_for_fully_booked_dates()` expands `(before + after)` days on each side. Meta `_wc_appointment_padding_after_duration` via REST (`padding_after_duration`), product CSV (`Padding after duration`), and WPML / Polylang. Interim cross-product `max()` bridge removed.
  • Dev - Tests: PaddingBeforeAfterLiveTest (timed/day, shared-staff gaps, cancelled, empty-window, dynamic vs indexed); ProductConfigLiveTest and SlotsScenarioTest lock 24h hourly listing and after-only / before+after index parity; ProductConfigCheckLiveTest skips notices on simple products; `wca-when-deps-ready.test.ts` for `wcaShared.whenDepsReady`.
  • Dev - Tests: opt-in `npm run test:php:stress` and `npm run test:php:smoke`; default `npm run test:php` stays full unit+integration. Clean test-blog setup in `tests/phpunit-env.local.example`.
  • Dev - Integrations: `WC_Appointments_Integration_Page_Optimizers` opts form JS out of LiteSpeed / Autoptimize / WP Rocket Delay-Defer on form pages. Appointable product General number/unit widths moved into `admin.scss`.
Fixed
  • Storefront: multi-day day-duration products again highlight the booking span after picking a start day; timezone abbr shows one tip; the form still initializes when page optimizers delay jQuery or script params.
  • Availability / slots: 24h duration with an hourly grid again lists each hour when the next day is also appointable.
  • Admin panel: Select2 aligns on create from Add New; focused fields scroll above the mobile keyboard; mini calendar fits narrow panels; edit keeps Update in the footer (disabled until dirty).
  • Admin panel create: Product Add-Ons date picker no longer closes the panel; footer cost refreshes when add-on prices change without duration.
  • Admin panel: product dropdown lists appointable products again on non-calendar screens; customer search and Customer label translate on standalone create/edit.
  • Admin panel: Pick from calendar keeps the selected day for staff timezones; day/all-day edit availability uses civil dates; mini calendar refreshes when product, staff, or quantity changes; switching product on edit updates date/time for the new type without jumping the panel.
  • Admin panel: staff on unstaffed products is optional for managers only and ignored in availability checks.
  • Admin calendar: Order Total after panel create is correct; narrow layouts keep the filter panel, month cells, and timed events in bounds; day headers stay flush under the fixed toolbar with admin notices below.
  • Admin calendar: midnight appointments show when staff timezone differs from the site; opening a view scrolls to now or 08:00 in week/day, and to the top in month/list.
  • Admin calendar: Screen Options and Help are usable again for admins and staff (WooCommerce sticky header no longer covers them).
  • Admin: legacy Create as a Customer again books for the selected customer; configuration notices no longer appear on non-appointable products.
  • Appointable product: Padding Before/After keeps equal gap when the unit wraps and no longer sits flush against the field above.
v5.4.7Unavailable
August 3, 20263.0 MBScanned
Improved
  • Admin panel: create/edit fields use outlined floating labels (Checkout-style); status uses compact filter chips; attendance is hidden on create, editable on edit, and muted text on view; Pick from a calendar stays a compact trigger until opened.
  • Admin calendar: sticky toolbar and day headers under admin chrome with one page scrollbar; the toolbar docks under the admin bar while you scroll.
  • Admin panel: primary form controls use 14px body text; series list shows date and time ranges on separate lines.
  • Admin panel create: browse no longer auto-opens when a slot is unavailable; Add New without calendar prefill leaves date/time empty (date-only calendar picks still auto-select the first time).
  • Admin panel: product select uses preloaded products (instant); clear (x) removed on create/edit; duplicate titles append SKU or #id; duration sits on the When row; line Total shows only when it differs from order total.
  • Admin calendar: compact one-row toolbar; Add New is a leading filled button (label on wide screens, icon-only on narrow); filter button shows an active-count badge only (selections stay in the filter panel).
  • Admin calendar: hovered and selected events use a white ring plus lift; selected events rise above overlaps.
Other
  • Performance - Admin: calendar/panel product list loads with a light id/title/color query instead of hydrating up to 200 full product objects on every admin load.
  • Performance - Admin panel browse: day availability evaluates each rule once; all-day RRULEs reuse the in-request path instead of rebuilding minutes every civil day.
  • Dev - Tests: AdminCalendarAvailabilityStripeTimezoneLiveTest (PHP) and admin-calendar-availability-rule-timezone Vitest lock civil vs timed stripe timezone policy for staff UTC, Australia/Perth, and America/Los_Angeles.
  • Dev - Tests: SeriesCartCheckoutLiveTest covers series creation on on-hold, processing, completed, and partial-payment (pending is not hooked).
  • Dev - Tests: RuleMinutesRruleCivilDayTest, RruleCivilDayAvailabilityLiveTest, RuleMinutesOvernightApplyEvaluateTest, and OvernightTimeAvailabilityLiveTest cover overnight/all-day RRULE civil-day parity and time:N overnight vs end-at-midnight.
  • Dev - Tests: `SlotsTimezoneLiveTest` and `AdminPanelTimezoneLiveTest` cover store/staff timezone boundaries for slots and panel availability (Fake UTC chip fields).
  • Dev - Tests: IcsExporterStaleEntryRegressionLiveTest covers offset-based store timezones (`gmt_offset` / `+01:00`) so VTIMEZONE generation does not fatal when `getTransitions()` returns false.
  • Dev - Build: `npm run build` runs `test:js` (calendar timezone Vitest) alongside gcal and PHP suites.
Fixed
  • Admin calendar (staff): appointments you create for products without assigned staff stay on the calendar immediately (creator matches the locked staff filter, same as after reload).
  • Admin panel create: real midnight slots (00:00), including admin-TZ midnight, keep a timed calendar preview and availability checkmark (slot timestamp distinguishes them from date-only placeholders).
  • Admin panel: narrow view fills the viewport; series uses panel scroll; customer timezone and cost lines stack; series rows are date | status | open.
  • Admin calendar: switching the appointment panel from view to edit no longer flickers the calendar event (preview ghost only appears after the draft schedule changes).
  • Admin calendar: full-day unavailable stripes stay on the civil day (not shifted by admin timezone); stripe tips on hover/tap instead of a modal; tapping a stripe no longer opens create; empty cells open create again.
  • Admin calendar: sticky WooCommerce header chrome scoped to the calendar page only; staff Screen Options/Help no longer inflate Firefox scroll; empty preload ranges still seed so first paint skips REST; availability rules load again when indexed cache is enabled.
  • Admin calendar SSE: after a recurring series materializes, the view panel gets the full occurrence list and package pricing; one series create snackbar with customer and pattern.
  • Admin calendar SSE: new appointments stay after month navigation (cache insert); payloads build only when queued and flush once per request; burst creates/bookings collapse to one snackbar count.
  • Admin calendar/panel (staff): product preload respects Create Appointments for Any Product; create auto-selects the logged-in staff when assigned; toolbar Add New uses the same path as slot-pick (no full reload).
  • Admin panel create: required date/time errors show under those fields and clear when valid; hourly auto-select no longer rolls the form date forward when staff timezone differs from the site.
  • Admin panel: Staff field shows or hides from product preload (same as add-ons); create availability responds faster; day-duration
v5.4.6Unavailable
July 30, 20263.0 MBScanned
Other
  • Dev - Tests: global-only availability with indexing enabled (plain and staff products), index readiness ignoring malformed scoped cache rows, and product config probe when global rules start after the initial 14-day window.
Fixed
  • Admin panel: product configuration probe scans the booking horizon in capped chunks (14/30/60 days) instead of only the next two weeks, so global rules or RRULEs with a later start do not trigger false "no bookable times" notices.
  • Indexed availability: index readiness and multi-staff slot generation align with fetch guards (malformed scope rows no longer mark the index ready; empty indexed batch falls back to dynamic/global rules); fixes global-only rules not applying and false product config notices after 5.4.5.
v5.4.4Unavailable
July 27, 20262.9 MBScanned
Other
  • Dev - PHPStan raised to level 5 — type narrowing, expanded plugin and WordPress stubs, and dead-code cleanup across admin, data stores, API, GCal, and integrations (clean baseline).
Fixed
  • Product Add-ons integration: decode jQuery `.serialize()` form payloads with `wp_unslash()` before `parse_str()` in legacy cost filter.
  • Admin calendar: guest customer labels on HPOS stores read billing from `wc_order_addresses` (not legacy `_billing_*` order meta), restoring "Name (Guest)" on calendar preload and SSE updates.
v5.4.3Unavailable
July 26, 20262.9 MBScanned
Other
  • Performance - Admin calendar preload: eligible-ID query plus batched postmeta hydration; batched order meta (no per-order WC_Order hydration). Recurring series package summary on bulk fetch (`get_panel_preload`, one load per series id); full appointment panel still loads on open.
  • Dev - PHPCS: WPCS security ruleset (`phpcs.security.ruleset.xml`, `npm run lint:php:security`), shared path rulesets and request helpers; `lint:php` / build gate runs security scan + PHPStan; optional `lint:php:standards` / `lint:php:quality`; PHP-CS-Fixer via `format:php`.
  • Dev - PHPStan raised to level 4 — dead-code cleanup across admin, slots, API, GCal, and core (clean baseline).
  • Dev - Rate limiting: filterable `enabled`, `guest_only`, and `strict_max_requests`; named guest-read defaults on `WC_Appointments_Rate_Limiter`.
  • Dev - Tests: `PublicAjaxSecurityLiveTest`, `PhpstanLevel4RegressionLiveTest`, `IcsExporterStaleEntryRegressionLiveTest`, `MyAccountRescheduleContractLiveTest`, `CalendarPreloadParityLiveTest` (calendar preload vs independent eligibility SQL; non-UTC and all-day; attribute term labels), `RequestBoundaryRegressionLiveTest`, `SanitizerBeforeParseGuardTest`, and `SseTopicContractVerificationTest` (request transport boundaries, PHP/JS SSE topic contract, FC week/day header zone).
  • Breaking change - Availability: `decode_rules_from_post()` requires the unslashed POST array argument (no default); third-party save handlers must pass `wp_unslash( $_POST )`.
Removed
  • `WC_Product_Appointment_Rule_Manager::get_minutes_from_rules()` remains as a compatibility shim; use `WC_Appointment_Slots_Rule_Resolver::build_minute_mask()` instead.
Improved
  • Admin panel: remove Cancel from create/edit footer (close via X / backdrop).
  • Admin calendar: Google-style grid (horizontal week lines only in month, stacked week/day headers, centered month dates); neutral toolbar chrome (admin body text/borders), segmented view switcher, primary + Add New beside Filters (icon-only; label on hover/aria).
  • ICS export: log a warning when unloadable entries are skipped (WooCommerce → Status → Logs).
Fixed
  • Admin calendar: toolbar spans full wrap width below Screen Options/Help; staff without WooCommerce header get Add New in the toolbar; staff/creator filter uses EXISTS (not INNER JOINs); Fake UTC civil preload range and `YmdHis` row parsing (not `strtotime`); shared excluded-status list (cancelled visible; holds/trash/drafts hidden) on SQL query, legacy API, and frontend; orphan/deleted `post_parent` order IDs pre-filtered before batch order load; availability rule background stripes reload when switching months.
  • REST API: appointments `get_item_schema()` extends the parent schema instead of starting from null.
  • Security: sanitize/unslash POST/GET at origin across storefront AJAX, data stores, cart, SSE, cron, widget, admin (AJAX, settings, calendar, list table, exporters, meta boxes, product edit), WPML, Google Calendar, and integrations; prepared SQL for lookups and migrations; escape output in admin views; guest-only rate limit preserved for cached pages with optional nonces.
  • Storefront/admin AJAX: parse jQuery `.serialize()` form payloads before per-field sanitization (not `sanitize_text_field()` on the encoded string — destroys `%XX` sequences for timezones, times, and add-on text).
  • SSE: preserve dotted event names (`appointment.created`) in the stream; `sanitize_key()` stripped dots and broke admin calendar live updates.
  • Availability rules JSON: decode unslashed payloads first (callers pass `wp_unslash( $_POST )`); double-unslash broke rule titles containing quotes.
  • Admin calendar: week/day column headers use browser-local date (not UTC parts); legacy week/day `data-time` and `calendar_day=` links use site timezone (not `gmdate`); batched order line item meta resolves global attribute term names (not raw slugs) in the appointment panel.
  • Add Appointment and My Account series actions: read `REQUEST_METHOD` from `$_SERVER` (not `filter_input( INPUT_SERVER )`, unreliable under some SAPIs).
  • Legacy install migration: delete product availability post meta by key after table migration (not a single rule value).
  • ICS export: skip unloadable appointment entries so stale IDs do not fatal calendar generation.

Why archive

Sometimes the latest release isn't the one you need. The archive lets you pin BookingWP - #1 WordPress Appointment Booking Plugin to a known-good version, or roll back while a bug is investigated. Every release stays scanned and reachable.