{"id":324786,"date":"2026-06-20T14:30:59","date_gmt":"2026-06-20T14:30:59","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/clinicpress\/"},"modified":"2026-06-25T10:00:53","modified_gmt":"2026-06-25T10:00:53","slug":"alnora-clinic","status":"closed","type":"plugin","link":"https:\/\/rhg.wordpress.org\/plugins\/alnora-clinic\/","author":23517501,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.2","stable_tag":"1.2.2","tested":"7.0","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"Alnora - Booking for Private Clinics","header_author":"Alnoraclinic","header_description":"Appointment booking for private medical clinics \u2014 doctors, services, schedules, patient records and automated email notifications.","assets_banners_color":"094050","last_updated":"2026-06-25 10:00:53","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/alnora-booking.com","header_author_uri":"https:\/\/profiles.wordpress.org\/alnoraclinic\/","rating":5,"author_block_rating":0,"active_installs":0,"downloads":168,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"alnoraclinic","date":"2026-06-20 14:30:21"},"1.1.0":{"tag":"1.1.0","author":"alnoraclinic","date":"2026-06-20 22:44:29"},"1.1.1":{"tag":"1.1.1","author":"alnoraclinic","date":"2026-06-21 06:07:12"},"1.2.0":{"tag":"1.2.0","author":"alnoraclinic","date":"2026-06-21 10:15:37"},"1.2.1":{"tag":"1.2.1","author":"alnoraclinic","date":"2026-06-25 07:49:17"},"1.2.2":{"tag":"1.2.2","author":"alnoraclinic","date":"2026-06-25 10:00:53"}},"upgrade_notice":{"1.2.2":"<p>Important data-safety fix: your data is now preserved when the plugin is deleted (removed only if you opt in). Recommended for all users.<\/p>","1.2.1":"<p>Adds built-in translations for the booking form and patient emails in 13 languages, and fixes a booking error caused by duplicate reference numbers.<\/p>","1.2.0":"<p>Adds patient self-cancellation links in booking emails and a minimum cancellation notice setting.<\/p>","1.1.1":"<p>Fixes a permissions error when opening some settings sub-pages. Recommended for all 1.1.0 users.<\/p>","1.1.0":"<p>Adds search to the Appointments and Patients lists, a past-appointments filter, faster admin rendering, and status help. No database or configuration changes.<\/p>","1.0.0":"<p>Initial release \u2014 no upgrade steps required.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3579856,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3579856,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3579856,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3579856,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"alnora-clinic\/booking-form":{"name":"alnora-clinic\/booking-form","title":"Alnora Booking"}},"tagged_versions":["1.0.0","1.1.0","1.1.1","1.2.0","1.2.1","1.2.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3579856,"resolution":"1","location":"assets","locale":"","width":1809,"height":881},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3579856,"resolution":"2","location":"assets","locale":"","width":1807,"height":884},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3579856,"resolution":"3","location":"assets","locale":"","width":1822,"height":839},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3579856,"resolution":"4","location":"assets","locale":"","width":1824,"height":851},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3579856,"resolution":"5","location":"assets","locale":"","width":1825,"height":846},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3579990,"resolution":"6","location":"assets","locale":"","width":1038,"height":573},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3579990,"resolution":"7","location":"assets","locale":"","width":1032,"height":646},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3579990,"resolution":"8","location":"assets","locale":"","width":1028,"height":801},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3579990,"resolution":"9","location":"assets","locale":"","width":1030,"height":840}},"screenshots":{"1":"The multi-step booking wizard as patients see it on the front end.","2":"The appointments list with inline status control.","3":"The doctor profile editor with working hours and break configuration.","4":"The dashboard with appointment stats at a glance.","5":"The settings screen with autosave."}},"plugin_section":[],"plugin_tags":[8132,269,43578,15159,10315],"plugin_category":[40],"plugin_contributors":[268082],"plugin_business_model":[],"class_list":["post-324786","plugin","type-plugin","status-closed","hentry","plugin_tags-appointments","plugin_tags-booking","plugin_tags-clinic","plugin_tags-doctor","plugin_tags-medical","plugin_category-calendar-and-events","plugin_contributors-alnoraclinic","plugin_committers-alnoraclinic"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/alnora-clinic_094050.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/alnora-clinic\/assets\/screenshot-1.png?rev=3579856","caption":"The multi-step booking wizard as patients see it on the front end."},{"src":"https:\/\/ps.w.org\/alnora-clinic\/assets\/screenshot-2.png?rev=3579856","caption":"The appointments list with inline status control."},{"src":"https:\/\/ps.w.org\/alnora-clinic\/assets\/screenshot-3.png?rev=3579856","caption":"The doctor profile editor with working hours and break configuration."},{"src":"https:\/\/ps.w.org\/alnora-clinic\/assets\/screenshot-4.png?rev=3579856","caption":"The dashboard with appointment stats at a glance."},{"src":"https:\/\/ps.w.org\/alnora-clinic\/assets\/screenshot-5.png?rev=3579856","caption":"The settings screen with autosave."},{"src":"https:\/\/ps.w.org\/alnora-clinic\/assets\/screenshot-6.png?rev=3579990","caption":""},{"src":"https:\/\/ps.w.org\/alnora-clinic\/assets\/screenshot-7.png?rev=3579990","caption":""},{"src":"https:\/\/ps.w.org\/alnora-clinic\/assets\/screenshot-8.png?rev=3579990","caption":""},{"src":"https:\/\/ps.w.org\/alnora-clinic\/assets\/screenshot-9.png?rev=3579990","caption":""}],"raw_content":"<!--section=description-->\n<p>Alnora replaces the usual tangle of a generic booking plugin + spreadsheets with one focused product made for private clinics with 1\u201310 doctors: dentists, psychologists, cosmetic clinics, dermatologists, physiotherapists and GPs.<\/p>\n\n<p>Features in this version:<\/p>\n\n<ul>\n<li>Doctor profiles with photo, specialisation, bio, languages and per-doctor weekly working hours (with breaks).<\/li>\n<li>Bookable services with duration, buffer time, price and colour.<\/li>\n<li>A modern, multi-step booking wizard for patients (choose doctor \u2192 service \u2192 date &amp; time \u2192 details), embeddable via shortcode or Gutenberg block.<\/li>\n<li>A slot-availability engine that respects working hours, breaks, buffers, existing bookings and your booking window.<\/li>\n<li>Patient records with email\/phone encrypted at rest (AES-256) and a SHA-256 email hash for lookups.<\/li>\n<li>GDPR consent capture with timestamp + IP logging.<\/li>\n<li>Transactional emails: booking confirmation to the patient, notification to the clinic, status-change emails and automatic reminders (hourly cron).<\/li>\n<li>A clean, branded wp-admin: dashboard with stats, appointment list with inline status control, plus doctor, service, patient and settings screens.<\/li>\n<li>REST API under the <code>alnora-clinic\/v1<\/code> namespace.<\/li>\n<\/ul>\n\n<p><strong>Languages<\/strong><\/p>\n\n<p>The patient-facing booking form and the transactional emails are available in 13 languages out of the box \u2014 English, German, French, Spanish, Italian, Dutch, Polish, Czech, Swedish, Danish, Norwegian, Ukrainian and Russian \u2014 chosen with a single <strong>Patient language<\/strong> setting (independent of your site language). Every string is translation-ready via the <code>alnora-clinic<\/code> text domain and standard <code>.mo<\/code>\/<code>.po<\/code> files, so you can add or refine languages with tools like Loco Translate. (Localised month names in email dates additionally require the matching WordPress language to be installed under Settings \u2192 General \u2192 Site Language.)<\/p>\n\n<h3>Notes for developers<\/h3>\n\n<ul>\n<li>The booking form and admin tables are dependency-free <strong>vanilla JavaScript<\/strong> (no build step required). The optional Gutenberg block uses <code>wp.element<\/code> and also needs no build step.<\/li>\n<li>For production, define a fixed encryption key in <code>wp-config.php<\/code>:\n  define( 'ALNC_ENCRYPTION_KEY', 'your-32-char-random-key-here' );\nIf omitted, a key is generated and stored once in the options table so the plugin works out of the box.<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin does not connect to, or send any data to, external services. All assets (fonts, scripts and styles) are bundled with the plugin and served from your own site.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>alnora-clinic<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate <strong>Alnora<\/strong> through the <em>Plugins<\/em> menu in WordPress. On activation the plugin creates its database tables, custom roles and a <strong>Book an Appointment<\/strong> page containing the booking shortcode.<\/li>\n<li>Go to <strong>Alnora \u2192 Doctors<\/strong> and add at least one doctor (set their working hours).<\/li>\n<li>Go to <strong>Alnora \u2192 Services<\/strong> and add at least one service.<\/li>\n<li>Visit the auto-created booking page (link shown under <strong>Alnora \u2192 Settings<\/strong>) to test a booking.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20booking%20form%20work%20with%20any%20theme%3F\"><h3>Does the booking form work with any theme?<\/h3><\/dt>\n<dd><p>Yes. The booking wizard is rendered inside a scoped <code>.alnc-booking<\/code> container with its own styles. A small CSS reset neutralises common theme interference (button padding, box-shadow, etc.).<\/p><\/dd>\n<dt id=\"how%20do%20i%20embed%20the%20booking%20form%3F\"><h3>How do I embed the booking form?<\/h3><\/dt>\n<dd><p>Place the shortcode <code>[alnora_booking]<\/code> on any page, or use the <strong>Alnora Booking Form<\/strong> Gutenberg block. A <strong>Book an Appointment<\/strong> page is created automatically on activation.<\/p><\/dd>\n<dt id=\"can%20i%20pre-select%20a%20doctor%20or%20service%20in%20the%20shortcode%3F\"><h3>Can I pre-select a doctor or service in the shortcode?<\/h3><\/dt>\n<dd><p>Yes. Use <code>[alnora_booking doctor=\"1\" service=\"2\"]<\/code> where the numbers are the doctor\/service IDs shown in their respective admin screens.<\/p><\/dd>\n<dt id=\"is%20patient%20data%20stored%20securely%3F\"><h3>Is patient data stored securely?<\/h3><\/dt>\n<dd><p>Patient email and phone are encrypted at rest using AES-256. A SHA-256 hash of the email is stored separately for lookups. GDPR consent is recorded with a timestamp and IP address.<\/p><\/dd>\n<dt id=\"how%20many%20doctors%20can%20i%20add%3F\"><h3>How many doctors can I add?<\/h3><\/dt>\n<dd><p>There is no limit \u2014 add as many doctors as your clinic needs, each with their own profile, working hours and services.<\/p><\/dd>\n<dt id=\"where%20do%20i%20configure%20email%20notifications%3F\"><h3>Where do I configure email notifications?<\/h3><\/dt>\n<dd><p>Go to <strong>Alnora \u2192 Settings \u2192 Email &amp; reminders<\/strong>. You can set the from name, from address, admin notification email and reminder lead time.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20wpml%20or%20polylang%3F\"><h3>Does it work with WPML or Polylang?<\/h3><\/dt>\n<dd><p>All strings are translation-ready via the <code>alnora-clinic<\/code> text domain. Full WPML\/Polylang compatibility is planned for a future release.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Fix (important): deleting the plugin no longer erases your data. Doctors, services, patients, appointments and settings are now kept on uninstall so they survive a reinstall; data is removed only if you explicitly enable \"Delete all data when the plugin is uninstalled\" under Settings \u2192 GDPR.<\/li>\n<li>Improvement: removed the WordPress admin focus ring on settings toggle checkboxes for a cleaner look.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>New: built-in translations for the booking form and patient emails in 13 languages (English, German, French, Spanish, Italian, Dutch, Polish, Czech, Swedish, Danish, Norwegian, Ukrainian, Russian), selectable via the new <strong>Patient language<\/strong> setting.<\/li>\n<li>New: patient emails are now sent in the configured Patient language regardless of the site language.<\/li>\n<li>Improvement: translations now use standard WordPress <code>.mo<\/code>\/<code>.po<\/code> language files (editable with Loco Translate) and ship a complete <code>.pot<\/code>.<\/li>\n<li>Fix: appointment reference numbers could collide after an appointment was deleted, causing a \"Could not save the appointment\" error on booking. References are now generated reliably.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: patients can cancel their own appointment via a secure link included in the appointment confirmation email.<\/li>\n<li>New: \"Minimum cancellation notice (hours)\" setting under Booking rules \u2014 controls how close to the appointment a patient may still cancel online (set to 0 to allow any time before the appointment).<\/li>\n<li>New: cancelled appointments show a tooltip in the Appointments list indicating whether they were cancelled by the client or the clinic.<\/li>\n<li>New: the clinic receives a notification email when a patient cancels their own appointment.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fix: settings sub-pages (Shortcodes, Booking rules, Email &amp; reminders, GDPR) could return \"Sorry, you are not allowed to access this page\". They are now hidden from the sidebar without affecting access.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: search the Appointments list by reference, patient name, email or phone.<\/li>\n<li>New: search the Patients list by name, email or phone.<\/li>\n<li>New: the Appointments list now hides past days by default, with a \"Show past appointments\" button to reveal them (today's appointments stay visible so they can still be marked Completed \/ No-show).<\/li>\n<li>New: \"Load more\" on the Appointments list \u2014 the first 10 rows load instantly and more are revealed on demand for faster page rendering.<\/li>\n<li>New: an information icon beside the \"Status\" column header explains what each appointment status means.<\/li>\n<li>Improvement: hidden settings sub-pages are now removed from the admin menu in PHP instead of via a CSS :has() rule, removing an expensive per-interaction style recalculation in the admin.<\/li>\n<li>Improvement: the WordPress media library is now loaded only on the Doctors screen (where the photo uploader needs it), speeding up the other admin pages.<\/li>\n<li>Improvement: consistent button focus styling in the admin.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: doctors, services, working hours, availability engine, booking wizard, patient records, GDPR consent log, transactional emails, reminders and branded admin.<\/li>\n<\/ul>","raw_excerpt":"Appointment booking and clinic management built exclusively for private medical practices.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/324786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=324786"}],"author":[{"embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/alnoraclinic"}],"wp:attachment":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=324786"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=324786"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=324786"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=324786"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=324786"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=324786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}