{"id":315159,"date":"2026-05-21T18:07:44","date_gmt":"2026-05-21T18:07:44","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/simple-venue-calendar\/"},"modified":"2026-05-21T17:51:50","modified_gmt":"2026-05-21T17:51:50","slug":"freeslot-calendar","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/freeslot-calendar\/","author":23341272,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.7.19","stable_tag":"1.7.19","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Freeslot Calendar","header_author":"Krasimir Ignatov","header_description":"Read-only availability calendar with admin-managed events. Bilingual (BG\/EN), shortcode-driven.","assets_banners_color":"949b9d","last_updated":"2026-05-21 17:51:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":11,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.7.19":{"tag":"1.7.19","author":"krasimirignatov","date":"2026-05-21 17:51:50"}},"upgrade_notice":{"1.7.0":"<p>Internal rename for WordPress.org compliance. <strong>Important:<\/strong> the shortcode tag changed from <code>[availability_calendar]<\/code> to <code>[igcal_availability]<\/code>. If you used the old shortcode on any pages, update them after upgrading. Existing events and settings are preserved.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3542651,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3542651,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3542689,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":487},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3542689,"resolution":"772x250","location":"assets","locale":"","width":772,"height":243}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.7.19"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The public availability calendar on the front-end \u2014 month grid with Free \/ Partial \/ Full status and the Contact CTA bar.","2":"Day-detail panel showing public event cards, working-hours timeline, and the contact note.","3":"Admin Events list with bilingual titles, per-event color, and category.","4":"Event editor with date\/time, recurring, image, color, and EN translation fields.","5":"Settings page \u2014 working hours, language, colors, CTA customization, and header text overrides."}},"plugin_section":[],"plugin_tags":[8132,1279,416,2168,4062],"plugin_category":[40],"plugin_contributors":[262947],"plugin_business_model":[],"class_list":["post-315159","plugin","type-plugin","status-publish","hentry","plugin_tags-appointments","plugin_tags-availability","plugin_tags-calendar","plugin_tags-freelancer","plugin_tags-schedule","plugin_category-calendar-and-events","plugin_contributors-krasimirignatov","plugin_committers-krasimirignatov"],"banners":{"banner":"https:\/\/ps.w.org\/freeslot-calendar\/assets\/banner-772x250.png?rev=3542689","banner_2x":"https:\/\/ps.w.org\/freeslot-calendar\/assets\/banner-1544x500.png?rev=3542689","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/freeslot-calendar\/assets\/icon-128x128.png?rev=3542651","icon_2x":"https:\/\/ps.w.org\/freeslot-calendar\/assets\/icon-256x256.png?rev=3542651","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Freeslot Calendar is a lightweight WordPress plugin that publishes a clean monthly availability view on any page or post. It's built for freelancers, designers, photographers, consultants, and small studios who want visitors to see <em>at a glance<\/em> which days are open and which are busy, without exposing a full booking system.<\/p>\n\n<p>Events live in your WordPress admin like any other content. The public calendar reads from them and paints each day as <strong>Free<\/strong>, <strong>Partially busy<\/strong>, or <strong>Fully busy<\/strong> based on your working hours.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Drop-in shortcode<\/strong> \u2014 <code>[igcal_availability]<\/code> renders the calendar anywhere.<\/li>\n<li><strong>Bilingual out of the box<\/strong> \u2014 Bulgarian and English, per-event title and note translations, automatic locale switching.<\/li>\n<li><strong>Working-hours aware<\/strong> \u2014 partial vs. full busy status is computed from your actual day, not a guess.<\/li>\n<li><strong>Recurring events<\/strong> \u2014 daily, weekly, monthly, with an end date.<\/li>\n<li><strong>Per-event color, image, and category<\/strong> for richer day-detail cards.<\/li>\n<li><strong>Customizable Contact CTA<\/strong> \u2014 label, colors, size, and the URL it links to.<\/li>\n<li><strong>Customizable header<\/strong> \u2014 change the calendar's title and subtitle per language, or pass a <code>title=\"...\"<\/code> shortcode attribute.<\/li>\n<li><strong>Accessible<\/strong> \u2014 full keyboard navigation (arrows, Home\/End, PageUp\/Down), ARIA roles, screen-reader announcements on month change.<\/li>\n<li><strong>Mobile responsive<\/strong> \u2014 two-stage breakpoints, dense list view on phones.<\/li>\n<li><strong>AJAX month navigation<\/strong> with skeleton loader and cross-fade transitions.<\/li>\n<li><strong>Cached<\/strong> \u2014 each month grid is cached per language and invalidated automatically when events or settings change.<\/li>\n<li><strong>No tracking, no external calls<\/strong> \u2014 your data stays on your site.<\/li>\n<\/ul>\n\n<h4>Shortcode attributes<\/h4>\n\n<ul>\n<li><code>months<\/code> \u2014 number of months to render (default <code>1<\/code>).<\/li>\n<li><code>lang<\/code> \u2014 <code>auto<\/code> (follow site locale), <code>bg<\/code>, or <code>en<\/code>.<\/li>\n<li><code>title<\/code> \u2014 override the header title for this instance.<\/li>\n<li><code>show_legend<\/code> \u2014 <code>1<\/code> or <code>0<\/code>.<\/li>\n<li><code>show_cta<\/code> \u2014 show the bottom Contact CTA bar (<code>1<\/code> or <code>0<\/code>).<\/li>\n<\/ul>\n\n<p>Example:<\/p>\n\n<pre><code>[igcal_availability lang=\"en\" months=\"3\" show_cta=\"0\"]\n<\/code><\/pre>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>freeslot-calendar<\/code> folder to <code>\/wp-content\/plugins\/<\/code> (or install via <em>Plugins \u2192 Add New \u2192 Upload<\/em>).<\/li>\n<li>Activate the plugin through the <em>Plugins<\/em> screen.<\/li>\n<li>Go to <em>Freeslot Calendar \u2192 Settings<\/em> to set working hours, language, colors, and the Contact CTA.<\/li>\n<li>Go to <em>Freeslot Calendar \u2192 Events<\/em> to add busy events.<\/li>\n<li>Drop <code>[igcal_availability]<\/code> on any page or post.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20accept%20bookings%3F\"><h3>Does this plugin accept bookings?<\/h3><\/dt>\n<dd><p>No. It's intentionally read-only \u2014 visitors see your availability and contact you through whatever channel you configure (email, form, Calendly link, etc.). This keeps the plugin small, fast, and easy to reason about.<\/p><\/dd>\n<dt id=\"does%20it%20support%20languages%20other%20than%20bulgarian%20and%20english%3F\"><h3>Does it support languages other than Bulgarian and English?<\/h3><\/dt>\n<dd><p>Out of the box the calendar ships with <code>bg_BG<\/code> and <code>en_US<\/code> translations. The plugin is fully internationalized (<code>Text Domain: freeslot-calendar<\/code>), so additional locales can be added via standard <code>.po<\/code>\/<code>.mo<\/code> files.<\/p><\/dd>\n<dt id=\"can%20i%20have%20multiple%20calendars%20on%20different%20pages%3F\"><h3>Can I have multiple calendars on different pages?<\/h3><\/dt>\n<dd><p>Yes \u2014 the shortcode can be placed on any page or post. All instances share the same event pool and settings (there is currently one global calendar, not multiple separately-managed ones).<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20caching%20plugin%3F\"><h3>Does it work with my caching plugin?<\/h3><\/dt>\n<dd><p>Yes. Month grids are cached via WordPress transients with automatic invalidation on event save and settings change. Page-level cache plugins work fine because the AJAX month-nav endpoint is unauthenticated and idempotent.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>Assets (CSS \/ JS \/ fonts) only load on pages that actually contain the shortcode. The initial month is server-rendered; subsequent months are fetched via a single small AJAX call.<\/p><\/dd>\n<dt id=\"is%20the%20public%20calendar%20keyboard-accessible%3F\"><h3>Is the public calendar keyboard-accessible?<\/h3><\/dt>\n<dd><p>Yes. Tab into the grid, then use arrow keys to move between days, Home\/End for first\/last day of the visible month, and PageUp\/PageDown to jump between months. Today's cell is marked with <code>aria-current=\"date\"<\/code> and month changes are announced via an ARIA live region.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.7.19<\/h4>\n\n<ul>\n<li>Removed <code>Author URI<\/code> from the plugin header (the WordPress.org review team requires domain-ownership verification when an Author URI is set, and the simplest path was to drop the line). Author credit \"Krasimir Ignatov\" is unchanged.<\/li>\n<\/ul>\n\n<h4>1.7.18<\/h4>\n\n<ul>\n<li>Renamed plugin to \"Freeslot Calendar\" (slug <code>freeslot-calendar<\/code>) at the request of the WordPress.org review team, who flagged the previous name as too generic. Text domain, language files, and folder name updated to match.<\/li>\n<\/ul>\n\n<h4>1.7.17<\/h4>\n\n<ul>\n<li>Removed <code>Plugin URI<\/code> from the plugin header \u2014 WordPress.org rejects submissions where Plugin URI and Author URI point to the same site. Author URI (https:\/\/ignatovdesigns.com\/) stays.<\/li>\n<\/ul>\n\n<h4>1.7.16<\/h4>\n\n<ul>\n<li>Renamed the leftover <code>ignatov_calendar_force_assets<\/code> filter to <code>igcal_force_assets<\/code> so the hook name matches the plugin's prefix (caught by Plugin Check after the rename).<\/li>\n<li>Updated <code>Contributors:<\/code> field in readme.txt to <code>krasimirignatov<\/code> (matches the WordPress.org account that will own the plugin).<\/li>\n<\/ul>\n\n<h4>1.7.15<\/h4>\n\n<ul>\n<li>Fix: post-activation welcome notice now displays in English when the admin locale is English. The main message string was missing from the .po files entirely, and the \"Add your first event \u2192\" string had an arrow inside the gettext call that didn't match the .po msgid. Both are now in sync.<\/li>\n<\/ul>\n\n<h4>1.7.14<\/h4>\n\n<ul>\n<li>Added <code>Author URI<\/code> header so the author name on the Plugins screen links to https:\/\/ignatovdesigns.com\/.<\/li>\n<\/ul>\n\n<h4>1.7.13<\/h4>\n\n<ul>\n<li>Renamed the plugin to \"Freeslot Calendar\"; author credit updated to Krasimir Ignatov.<\/li>\n<\/ul>\n\n<h4>1.7.12<\/h4>\n\n<ul>\n<li>Mobile \/ tablet: added 20px right margin to the Today button so it no longer hugs the right edge of the month-nav pill.<\/li>\n<\/ul>\n\n<h4>1.7.11<\/h4>\n\n<ul>\n<li>Fix: on tablet and phone the Today button is now actually pinned to the right edge of the month-nav. The 1.7.9 rule was being overridden by the base <code>margin-left: 8px<\/code> rule because of CSS source-order; bumped with <code>!important<\/code> so the mobile override wins.<\/li>\n<\/ul>\n\n<h4>1.7.10<\/h4>\n\n<ul>\n<li>Day-detail close button: removed the grey hover background \u2014 only the icon color darkens on hover now.<\/li>\n<\/ul>\n\n<h4>1.7.9<\/h4>\n\n<ul>\n<li>Empty-state banner icon switched from brand-orange to ink (matches the calendar's other dark icons). On tablet and phone the month-nav pill (prev \/ month \/ next \/ Today) now stretches to the full calendar width with the Today button pinned to the right edge, so the header and grid line up visually on narrow screens.<\/li>\n<\/ul>\n\n<h4>1.7.8<\/h4>\n\n<ul>\n<li>Cleaned up the surrounding chrome: month nav, empty-state banner, and day-detail panel are now transparent (no cream \/ peach fill), all using the same grey border. Empty-state banner's drop-shadow was dropped since a shadow on a transparent element looks odd.<\/li>\n<\/ul>\n\n<h4>1.7.7<\/h4>\n\n<ul>\n<li>Clicking a day now leaves a visible \"selected\" marker on the grid \u2014 a semi-transparent green inset ring \u2014 so the visitor can see which day they just opened in the detail panel. Distinct from today's solid-green ring; works for both grid clicks and list-view row clicks.<\/li>\n<\/ul>\n\n<h4>1.7.6<\/h4>\n\n<ul>\n<li>Calendar grid is now wrapped in a single bordered card with rounded corners and a soft drop-shadow. Day cells sit edge-to-edge inside the card with shared 1px separators (no gaps), the weekday header row sits at the top of the same card with a subtle tinted background. Today's cell now uses an inset green ring (so it stays inside the shared-edge grid). Status pills use a soft tinted background with matching text color instead of solid white-on-color. Cleaned up legacy <code>!important<\/code> overrides that were forcing the older sharp-corner \/ solid-pill look.<\/li>\n<\/ul>\n\n<h4>1.7.5<\/h4>\n\n<ul>\n<li>Apple-style calendar refresh: each day cell is now its own soft card (larger border-radius, resting drop-shadow, wider gap between cells), and the status text (\"\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\" \/ \"\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0435\u0442\u043e\" \/ \"\u041d\u0430\u043f\u044a\u043b\u043d\u043e \u0437\u0430\u0435\u0442\u043e\") is rendered as a tinted pill instead of plain text. Empty-month banner picks up the same soft shadow. Off-month and empty cells stay flat as before.<\/li>\n<\/ul>\n\n<h4>1.7.4<\/h4>\n\n<ul>\n<li>Calendar header restyled: title and subtitle now both use Roboto; the second word of the default title is no longer italicized or accent-colored. Added Roboto to the bundled Google Fonts request.<\/li>\n<\/ul>\n\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>Converted the remaining <code>meta_query<\/code> \/ <code>meta_key<\/code> <code>phpcs:ignore<\/code> markers into proper <code>phpcs:disable<\/code> \/ <code>phpcs:enable<\/code> blocks so Plugin Check fully recognizes them as intentional. Runtime behavior unchanged.<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Second Plugin Check compliance pass: normalized all ABSPATH guards to the PCP-recognized form (no leading backslash), switched calendar arithmetic from <code>date()<\/code> to <code>gmdate()<\/code> (timezone-safe), set an explicit <code>IGCAL_VERSION<\/code> on Google Fonts enqueues (PCP rejected <code>false<\/code>), added <code>translators:<\/code> comment for the slot-length string, escaped the language-radio flag emoji, marked the pre-rendered month-grid \/ month-list HTML echoes as intentional (built upstream by escaping templates), switched <code>image_id<\/code> sanitization to <code>absint( wp_unslash() )<\/code>, dropped deprecated <code>suppress_filters<\/code> from the uninstall query.<\/li>\n<li>Bumped \"Tested up to\" to WordPress 6.9.<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Plugin Check compliance pass: explicit input sanitization on all <code>$_POST<\/code> reads, justified <code>phpcs:ignore<\/code> markers for legitimate direct DB \/ <code>meta_query<\/code> \/ read-only <code>$_GET<\/code> patterns, explicit <code>false<\/code> version on external Google Fonts enqueues.<\/li>\n<li>Removed deprecated <code>load_plugin_textdomain()<\/code> call \u2014 WordPress 4.6+ auto-loads translations from the plugin's <code>\/languages\/<\/code> folder.<\/li>\n<li>Trimmed plugin short description to fit WordPress.org's 150-character limit.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Renamed all internal prefixes from 2-letter <code>ic_<\/code> \/ <code>IC_<\/code> to 5-letter <code>igcal_<\/code> \/ <code>IGCAL_<\/code> for WordPress.org compliance (uniqueness rule).<\/li>\n<li>Renamed shortcode from <code>[availability_calendar]<\/code> to <code>[igcal_availability]<\/code>.<\/li>\n<li>Accessibility: added <code>aria-current=\"date\"<\/code> on today, <code>aria-live=\"polite\"<\/code> on the month label and empty-state banner, <code>role=\"region\"<\/code> with label on the calendar root, and full keyboard navigation inside the grid (arrows, Home, End, PageUp, PageDown).<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Added Settings fields to customize the calendar's header title and subtitle per language (BG \/ EN). Empty falls back to the translated default; the shortcode <code>title<\/code> attribute still takes priority.<\/li>\n<li>Removed leftover <code>theme<\/code> attribute card from the Shortcode reference section.<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Fixed: a few admin-side strings (Publication section, status labels) were not translating to English.<\/li>\n<li>Tightened spacing in the month navigation header (chevron \/ Today button gap).<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Added per-event Contact CTA customization: label per locale, background and text colors, size variants (small \/ medium \/ large). Uses CSS custom properties so customizations always win over theme overrides.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added event thumbnails \/ images, category tags, improved typography hierarchy in day-detail cards.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Mobile responsiveness pass: two-stage breakpoints (720 px tablet, 480 px phone), compact list view on phones.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Read-only availability calendar with admin-managed events. Bilingual (BG\/EN), shortcode-driven. Show visitors when you&#039;re free, no booking system.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/315159","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=315159"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/krasimirignatov"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=315159"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=315159"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=315159"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=315159"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=315159"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=315159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}