{"id":340839,"date":"2026-07-21T13:39:59","date_gmt":"2026-07-21T13:39:59","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/aprus-appointment-calendar\/"},"modified":"2026-07-21T13:11:32","modified_gmt":"2026-07-21T13:11:32","slug":"aprus-appointment-calendar","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/aprus-appointment-calendar\/","author":23532584,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.5.0","stable_tag":"2.5.0","tested":"7.0.2","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Aprus Appointment Calendar","header_author":"aprus","header_description":"Lightweight, free appointment booking calendar. Shortcode, widget and Gutenberg block. Two views: monthly and weekly columns. Drag-select availability in admin. Auto-detected Polish \/ English locale.","assets_banners_color":"f2effc","last_updated":"2026-07-21 13:11:32","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/ko-fi.com\/aprus","header_plugin_uri":"","header_author_uri":"https:\/\/aprus.dev","rating":0,"author_block_rating":0,"active_installs":0,"downloads":37,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.5.0":{"tag":"2.5.0","author":"aprus","date":"2026-07-21 13:11:32"}},"upgrade_notice":{"2.4.2":"<p>Layout fix \u2014 a full-height card is guaranteed to contain the calendar with no column overflow.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3617215,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3617215,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3617215,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3617215,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"apruapca\/calendar":{"name":"apruapca\/calendar","title":"Appointment calendar (monthly)"},"apruapca\/calendar-columns":{"name":"apruapca\/calendar-columns","title":"Appointment calendar (columns)"}},"tagged_versions":["2.5.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3617215,"resolution":"1","location":"assets","locale":"","width":680,"height":719},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3617215,"resolution":"2","location":"assets","locale":"","width":1540,"height":341},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3617215,"resolution":"3","location":"assets","locale":"","width":1286,"height":669},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3617215,"resolution":"4","location":"assets","locale":"","width":1286,"height":669},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3617215,"resolution":"5","location":"assets","locale":"","width":1238,"height":998}},"screenshots":{"1":"Monthly calendar view for clients \u2014 pick a day, then a time slot","2":"Weekly column view \u2014 days as columns, slots as rows","3":"Admin availability grid \u2014 drag-select to open\/close many slots at once","4":"Hover a booked slot to see client details and cancel with one click","5":"Plugin settings"}},"plugin_section":[],"plugin_tags":[8132,269,416,1475,4062],"plugin_category":[40],"plugin_contributors":[272646],"plugin_business_model":[],"class_list":["post-340839","plugin","type-plugin","status-publish","hentry","plugin_tags-appointments","plugin_tags-booking","plugin_tags-calendar","plugin_tags-reservations","plugin_tags-schedule","plugin_category-calendar-and-events","plugin_contributors-aprus","plugin_committers-aprus"],"banners":{"banner":"https:\/\/ps.w.org\/aprus-appointment-calendar\/assets\/banner-772x250.png?rev=3617215","banner_2x":"https:\/\/ps.w.org\/aprus-appointment-calendar\/assets\/banner-1544x500.png?rev=3617215","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/aprus-appointment-calendar\/assets\/icon-128x128.png?rev=3617215","icon_2x":"https:\/\/ps.w.org\/aprus-appointment-calendar\/assets\/icon-256x256.png?rev=3617215","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/aprus-appointment-calendar\/assets\/screenshot-1.png?rev=3617215","caption":"Monthly calendar view for clients \u2014 pick a day, then a time slot"},{"src":"https:\/\/ps.w.org\/aprus-appointment-calendar\/assets\/screenshot-2.png?rev=3617215","caption":"Weekly column view \u2014 days as columns, slots as rows"},{"src":"https:\/\/ps.w.org\/aprus-appointment-calendar\/assets\/screenshot-3.png?rev=3617215","caption":"Admin availability grid \u2014 drag-select to open\/close many slots at once"},{"src":"https:\/\/ps.w.org\/aprus-appointment-calendar\/assets\/screenshot-4.png?rev=3617215","caption":"Hover a booked slot to see client details and cancel with one click"},{"src":"https:\/\/ps.w.org\/aprus-appointment-calendar\/assets\/screenshot-5.png?rev=3617215","caption":"Plugin settings"}],"raw_content":"<!--section=description-->\n<p><strong>Aprus Appointment Calendar<\/strong> is a lightweight, no-frills booking plugin. You set your opening hours, drag-select the exact slots you want to be bookable, and clients book through a clean calendar embedded anywhere on your site.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Two client views<\/strong> \u2014 monthly calendar and weekly column layout<\/li>\n<li><strong>Embed anywhere<\/strong> \u2014 <code>[apruapca_calendar]<\/code> shortcode, classic widget or Gutenberg block (<code>Aprus Appointment Calendar<\/code> \/ <code>Aprus Appointment Calendar (columns)<\/code>)<\/li>\n<li><strong>Admin availability grid<\/strong> \u2014 drag-select a rectangle over slots to open or close them in bulk. Booked slots are protected from accidental change.<\/li>\n<li><strong>Appointment duration + break<\/strong> \u2014 control slot generation with duration and buffer between visits<\/li>\n<li><strong>Working days &amp; hours<\/strong> \u2014 per-day-of-week toggle, lead time (earliest booking), calendar range (how far ahead)<\/li>\n<li><strong>Booking popover<\/strong> \u2014 hover a booked slot in admin to see client details and cancel with one click; cancellation sends an e-mail notification<\/li>\n<li><strong>Automatic locale<\/strong> \u2014 Polish or English based on WordPress site language, English by default<\/li>\n<li><strong>Respects your WP settings<\/strong> \u2014 <code>start_of_week<\/code> (Monday vs Sunday), <code>time_format<\/code> (24h \/ 12h AM-PM)<\/li>\n<li><strong>E-mail notifications<\/strong> \u2014 customer + admin messages via <code>wp_mail()<\/code><\/li>\n<li><strong>No accounts required<\/strong> \u2014 clients book by e-mail<\/li>\n<\/ul>\n\n<h4>Free and open source<\/h4>\n\n<p>The plugin is fully free \u2014 no premium tier, no artificially blocked features. If you find it useful, you can <a href=\"https:\/\/ko-fi.com\/aprus\">buy me a coffee on Ko-fi<\/a> or on <a href=\"https:\/\/buycoffee.to\/aprus\">buycoffee.to<\/a>. It helps me keep the project maintained.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin stores appointment data (name, e-mail, phone, note, date, time) in your own WordPress database. Nothing is sent to third-party servers. E-mails go through the standard <code>wp_mail()<\/code> function.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install from <strong>Plugins \u2192 Add New \u2192 Upload<\/strong><\/li>\n<li>Activate <strong>Aprus Appointment Calendar<\/strong> in the Plugins list<\/li>\n<li>Open <strong>Appointments \u2192 Settings<\/strong>, adjust hours \/ duration \/ working days<\/li>\n<li>Open <strong>Appointments \u2192 Calendar<\/strong> and drag over slots to open them for clients<\/li>\n<li>Add the shortcode <code>[apruapca_calendar]<\/code> (or <code>[apruapca_calendar view=\"columns\"]<\/code>) to any page\/post, or drop the block\/widget on your site<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20display%20the%20weekly%20column%20view%3F\"><h3>How do I display the weekly column view?<\/h3><\/dt>\n<dd><p>Use <code>[apruapca_calendar view=\"columns\"]<\/code> in the shortcode, or pick <strong>Aprus Appointment Calendar (columns)<\/strong> in the block editor \/ widgets.<\/p><\/dd>\n<dt id=\"can%20clients%20see%20all%20slots%20by%20default%3F\"><h3>Can clients see all slots by default?<\/h3><\/dt>\n<dd><p>No. In this plugin nothing is bookable until you explicitly open slots in <strong>Appointments \u2192 Calendar<\/strong>. Drag over the slots you want to make available.<\/p><\/dd>\n<dt id=\"can%20i%20cancel%20a%20booking%3F\"><h3>Can I cancel a booking?<\/h3><\/dt>\n<dd><p>Yes. In <strong>Appointments \u2192 Calendar<\/strong>, hover a blue (booked) slot \u2014 a popover appears with client details and a \"Cancel booking\" button. The client gets an e-mail notification. You can also cancel from <strong>Appointments \u2192 Bookings<\/strong>.<\/p><\/dd>\n<dt id=\"does%20it%20support%2012-hour%20time%20format%3F\"><h3>Does it support 12-hour time format?<\/h3><\/dt>\n<dd><p>Yes. The calendar reads your <strong>Settings \u2192 General \u2192 Time format<\/strong> \u2014 <code>H:i<\/code> shows 24-hour times (<code>13:00<\/code>), <code>g:i a<\/code> shows 12-hour (<code>1:00 pm<\/code>).<\/p><\/dd>\n<dt id=\"does%20the%20week%20start%20on%20monday%20or%20sunday%3F\"><h3>Does the week start on Monday or Sunday?<\/h3><\/dt>\n<dd><p>Whatever you set in <strong>Settings \u2192 General \u2192 Week starts on<\/strong>.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20phone%20home%20%2F%20call%20external%20services%3F\"><h3>Does the plugin phone home \/ call external services?<\/h3><\/dt>\n<dd><p>No. All data stays in your WordPress database. E-mails use <code>wp_mail()<\/code>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.5.0<\/h4>\n\n<ul>\n<li>Month view now colours each day by availability \u2014 days with open slots get a green tint and dot, fully-booked days are greyed out and not clickable, with a small legend below the calendar<\/li>\n<li>Redesigned the empty \"no free slots\" state (centred icon + message) instead of a cramped line of text<\/li>\n<li>Spam \/ bot protection for the public booking form, all configurable under Settings \u2192 Spam protection (on by default, no external services): honeypot field, time trap (rejects submits faster than a human \u2014 default 3s) and a per-IP rate limit (default 5 bookings \/ 60 min)<\/li>\n<li>Unique prefixes across the whole plugin, per WordPress.org review feedback: functions, classes, constants, options, hooks, nonces, AJAX actions, menu slugs, script\/style handles, widget id, block namespaces and the custom table renamed from the 3-letter <code>sac<\/code> prefix to <code>apruapca<\/code> (8 chars)<\/li>\n<li>Renamed the shortcode from the generic <code>[appointment_calendar]<\/code> to <code>[apruapca_calendar]<\/code> for the same uniqueness requirement<\/li>\n<li>Wrap global variables in <code>uninstall.php<\/code> in a prefixed function<\/li>\n<li>Refreshed the front-end booking form \u2014 a summary chip with calendar icon for the chosen slot, uppercase field labels with clearer spacing, larger inputs, and a redesigned confirmation \/ error message (status icon, subtle fade-in, no empty space reserved before a booking is made)<\/li>\n<li>Verified on a clean WP_DEBUG install \u2014 no notices, warnings or deprecations across activation, front-end views, all AJAX endpoints, the full booking lifecycle, settings save and uninstall<\/li>\n<\/ul>\n\n<h4>2.4.4<\/h4>\n\n<ul>\n<li>Pass all Plugin Check audits: WordPress coding standards, i18n compliance, DB safety, output escaping<\/li>\n<li>Migrate SQL queries to modern <code>%i<\/code> identifier placeholder (requires WordPress 6.2+)<\/li>\n<li>All translatable strings go through <code>__()<\/code> with English source (Poedit \/ GlotPress friendly)<\/li>\n<li>Add <code>translators:<\/code> comments on placeholders in e-mail templates<\/li>\n<li>Replace <code>date()<\/code> with <code>gmdate()<\/code> for timezone-safe date math<\/li>\n<li>Ordered sprintf placeholders (<code>%1$s, %2$s<\/code>) in all multi-arg strings<\/li>\n<\/ul>\n\n<h4>2.4.3<\/h4>\n\n<ul>\n<li>Switch to WordPress standard i18n with .pot \/ .po \/ .mo files (in <code>\/languages\/<\/code>)<\/li>\n<li>All source strings are English; Polish translation shipped as <code>aprus-appointment-calendar-pl_PL.mo<\/code><\/li>\n<li>Localized month and weekday labels use WordPress core translations via <code>wp_date()<\/code><\/li>\n<li>Full code comments translated to English<\/li>\n<\/ul>\n\n<h4>2.4.2<\/h4>\n\n<ul>\n<li>Fix layout shift after selecting a day in the monthly view (theme CSS interference)<\/li>\n<li><code>overflow: hidden<\/code> on the calendar card so nothing escapes<\/li>\n<li><code>min-width: 0<\/code> on grid children \u2014 prevents column widening under long content<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>Respect WordPress <code>start_of_week<\/code> \u2014 Monday or Sunday<\/li>\n<li>Respect WordPress <code>time_format<\/code> \u2014 24h \/ 12h AM-PM in slot labels and popover<\/li>\n<li>Minor CSS reset to prevent themes from breaking labels and headings<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Full visual redesign \u2014 modern colour palette, spacing, typography<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Admin availability: rubber-band rectangle selection (mouse drag or touch)<\/li>\n<li>Auto-jump on first load to the first week with clickable slots<\/li>\n<li>Stronger <code>user-select: none<\/code> to stop theme CSS from breaking drag<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Booking popover on hover (client details + cancel)<\/li>\n<li>Cancel booking endpoint with customer e-mail notification<\/li>\n<li>Full i18n \u2014 auto-detected Polish \/ English<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>New availability model \u2014 nothing is bookable by default; admin opens slots explicitly<\/li>\n<li>Add appointment duration + buffer settings<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release<\/li>\n<\/ul>","raw_excerpt":"Lightweight, free appointment booking calendar. Shortcode, widget, Gutenberg block. Drag-select availability in admin. English &amp; Polish.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/340839","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=340839"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/aprus"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=340839"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=340839"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=340839"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=340839"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=340839"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=340839"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}