| 开发者 | tscholene |
|---|---|
| 更新时间 | 2026年5月30日 22:12 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 6.9 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
[appointly_calendar]: Display the booking calendar[appointly_calendar service="2"]: Calendar for a specific service[appointly_form service="2"]: Standalone booking formappointly folder to /wp-content/plugins/[appointly_calendar] to any page or post, or use the "Booking Calendar" Gutenberg blockNo PHP dependencies. The free plugin is fully self-contained and works offline. The admin SPA is bundled with @wordpress/scripts and ships with its own translation files. Google Fonts (Instrument Serif, Plus Jakarta Sans, DM Mono) are loaded on admin pages only for the Appointly brand typography. This is documented in the "External services" section below. No fonts or third-party assets are loaded on customer-facing booking pages.
Yes. Each [appointly_calendar] shortcode creates an independent instance.
Yes. All strings are translatable via the standard WordPress .po/.mo system. German translations are included for de_DE, de_DE_formal, de_AT, de_CH, and de_CH_informal. The admin React bundle also ships per-bundle .json translation files so all admin UI strings render in the selected language. You can override the customer-facing email language independently of the site language under Booking → Settings → General → Email Language.
The free plugin ships ten default HTML email templates that are fully translatable through the standard WordPress translation system. If you need to rewrite the copy beyond translation, you can either override the templates in a child theme via the standard WordPress template loader, or use the live preview template editor in Appointly Pro.
The free plugin does not collect online payments directly. The booking flow supports manual / offline payment arrangements: when you send an offer, you state the price, the customer accepts, and you handle payment out-of-band (invoice, bank transfer, cash on arrival, etc.). Online payment collection via Stripe, using your own Stripe keys, will be available through Appointly Pro in a later release.
Unlike most booking and appointment plugins that push automatic scheduling, Appointly is built around a personal offer workflow. You receive booking requests, review them personally, and send customised offers. This gives service providers full control over their calendar, pricing, and customer communication, perfect for businesses where every reservation deserves a personal touch.
Visit https://appointly.tscholene.com to subscribe. When you subscribe, you receive a download link and a license key via email. You install Appointly Pro as a second plugin (Plugins → Add New → Upload Plugin) alongside this free plugin, paste your license key under Appointly → License, and the Pro features activate. The installation takes about two minutes. Appointly Pro is NOT distributed through the WordPress.org Plugin Directory. It is sold directly on appointly.tscholene.com via Lemon Squeezy, which handles EU VAT, subscriptions, failed payments, the customer portal, and refunds. Appointly Pro coexists with this free plugin in one admin menu, no duplicate menu entries, no configuration conflicts, and Pro can be removed independently without affecting any of your booking data.
appointly-cal__slots container is now hidden alongside the selectedSlot reset.STATUS_OFFERED, send_offer, action appointly_booking_offered, email-template keys offer, admin_offer_accepted) are unchanged — no DB migration, no Pro plugin breakage, no translation churn.SELECT ... FOR UPDATE row-lock around the insert so two concurrent customers cannot book the same slot.appointly_slot_configs columns (buffer_minutes) on the appointly_booking_services table. Existing booking_mode, slot_start, slot_end, slot_duration columns are now actively populated by Free (previously reserved for Pro).GET /wp-json/appointly/v1/calendar/{service_id}/slots?date=YYYY-MM-DD returning the generated slot list with per-slot availability.{time}, {time_start}, {time_end} resolved from time_slot_start / time_slot_end. The existing {date} placeholder is automatically augmented to "10.05.2026 at 09:00 – 09:30" for timeslot bookings and stays "10.05.2026" for day-mode bookings — default email templates are NOT changed so existing translations keep working unchanged.appointly_booking_pre_save_validation (Pro extension point — used by upcoming Pro 1.0.0 per-weekday availability editor).appointly_slot_generation_strategy — lets Pro 1.0.0 substitute the flat daily slot grid with a weekday-aware grid.CalendarService::get_availability() now respects the booking mode — for timeslot services, a day is marked "booked" only when every slot is taken, and "free" as long as at least one slot is still bookable.APPOINTLY_DB_VERSION bumped to 2.1.0 so existing installs pick up the new buffer_minutes column via dbDelta.{date} placeholder for timeslot bookings. All other default email template strings are unchanged.SettingsRepository::get_default_templates() — booking_reminder (sent to clients before their appointment) and admin_daily_digest (daily summary of confirmed bookings to the admin). Both are dormant in Free; they are activated by Appointly Pro 0.7.0 or later, which provides the cron-driven sending logic. No user-facing changes in Free 2.0.12 itself from these templates.APPOINTLY_DB_VERSION bumped to 2.0.12 so existing installs pick up the new template defaults via the standard upgrade path.appointly_email_template in SettingsRepository::get_email_template(). Free plugin behavior unchanged (no callback registered = defaults returned). Appointly Pro 0.6.0 registers a license-gated callback to inject admin-customized subject and body lines.wpbk_response_page_id when upgrading from pre-2.0.7 installs where the prefix migration may have been skipped — prevents a duplicate "Booking Response" page in the frontend menu.wp_list_pages() exclusion arrays (belt-and-suspenders on top of the existing get_pages filter) for broader block-theme compatibility.appointly_branding_primary_color, appointly_branding_accent_color, appointly_branding_logo_url) used by frontend shortcodes and email templates. Free plugin behavior is unchanged (defaults to blue/green and the site name as text logo). Appointly Pro 0.5.0 uses these hooks to inject custom branding.wp_enqueue_media(), so window.wp.media was unavailable and the picker silently fell back to an alert.appointly / APPOINTLY_ / Appointly\ per WordPress.org plugin review guidance. Database tables, options, hooks, constants, namespaces, REST namespace, script handles, JS globals, and CSS classes/custom properties were all unified under a single plugin-specific prefix.wp_mail() with wp_mail_failed hook for error capture.manage_bookings capability is now ensured on every admin_init as a safety net for file-overwrite upgrades that skip the activation hook.wpbk_* to appointly_*. CSS custom properties renamed from --wpbk-* to --appointly-*. REST namespace changed from wp-booking/v1 to appointly/v1.wpbk_booking_initial_status so Appointly Pro can implement direct-booking workflows (per-service auto-confirm).booking_confirmed + admin_new_booking, inquiry bookings keep the existing pair.admin_new_booking for admin notifications on direct bookings.Accept was "Angebot annehmen", Cancel Offer was "Angebot annehmen", Price on request was "Offene Anfragen", Decline Booking was "Buchung stornieren").[appointly_calendar], [appointly_form], [appointly_response].wp-booking/calendar to appointly/calendar (reserved wp- prefix removed).custom_fields_meta enrichment in the booking REST response). Both get_booking and update_booking endpoints include the meta so labels persist across status changes.min, max, and maxlength HTML5 attributes from the field definition. Browser gives the customer immediate client-side feedback before hitting server-side validation._wpbk_auto_created post meta. The uninstaller finds it via meta-query so it's robust against admin renaming, recreating, or relocating the page.?year=...&month=... to the REST base URL, but the "ugly" REST URL form (/index.php?rest_route=/wp-booking/v1/) already contains a ?, producing URLs with two ? that the REST router treated as part of the route name and returned 404. Calendar now correctly uses & when the base URL already contains a query string. Affects all WP installs that haven't switched permalinks to "Post name" — long-standing bug, was already broken in 2.0.0 and earlier.includes/Core/License.php, Limits.php) is gone entirely. Every existing feature is now unconditionally available: unlimited services, unlimited bookings, unlimited custom fields, unlimited add-ons per service, day and timeslot scheduling, automatic offer / confirmation emails, blocked dates calendar, multi-day bookings, and SMTP delivery are all free..wpbk-admin, mirroring the website design system.wpbk_booking_created, wpbk_booking_offered, wpbk_booking_confirmed, wpbk_booking_declined, wpbk_booking_cancelled) and filter hooks (wpbk_booking_can_cancel, wpbk_calendar_availability, wpbk_email_placeholders) plus JavaScript extension globals (window.wpbkAdmin.proNavItems, window.wpbkAdmin.proRoutes) so the upcoming Appointly Pro plugin can dock in without requiring any further changes to the free plugin. These are silent no-ops when Pro is not installed.tscholene. Added justification docblocks to every REST route using permission_callback => __return_true. Removed the redundant load_plugin_textdomain() init-time call (WordPress 4.6+ auto-loads from languages/ for wp.org plugins; the EmailService runtime call stays because it is load-bearing for the email_language override).wpbk_analytics table is no longer created on activation. Existing installs retain the table until uninstall. Booking rows retain the payment_method and payment_status columns for backwards compatibility but new bookings leave them null.wpbk_settings option is ignored from 2.0.0 onwards and removed on uninstall. No user action required.booking_mode = 'timeslot' continue to work exactly as before — timeslot scheduling is now a free feature, not a Pro gate.