{"id":326305,"date":"2026-06-14T18:26:43","date_gmt":"2026-06-14T18:26:43","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/axiom-event-calendar\/"},"modified":"2026-08-22T02:08:22","modified_gmt":"2026-08-22T02:08:22","slug":"axiom-event-calendar","status":"publish","type":"plugin","link":"https:\/\/os.wordpress.org\/plugins\/axiom-event-calendar\/","author":23516568,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.11","stable_tag":"1.2.11","tested":"7.1","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Axiom Event Calendar","header_author":"Axiom Event Systems","header_description":"A professional event calendar plugin for WordPress that integrates with Axiom Event Systems.","assets_banners_color":"164690","last_updated":"2026-08-22 02:08:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/axiomeventsystems.com\/plugins\/axiom-event-calendar","header_author_uri":"https:\/\/axiomeventsystems.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":242,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.6":{"tag":"1.1.6","author":"axiomeventsystems","date":"2026-06-14 18:32:45"},"1.1.7":{"tag":"1.1.7","author":"axiomeventsystems","date":"2026-08-20 19:39:00"},"1.2.11":{"tag":"1.2.11","author":"axiomeventsystems","date":"2026-08-22 02:08:22"},"1.2.7":{"tag":"1.2.7","author":"axiomeventsystems","date":"2026-08-21 19:03:10"},"1.2.9":{"tag":"1.2.9","author":"axiomeventsystems","date":"2026-08-21 20:29:31"}},"upgrade_notice":{"1.2.11":"<p>Hotfix: Carousel arrows now scroll in Safari &amp; Chrome (switched easing to jQuery-core compatible). Next Up Hero title font-size reduced by ~40%, all heights\/shrinks\/clamps adjusted so event titles, countdown, buttons, and metadata all fully fit inside the glass panel with no clipping.<\/p>","1.2.10":"<p>Four interactive layout fixes: Carousel arrows now scroll, both Calendar and Mini Calendar gain Previous\/Next month navigation, and Next Up Hero no longer clips long titles. Also adds a WordPress Playground blueprint.json.<\/p>","1.2.9":"<p>Fixes Builder preview refresh so limit and hero controls update live, fetches fresh events for preview, and upgrades Next Up Hero with richer gradients, customizable accents, and a cleaner no-image presentation.<\/p>","1.2.8":"<p>Adds a live countdown timer (Days \/ Hours \/ Minutes) to the Next Up Hero layout with a frosted-glass block overlay, matching the Axiom Vendor Calendar pattern.<\/p>","1.2.7":"<p>Improves image scaling and sizing for the Posters layout by supporting custom aspect ratios and image-fit attributes, and fixes card growth in Auto column mode.<\/p>","1.2.6":"<p>Fixes a critical runtime fatal error caused by an undefined constant (AXIOM_EVENT_CALENDAR_FILE) and a missing argument in a sprintf() call on the settings page.<\/p>","1.2.5":"<p>Fixes the admin-settings critical error (WSOD) by reordering plugin includes so API and shortcode helpers are loaded BEFORE admin-settings, guarding rest_sanitize_boolean with an inline fallback, and safe-wrapping the initial preview render.<\/p>","1.2.4":"<p>Resolves the remaining WordPress.Security.ValidatedSanitizedInput warning by moving sanitize_text_field to directly wrap wp_unslash on the superglobal read, and moving the array-type guard into the foreach continue condition.<\/p>","1.2.3":"<p>Fixes WordPress Security.ValidatedSanitizedInput warning in the Builder preview AJAX handler by applying sanitize_text_field after wp_unslash on all POST attributes.<\/p>","1.2.2":"<p>Builder preview now renders real events via the same 12 layout renderers used on the frontend (with 6 demo events fallback), debounced AJAX refresh, Live\/Demo status pill, and fixes the MissingTranslatorsComment plugin-checker error.<\/p>","1.2.1":"<p>Fixes WordPress.org Upgrade Notice length violation; adds live-preview switching in Builder, collapsible Shortcode Options panel (collapsed by default), and hides Organization ID for non-Axiom-hosted API URLs.<\/p>","1.2.0":"<p>Top-level admin menu, 12 layouts, 11 attributes, Shortcode Builder, Tools &amp; collapsible Instructions.<\/p>","1.1.7":"<p>This update adds support for displaying venue names from the Axiom Event Systems API, providing clearer event location information in the grid view.<\/p>","1.1.4":"<p>This update rebrands the plugin to Axiom Event Systems and includes a standard readme.txt for official repository submission.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3659530,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3659530,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon-512x512.png":{"filename":"icon-512x512.png","revision":3659530,"resolution":"512x512","location":"assets","locale":"","width":512,"height":512}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3659530,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3659530,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3659901,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"axiom-event-calendar\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php require_once 'wp-load.php'; update_option('blogname', 'Axiom Event Calendar Plugin Demo'); wp_update_user(array('ID' => 1, 'display_name' => 'AxiomEventSystems', 'nickname' => 'AxiomEventSystems', 'user_nicename' => 'AxiomEventSystems', 'first_name' => 'Axiom', 'last_name' => 'EventSystems')); update_user_meta(1, 'nickname', 'AxiomEventSystems'); update_option('axiom_api_base_url', 'https:\\\/\\\/events.ekfaire.com\\\/'); $layouts = array('grid' => 'Grid', 'list' => 'List', 'calendar' => 'Calendar', 'mini-calendar' => 'Mini Calendar', 'next-up' => 'Next Up Hero', 'carousel' => 'Carousel', 'masonry' => 'Masonry', 'compact' => 'Compact', 'timeline' => 'Timeline', 'grouped' => 'Grouped', 'featured' => 'Featured + Feed', 'poster' => 'Posters (Images Only)'); foreach ($layouts as $slug => $label) { $shortcode = '[axiom_calendar layout=\\\"' . $slug . '\\\"]'; wp_insert_post(array('post_author' => 1, 'post_title' => 'Layout Demo: ' . $label, 'post_content' => '<!-- wp:paragraph -->\\n<p>Demonstrating the ' . $label . ' layout with default settings:<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:shortcode -->\\n' . $shortcode . '\\n<!-- \\\/wp:shortcode -->', 'post_status' => 'publish', 'post_type' => 'post')); }\"}]}"}},"all_blocks":[],"tagged_versions":["1.1.6","1.1.7","1.2.11","1.2.7","1.2.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3659622,"resolution":"1","location":"assets","locale":"","width":2638,"height":1618},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3659530,"resolution":"2","location":"assets","locale":"","width":1270,"height":1288},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3659530,"resolution":"3","location":"assets","locale":"","width":1008,"height":1238},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3659622,"resolution":"4","location":"assets","locale":"","width":1318,"height":1472}},"screenshots":{"1":"The new top-level admin page: two-column Shortcode Builder with layout picker (left) and live preview (right).","2":"The Event Poster (images only) view with variable columns.","3":"The responsive Grid view displaying upcoming events with image, date, and location.","4":"The traditional Monthly Calendar view with in-cell event thumbnails.","5":"The Next-Up Hero banner with gradient overlay and featured event.","6":"The Timeline layout with month grouping and vertical rail dots.","7":"The Featured layout: hero cards on top + configurable feed below."}},"plugin_section":[],"plugin_tags":[416,4747,1486,5881,1100],"plugin_category":[40],"plugin_contributors":[267146],"plugin_business_model":[],"class_list":["post-326305","plugin","type-plugin","status-publish","hentry","plugin_tags-calendar","plugin_tags-event-management","plugin_tags-events","plugin_tags-recurring-events","plugin_tags-shortcode-builder","plugin_category-calendar-and-events","plugin_contributors-axiomeventsystems","plugin_committers-axiomeventsystems"],"banners":{"banner":"https:\/\/ps.w.org\/axiom-event-calendar\/assets\/banner-772x250.png?rev=3659530","banner_2x":"https:\/\/ps.w.org\/axiom-event-calendar\/assets\/banner-1544x500.png?rev=3659530","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/axiom-event-calendar\/assets\/icon-128x128.png?rev=3659530","icon_2x":"https:\/\/ps.w.org\/axiom-event-calendar\/assets\/icon-256x256.png?rev=3659530","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/axiom-event-calendar\/assets\/screenshot-1.png?rev=3659622","caption":"The new top-level admin page: two-column Shortcode Builder with layout picker (left) and live preview (right)."},{"src":"https:\/\/ps.w.org\/axiom-event-calendar\/assets\/screenshot-2.png?rev=3659530","caption":"The Event Poster (images only) view with variable columns."},{"src":"https:\/\/ps.w.org\/axiom-event-calendar\/assets\/screenshot-3.png?rev=3659530","caption":"The responsive Grid view displaying upcoming events with image, date, and location."},{"src":"https:\/\/ps.w.org\/axiom-event-calendar\/assets\/screenshot-4.png?rev=3659622","caption":"The traditional Monthly Calendar view with in-cell event thumbnails."}],"raw_content":"<!--section=description-->\n<p>Axiom Event Calendar is a powerful yet simple plugin designed to bring your events from the Axiom Event Systems platform directly into your WordPress site. It offers 12 display modes, a visual shortcode builder with live preview, smart recurring-event collapsing, and granular control over what information appears on each card.<\/p>\n\n<p>Key Features:<\/p>\n\n<ul>\n<li><strong>Twelve Display Layouts<\/strong>: Grid, List, Monthly Calendar, Mini Calendar, Next-Up Hero, Carousel, Masonry, Compact, Timeline, Grouped-by-Month, Featured Hero + Feed, and Poster (images only).<\/li>\n<li><strong>Visual Shortcode Builder<\/strong>: Build your shortcode directly in the WordPress admin with a layout picker, conditional controls, live preview, and one-click copy-to-clipboard.<\/li>\n<li><strong>Thirteen Shortcode Attributes<\/strong>: Control layout, limit, image fit, aspect ratio, hero accent color, hero gradient style, columns, and toggles for images, date, and location; plus month-grouping and featured-card options.<\/li>\n<li><strong>Smart Recurring Events<\/strong>: Automatically collapses consecutive events from the same series to keep your views clean and organized.<\/li>\n<li><strong>Seamless Integration<\/strong>: Fetches events in real-time via the Axiom Event Systems API.<\/li>\n<li><strong>Performance Focused<\/strong>: Built-in 1-hour caching ensures fast load times for your visitors.<\/li>\n<li><strong>Responsive &amp; Modern<\/strong>: CSS Grid and Flexbox based layouts with mobile breakpoints at 768px and 480px.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>axiom-event-calendar<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Go to the new <strong>Event Calendar<\/strong> top-level admin menu (same icon as Axiom Vendor Calendar) to configure your API connection.<\/li>\n<li>Use the built-in Shortcode Builder to generate a shortcode, or manually add <code>[axiom_calendar]<\/code> to any page or post.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20did%20the%20settings%20page%20go%3F\"><h3>Where did the settings page go?<\/h3><\/dt>\n<dd><p>As of 1.2.0 the plugin now uses a top-level <strong>Event Calendar<\/strong> admin menu entry (matching the Axiom Vendor Calendar plugin) instead of nesting under Settings.<\/p><\/dd>\n<dt id=\"how%20do%20i%20build%20a%20shortcode%3F\"><h3>How do I build a shortcode?<\/h3><\/dt>\n<dd><p>Open the <strong>Event Calendar<\/strong> admin page and use the Shortcode Builder on the right side. Pick a layout, adjust any attributes, then click \"Copy Shortcode\" and paste it into your post.<\/p><\/dd>\n<dt id=\"how%20do%20i%20clear%20the%20event%20cache%3F\"><h3>How do I clear the event cache?<\/h3><\/dt>\n<dd><p>Go to the <strong>Event Calendar<\/strong> admin page, scroll down to the Tools section, and click \"Clear Cache\". The Test Connection button in the same section will also force a fresh fetch.<\/p><\/dd>\n<dt id=\"what%20shortcode%20attributes%20are%20available%3F\"><h3>What shortcode attributes are available?<\/h3><\/dt>\n<dd><p>The plugin supports 13 attributes: <code>layout<\/code>, <code>limit<\/code>, <code>image_fit<\/code>, <code>aspect<\/code>, <code>hero_accent<\/code>, <code>hero_gradient<\/code>, <code>columns<\/code>, <code>show_images<\/code>, <code>show_date<\/code>, <code>show_location<\/code>, <code>group_by<\/code>, <code>featured_count<\/code>, <code>feed_layout<\/code>. See the full attribute documentation in the admin Instructions panel for code examples.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20for%20multiple%20organizations%3F\"><h3>Can I use this for multiple organizations?<\/h3><\/dt>\n<dd><p>The plugin currently supports one organization connection at a time via the settings page.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.11<\/h4>\n\n<ul>\n<li>Bug fix (Carousel arrows no-op \/ Safari &amp; Chrome): jQuery.animate was being called with <code>easeOutCubic<\/code> easing which is only available in jQuery UI, not in WordPress's bundled jQuery core. This threw an internal <code>jQuery.easing[...] is not a function<\/code> error inside each arrow click handler before any scroll could execute, silently aborting the action. Replaced easing string with <code>swing<\/code> (jQuery core default\/native) and nudged duration to 300ms so arrows move the track reliably in every browser with no jQuery UI dependency.<\/li>\n<li>Bug fix (Next Up Hero \u2014 oversized title + clipping): hero title was <code>clamp(1.8rem, 3.9vw, 4.25rem)<\/code> which capped at 68px and rendered multi-line event names at 68px\/line; when combined with the countdown, meta rows, and the CTA button the frosted-glass stack grew taller than the panel itself, and overflow:hidden on the hero card then clipped the CTA button (only a blue strip was visible). Complete shrink pass: title clamp reduced to <code>clamp(1.35rem, 2.5vw, 2.6rem)<\/code> on desktop and <code>clamp(1.2rem, 7vw, 2.1rem)<\/code> \/ <code>clamp(1.15rem, 7.2vw, 1.75rem)<\/code> on tablet\/phone \u2014 roughly a 39% reduction at the clamp cap while keeping readable. Panel now uses <code>display:flex flex-direction:column gap:12px<\/code> instead of per-element <code>margin-bottom<\/code> for deterministic spacing. Countdown cd-block min-width + padding + cd-val font-size all reduced ~20%. Hero min-height bumped 420 \u2192 520px (tablet 380\u2192430, phone 340\u2192460) so the 16:9 card always has breathing room for the full vertical stack even on short\/very-wide viewports. Badge, date, location, button all reduced in size\/padding to fit.<\/li>\n<li>Design: Hero stack max-width reduced <code>min(720px, 72%)<\/code> \u2192 <code>min(680px, 66%)<\/code> to keep the title line count closer to 3 on wide viewports.<\/li>\n<\/ul>\n\n<h4>1.2.10<\/h4>\n\n<ul>\n<li>Bug fix: Carousel layout directional arrows now actually scroll the track by 2 cards (plus gap) per click with easing; previously the buttons existed but had no event handlers wired.<\/li>\n<li>Bug fix: Calendar layout now renders prev\/next month navigation buttons and rebuilds the entire grid + in-cell event thumbnails on the client from an inline events JSON payload so users can advance past the current month.<\/li>\n<li>Bug fix: Mini Calendar layout gains the same prev\/next navigation controls and rebuilds both the compact month grid and the \"This Month\" event list (respecting the <code>limit<\/code> shortcode attribute) as users page through months.<\/li>\n<li>Bug fix: Next Up Hero layout no longer clips the top of long event titles. The frosted-glass overlay panel is now vertically centered, min-height raised to 420px, panel uses flex column layout with word-break guards, and padding expanded so all content fits within the rounded 16:9 card boundary.<\/li>\n<li>Enhancement: Added <code>blueprint.json<\/code> for WordPress Playground that activates the plugin from the WP.org directory, brands the demo site as \"Axiom Event Calendar Plugin Demo\" with author \"AxiomEventSystems\", and creates 12 demonstration posts (one per layout slug) with default settings, all 12 slugs now exactly matching the plugin's <code>allowed_layouts<\/code> list.<\/li>\n<li>UX: Calendar and Mini Calendar headers are now flex layouts with the month title centered and 40px\/32px circular navigation buttons on the sides, including focus outlines for keyboard accessibility.<\/li>\n<\/ul>\n\n<h4>1.2.9<\/h4>\n\n<ul>\n<li>Fix: Builder preview now refreshes when limit, aspect, image-fit, checkbox, and new Next Up Hero controls change, so the preview stays in sync with the generated shortcode.<\/li>\n<li>Fix: Builder preview now bypasses the transient cache and fetches fresh live events, which prevents stale event counts from lingering in the admin preview.<\/li>\n<li>UX: Preview meta now reports shown events versus fetched events when recurring-event collapsing reduces the rendered count.<\/li>\n<li>Feature: Added <code>hero_accent<\/code> and <code>hero_gradient<\/code> shortcode attributes for the Next Up Hero layout.<\/li>\n<li>Design: Reworked the Next Up Hero with layered background treatments, stronger countdown cards, and a polished no-image fallback so the upper portion of the hero no longer feels empty.<\/li>\n<\/ul>\n\n<h4>1.2.8<\/h4>\n\n<ul>\n<li>Feature: Next Up Hero layout now includes a live countdown timer overlay showing Days \/ Hours \/ Minutes remaining until the event starts, with frosted-glass block styling and backdrop blur.<\/li>\n<li>Feature: Countdown timer automatically initializes on the frontend and re-initializes after each Shortcode Builder AJAX preview refresh in the admin.<\/li>\n<li>Assets: Added <code>assets\/js\/calendar.js<\/code> with a date parser that handles both YYYY-MM-DD and combined date+time formats (ISO 8601 or space-separated).<\/li>\n<li>Enqueue: Frontend <code>wp_enqueue_scripts<\/code> now registers the main calendar script with jQuery dependency, loaded in the footer.<\/li>\n<li>Admin: <code>admin_enqueue_scripts<\/code> on the settings page now also enqueues <code>calendar.js<\/code> so the Shortcode Builder preview can display the countdown timer live.<\/li>\n<\/ul>\n\n<h4>1.2.7<\/h4>\n\n<ul>\n<li>CSS: Updated Posters layout to respect the <code>aspect<\/code> and <code>image_fit<\/code> shortcode attributes via CSS custom properties.<\/li>\n<li>CSS: Fixed a layout issue where posters in the last row would grow excessively wide in Auto column mode.<\/li>\n<li>CSS: Improved default aspect-ratio handling by removing the hardcoded <code>auto<\/code> default for media-aspect variables, allowing layout-specific fallbacks (3:4 for posters, 16:9 for cards) to work correctly.<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>Fix: Defined the missing <code>AXIOM_EVENT_CALENDAR_FILE<\/code> constant in the bootstrap file to resolve a PHP Fatal Error on the admin settings page (PHP 8.0+).<\/li>\n<li>Admin: Fixed a missing argument in a <code>sprintf()<\/code> call within the Shortcode Builder's preview meta banner.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Fix: Resolves the settings-page critical error (\"There has been a critical error on this website.\") by correcting the plugin include order so <code>api.php<\/code> (fetch + recurring filter) and <code>shortcode.php<\/code> (12 layout renderers + <code>axiom_parse_bool<\/code> + <code>axiom_unique_dom_id<\/code>) are loaded BEFORE <code>admin-settings.php<\/code>, which calls into both during the initial page-load preview render.<\/li>\n<li>Admin: <code>rest_sanitize_boolean<\/code> is now guarded with <code>function_exists<\/code> in the preview AJAX handler. On WordPress installs where the REST polyfill has not loaded, a local fallback that accepts the same true-ish strings (<code>'1'<\/code>, <code>'true'<\/code>, <code>'yes'<\/code>, <code>'on'<\/code>, <code>'y'<\/code>) is used instead \u2014 prevents a potential undefined-function fatal on the AJAX path.<\/li>\n<li>Admin: Initial <code>axiom_ec_preview_render_html()<\/code> call in the Builder now has an <code>is_array<\/code> fallback that defaults <code>html\/events\/mode\/error<\/code> to safe empty values, so an unexpected return shape cannot trigger illegal-offset warnings or subsequent type fatals.<\/li>\n<li>Bootstrap: <code>add_shortcode( 'axiom_calendar', \u2026 )<\/code> now runs immediately after <code>shortcode.php<\/code> is loaded (same result as before) \u2014 keeps boot order explicit and easier to audit.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Security: Second pass on <code>WordPress.Security.ValidatedSanitizedInput.InputNotSanitized<\/code> \u2014 the sanitizer now <strong>directly wraps<\/strong> <code>wp_unslash( $_POST[$k] )<\/code> on the superglobal read instead of using an intermediate <code>$raw<\/code> variable, so the PHPCS taint analysis correctly recognizes the sanitization.<\/li>\n<li>Admin: Array-type guard for each POST key moved into the foreach <code>continue<\/code> condition alongside the <code>isset()<\/code> check (<code>! isset || is_array \u2192 skip<\/code>), preventing <code>sanitize_text_field<\/code> from ever receiving an array.<\/li>\n<li>Admin: Eliminated the dead-code <code>is_array( $v ) ? '' : \u2026<\/code> fallback in the else branch since <code>$v<\/code> is now provably a scalar string.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Security: Fixed <code>WordPress.Security.ValidatedSanitizedInput.InputNotSanitized<\/code> warning in the <code>axiom_ec_ajax_refresh_preview<\/code> AJAX handler.<\/li>\n<li>Admin: All 11 POST attributes (<code>layout<\/code>, <code>limit<\/code>, <code>image_fit<\/code>, <code>aspect<\/code>, <code>columns<\/code>, <code>show_images<\/code>, <code>show_date<\/code>, <code>show_location<\/code>, <code>group_by<\/code>, <code>featured_count<\/code>, <code>feed_layout<\/code>) are now sanitized via <code>sanitize_text_field<\/code> immediately after <code>wp_unslash<\/code> before downstream type-specific casting.<\/li>\n<li>Admin: Array-injection guard on each raw POST value now runs BEFORE <code>sanitize_text_field<\/code> to avoid sanitizer coercion edge-cases.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Admin: Builder preview now renders REAL event data using the exact same 12 shortcode layout renderers as the frontend \u2014 preview matches live output pixel-for-pixel.<\/li>\n<li>Admin: Live events are fetched from the configured API on preview render; falls back to 6 realistic demo events when no API is configured or the API call errors.<\/li>\n<li>Admin: Preview refresh uses 90ms debounce + request-ID guard to prevent race conditions when typing limit\/columns quickly.<\/li>\n<li>Admin: Live\/Demo status pill with event count shown above the preview; inline red error banner displays the exact WP_Error message when live fetch fails.<\/li>\n<li>Admin: Enqueues the public <code>calendar.css<\/code> on the admin settings page so preview cards share identical styles with the frontend.<\/li>\n<li>Admin: Removed dead miniature CSS classes and static preview-template generator (~700 lines) that produced fake colored blocks.<\/li>\n<li>Admin: Fixed WordPress.WP.I18n.MissingTranslatorsComment plugin-checker error on Tools \"Connection Successful!\" <code>_n()<\/code> message with proper translators comment.<\/li>\n<li>Admin: Initial preview HTML rendered on page-load via PHP, saving one admin-ajax round-trip.<\/li>\n<li>Packaging: Zip build now excludes <code>*\/.DS_Store<\/code> recursively in addition to <code>docs\/<\/code> for clean WordPress.org uploads.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Readme: Shortened the 1.2.0 Upgrade Notice to comply with WordPress.org's 300-character maximum.<\/li>\n<li>Admin: Builder preview area now switches live when selecting a layout (12 unique miniatures).<\/li>\n<li>Admin: \"Available Shortcode Options\" panel now starts collapsed; click the caret in the header to expand.<\/li>\n<li>Admin: Quick Start Guide header also supports the caret toggle.<\/li>\n<li>Admin: Organization ID field is now hidden by default and only appears when the Axiom API URL contains <code>https:\/\/events.axiomeventsystems.com<\/code>.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Admin: Replaced the nested Settings page with a top-level \"Event Calendar\" menu using <code>dashicons-calendar-alt<\/code>, matching Axiom Vendor Calendar.<\/li>\n<li>Shortcode: Expanded from 3 layouts to 12 \u2014 Grid, List, Calendar, Mini Calendar, Next-Up Hero, Carousel, Masonry, Compact, Timeline, Grouped, Featured, Poster.<\/li>\n<li>Shortcode: Added 11 attributes \u2014 layout, limit, image_fit (contain\/cover), aspect (16:9\/4:3\/1:1), columns (1-6), show_images, show_date, show_location, group_by, featured_count, feed_layout.<\/li>\n<li>Shortcode: Smart CSS custom-property propagation for image_fit, aspect, and masonry columns.<\/li>\n<li>Admin: Two-column Shortcode Builder with 4-col layout picker, conditional controls per layout, live shortcode generation, and copy-to-clipboard with fallback.<\/li>\n<li>Admin: Quick Start Guide + per-layout\/attribute documentation in the Instructions panel.<\/li>\n<li>Admin: Tools section with Test Connection &amp; Fetch Events (with plural-aware result message) and Clear Cache actions, nonce-guarded.<\/li>\n<li>Locations: Cascading location resolution <code>venue_name<\/code> \u2192 <code>city, state<\/code> \u2192 plain location field.<\/li>\n<li>Dates: Uses <code>date_i18n<\/code> throughout for locale-aware formatting.<\/li>\n<li>Responsive: Mobile breakpoints at 768px and 480px across all 12 layouts.<\/li>\n<\/ul>\n\n<h4>1.1.7<\/h4>\n\n<ul>\n<li>Added support for venue names in API feeds.<\/li>\n<li>Updated grid view to display the specific venue name as the primary location.<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>Rebranded technical wording to \"Axiom Event Systems\".<\/li>\n<li>Added standard readme.txt for WordPress.org submission.<\/li>\n<li>Improved admin settings UI with better descriptions.<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Implemented smart recurring event filtering.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added Monthly Calendar and Event Poster views.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"A professional event calendar plugin for WordPress that integrates seamlessly with Axiom Event Systems.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/326305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=326305"}],"author":[{"embeddable":true,"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/axiomeventsystems"}],"wp:attachment":[{"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=326305"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=326305"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=326305"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=326305"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=326305"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/os.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=326305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}