{"id":48777,"date":"2016-06-06T15:29:01","date_gmt":"2016-06-06T15:29:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins-wp\/appointmentsw\/"},"modified":"2026-06-11T15:44:23","modified_gmt":"2026-06-11T15:44:23","slug":"appointmentsw","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/appointmentsw\/","author":11708513,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.0","stable_tag":"2.0.0","tested":"7.0","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Appointment SW","header_author":"eggemplo","header_description":"","assets_banners_color":"7eb478","last_updated":"2026-06-11 15:44:23","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.growthplugins.com","header_plugin_uri":"https:\/\/www.eggemplo.com","header_author_uri":"https:\/\/www.eggemplo.com","rating":0,"author_block_rating":0,"active_installs":10,"downloads":2411,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"eggemplo","date":"2016-06-06 15:29:56"},"1.1":{"tag":"1.1","author":"eggemplo","date":"2016-08-30 13:52:30"},"1.2":{"tag":"1.2","author":"eggemplo","date":"2016-12-26 18:17:48"},"1.3":{"tag":"1.3","author":"eggemplo","date":"2024-03-29 07:35:21"},"2.0.0":{"tag":"2.0.0","author":"eggemplo","date":"2026-06-11 15:44:23"}},"upgrade_notice":{"2.0.0":"<p>Major release. Backwards compatible with 1.x shortcodes, data and options, but raises PHP to 7.4 and WordPress to 6.4. Always test on staging before updating production.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":0},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":1431610,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":1431610,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":1431618,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0","1.1","1.2","1.3","2.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3060948,"resolution":"1","location":"assets","locale":"","width":1315,"height":513},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3060948,"resolution":"2","location":"assets","locale":"","width":524,"height":637},"screenshot-3.png":{"filename":"screenshot-3.png","revision":1431539,"resolution":"3","location":"assets","locale":"","width":1242,"height":323},"screenshot-4.png":{"filename":"screenshot-4.png","revision":1431539,"resolution":"4","location":"assets","locale":"","width":1210,"height":816},"screenshot-5.png":{"filename":"screenshot-5.png","revision":1431539,"resolution":"5","location":"assets","locale":"","width":1206,"height":442},"screenshot-6.png":{"filename":"screenshot-6.png","revision":1431539,"resolution":"6","location":"assets","locale":"","width":1251,"height":306},"screenshot-7.png":{"filename":"screenshot-7.png","revision":1431539,"resolution":"7","location":"assets","locale":"","width":741,"height":634},"screenshot-8.png":{"filename":"screenshot-8.png","revision":1562164,"resolution":"8","location":"assets","locale":"","width":1893,"height":730},"screenshot-9.png":{"filename":"screenshot-9.png","revision":1562164,"resolution":"9","location":"assets","locale":"","width":1886,"height":729}},"screenshots":{"1":"Booking form with the new confirmation modal.","2":"Admin calendar with live client search and inline <em>Add client<\/em> button.","3":"Settings page with arbitrary time windows.","4":"Frontend pages section: one-click create for every shortcode.","5":"My appointments view for logged-in users."}},"plugin_section":[],"plugin_tags":[8132,269,416,1475,4685],"plugin_category":[40],"plugin_contributors":[83315],"plugin_business_model":[],"class_list":["post-48777","plugin","type-plugin","status-publish","hentry","plugin_tags-appointments","plugin_tags-booking","plugin_tags-calendar","plugin_tags-reservations","plugin_tags-scheduler","plugin_category-calendar-and-events","plugin_contributors-eggemplo","plugin_committers-eggemplo"],"banners":{"banner":"https:\/\/ps.w.org\/appointmentsw\/assets\/banner-772x250.png?rev=1431618","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/appointmentsw\/assets\/icon-128x128.png?rev=1431610","icon_2x":"https:\/\/ps.w.org\/appointmentsw\/assets\/icon-256x256.png?rev=1431610","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/appointmentsw\/assets\/screenshot-1.png?rev=3060948","caption":"Booking form with the new confirmation modal."},{"src":"https:\/\/ps.w.org\/appointmentsw\/assets\/screenshot-2.png?rev=3060948","caption":"Admin calendar with live client search and inline <em>Add client<\/em> button."},{"src":"https:\/\/ps.w.org\/appointmentsw\/assets\/screenshot-3.png?rev=1431539","caption":"Settings page with arbitrary time windows."},{"src":"https:\/\/ps.w.org\/appointmentsw\/assets\/screenshot-4.png?rev=1431539","caption":"Frontend pages section: one-click create for every shortcode."},{"src":"https:\/\/ps.w.org\/appointmentsw\/assets\/screenshot-5.png?rev=1431539","caption":"My appointments view for logged-in users."},{"src":"https:\/\/ps.w.org\/appointmentsw\/assets\/screenshot-6.png?rev=1431539","caption":""},{"src":"https:\/\/ps.w.org\/appointmentsw\/assets\/screenshot-7.png?rev=1431539","caption":""},{"src":"https:\/\/ps.w.org\/appointmentsw\/assets\/screenshot-8.png?rev=1562164","caption":""},{"src":"https:\/\/ps.w.org\/appointmentsw\/assets\/screenshot-9.png?rev=1562164","caption":""}],"raw_content":"<!--section=description-->\n<p>Appointment SW lets visitors book appointments from any page on your site. You configure as many working windows per day as you need, block holidays, optionally allow guest bookings, and Appointment SW takes care of slot availability, email notifications and capability checks.<\/p>\n\n<p>Version 2.0 is a deep modernisation of the original plugin while keeping every shortcode, option and database table from 1.x in working order. Existing sites can update without re-doing setup.<\/p>\n\n<h4>What's new in 2.0<\/h4>\n\n<ul>\n<li>Modern booking flow: clicking a free slot opens a confirmation modal \u2014 no more page reloads to advance the booking.<\/li>\n<li>Admin booking modal with live client search and an inline \"Add client\" button, so receptionists can book a brand new client without leaving the calendar.<\/li>\n<li>Arbitrary number of time windows per day (not just two).<\/li>\n<li>Server-rendered Settings page using the WordPress Settings API, with an onboarding section that creates the shortcode pages for you in one click.<\/li>\n<li>Public REST API under <code>\/wp-json\/appointmentsw\/v1\/<\/code> for availability, bookings, holidays, settings, and user search.<\/li>\n<li>Capability-based permissions: <code>appointmentsw_manage<\/code> (administer) and <code>appointmentsw_book<\/code> (book a slot).<\/li>\n<li>Prepared statements across every database query, plus new indexes on bookings, bookmeta and holidays for faster lookups on busy calendars.<\/li>\n<li>Hardened request dispatcher: strict capability checks, sanitized input and escaped output throughout.<\/li>\n<li>Filterable email templates via <code>appointmentsw\/email\/{event}\/{audience}\/{subject|body}<\/code>.<\/li>\n<li>Optional WooCommerce integration is now a separate companion plugin so this core stays lean.<\/li>\n<\/ul>\n\n<h4>Shortcodes<\/h4>\n\n<ul>\n<li><code>[appointmentsw_form]<\/code> \u2014 booking form for visitors.<\/li>\n<li><code>[appointmentsw_myaccount]<\/code> \u2014 logged-in user appointments (view and cancel).<\/li>\n<li><code>[appointmentsw_admin]<\/code> \u2014 frontend admin calendar with client search and one-click client creation.<\/li>\n<li><code>[appointmentsw_vacations]<\/code> \u2014 block holidays from the frontend.<\/li>\n<\/ul>\n\n<h4>Backwards compatibility<\/h4>\n\n<p>All 1.x shortcodes keep rendering, bundled Bootstrap 3 assets are still enqueued so existing theme overrides keep working, the legacy <code>core\/<\/code> classes remain loaded, and legacy options (<code>asw-guest<\/code>, <code>asw-duration<\/code>, <code>asw-numdays<\/code>, <code>asw-maxoffset<\/code>, <code>asw-start_time_*<\/code>, <code>asw-end_time_*<\/code>) are migrated transparently into the new <code>appointmentsw_settings<\/code> option the first time the new code reads them.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload or extract the <code>appointmentsw<\/code> folder into <code>\/wp-content\/plugins\/<\/code>, or install from the WordPress.org plugin directory.<\/li>\n<li>Activate from the <em>Plugins<\/em> menu.<\/li>\n<li>Go to <em>Appointment SW \u2192 Settings<\/em> to configure duration, working time windows, guest bookings and the admin notification email.<\/li>\n<li>In the same screen, scroll down to <em>Frontend pages<\/em> and click <em>Create page<\/em> next to each shortcode you want available. The plugin creates a published page containing the shortcode and remembers the assignment.<\/li>\n<\/ol>\n\n<p>That's it. Visitors can now book from the booking page, and you can manage everything from <em>[appointmentsw_admin]<\/em> without ever leaving the calendar.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20the%202.0%20update%20break%20my%20existing%20site%3F\"><h3>Will the 2.0 update break my existing site?<\/h3><\/dt>\n<dd><p>No. Every shortcode, legacy option and database table is preserved. The bundled Bootstrap 3 assets stay enqueued, so any theme customisation built on those classes keeps rendering. We test new installs and 1.3 upgrades side by side before each release.<\/p><\/dd>\n<dt id=\"how%20do%20administrators%20book%20an%20appointment%20on%20behalf%20of%20a%20client%3F\"><h3>How do administrators book an appointment on behalf of a client?<\/h3><\/dt>\n<dd><p>Place <code>[appointmentsw_admin]<\/code> on a page (the <em>Frontend pages<\/em> section in Settings does this for you). Click a free slot to open the booking modal, type the first letters of the client's name or email in the search box, pick them and confirm. If you need a brand new client, click <em>+ Add client<\/em> in the calendar toolbar and create them inline \u2014 they appear in the search instantly.<\/p><\/dd>\n<dt id=\"can%20guests%20book%20without%20an%20account%3F\"><h3>Can guests book without an account?<\/h3><\/dt>\n<dd><p>Yes. Enable <em>Allow guest bookings<\/em> in Settings. Guests will be asked for name and email in the booking modal.<\/p><\/dd>\n<dt id=\"where%20do%20i%20find%20the%20rest%20api%3F\"><h3>Where do I find the REST API?<\/h3><\/dt>\n<dd><p>Under <code>\/wp-json\/appointmentsw\/v1\/<\/code>. Routes: <code>availability<\/code>, <code>bookings<\/code> (<code>GET|POST|DELETE<\/code>), <code>holidays<\/code> (<code>GET|POST|DELETE<\/code>), <code>settings<\/code> (<code>GET|POST<\/code>), <code>users\/search<\/code> and <code>users<\/code> (manage capability required).<\/p><\/dd>\n<dt id=\"how%20are%20bookings%20notified%3F\"><h3>How are bookings notified?<\/h3><\/dt>\n<dd><p>The plugin sends an HTML email to the booking user and a notification to the admin (configurable in Settings). Subject and body of every notification are filterable: <code>appointmentsw\/email\/created\/user\/subject<\/code>, <code>appointmentsw\/email\/created\/user\/body<\/code>, and the equivalents for <code>canceled<\/code> and <code>admin<\/code>.<\/p><\/dd>\n<dt id=\"i%20customised%20the%20bundled%20bootstrap%203%20classes%20in%20my%20theme.%20should%20i%20worry%3F\"><h3>I customised the bundled Bootstrap 3 classes in my theme. Should I worry?<\/h3><\/dt>\n<dd><p>No. Bootstrap 3 is still bundled in 2.0 to avoid breaking themes that rely on its classes. We may opt-deprecate it in a future major release but with plenty of warning.<\/p><\/dd>\n<dt id=\"how%20do%20i%20uninstall%20and%20remove%20all%20data%3F\"><h3>How do I uninstall and remove all data?<\/h3><\/dt>\n<dd><p>Set the option <code>appointmentsw_delete_data_on_uninstall<\/code> to <code>true<\/code> before deleting the plugin. Without that opt-in, Appointment SW keeps your bookings, holidays and settings on uninstall.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Settings: server-rendered Settings page (Settings API) with support for an arbitrary number of working time windows per day.<\/li>\n<li>Onboarding: <em>Frontend pages<\/em> section that creates and assigns the shortcode pages in one click.<\/li>\n<li>Booking flow: modal confirmation replaces the multi-step page reload. Reservations now go through the REST API.<\/li>\n<li>Admin booking flow: modal with live user search (debounced) and inline client creation directly from the calendar toolbar.<\/li>\n<li>Capabilities: introduced <code>appointmentsw_manage<\/code> and <code>appointmentsw_book<\/code>, granted automatically to existing roles on activation.<\/li>\n<li>REST API v1 under <code>\/wp-json\/appointmentsw\/v1\/<\/code> with availability, bookings, holidays, settings and users endpoints.<\/li>\n<li>Database: new indexes (<code>status_datetime<\/code>, <code>user_id<\/code>, <code>book_id<\/code> in bookmeta, <code>date<\/code> in holidays), <code>created_at<\/code>\/<code>updated_at<\/code> audit columns, rebuilt bookmeta primary key to allow multiple meta values per booking.<\/li>\n<li>Security: hardened legacy request dispatcher with strict capability checks, sanitisation and escaped output everywhere.<\/li>\n<li>Bugfixes carried over from 1.x: corrected <code>meta_key<\/code> placeholder type, fixed malformed placeholders in holidays SQL and <code>WHERE \u2026 IN (%d)<\/code> queries, removed double-quoted placeholders in <code>prepare<\/code>, replaced direct <code>$_REQUEST['user_email']<\/code> access with sanitised input.<\/li>\n<li>Compatibility: Bootstrap 3 still bundled; legacy shortcodes preserved as-is; legacy <code>asw-*<\/code> options migrated on first read.<\/li>\n<\/ul>\n\n<h4>1.3<\/h4>\n\n<ul>\n<li>WordPress 6.4.3 compatible.<\/li>\n<li>Bundled Bootstrap updated.<\/li>\n<\/ul>\n\n<h4>1.2<\/h4>\n\n<ul>\n<li>Added dashboard Pages section.<\/li>\n<li>Added dashboard Appointments section.<\/li>\n<li>Added <code>[appointmentsw_vacations]<\/code> shortcode.<\/li>\n<\/ul>\n\n<h4>1.1<\/h4>\n\n<ul>\n<li>Added the option to make an appointment without being registered.<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Self-service appointment booking for WordPress. Calendar, arbitrary time windows, holidays, modal booking flow, REST API.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/48777","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=48777"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/eggemplo"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=48777"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=48777"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=48777"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=48777"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=48777"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=48777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}