{"id":322035,"date":"2026-06-29T13:08:51","date_gmt":"2026-06-29T13:08:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/designed2use-events\/"},"modified":"2026-06-29T13:28:47","modified_gmt":"2026-06-29T13:28:47","slug":"designed2use-events","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/designed2use-events\/","author":13919721,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.4","stable_tag":"1.0.4","tested":"7.0","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"Designed2Use Events","header_author":"Designed2Use","header_description":"A standalone events calendar with optional WooCommerce ticketing.","assets_banners_color":"ffffff","last_updated":"2026-06-29 13:28:47","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/designed2use.co.uk\/plugins\/designed2use-events\/","header_author_uri":"https:\/\/designed2use.co.uk\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":31,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.3":{"tag":"1.0.3","author":"guy1ncognito","date":"2026-06-29 13:08:36"},"1.0.4":{"tag":"1.0.4","author":"guy1ncognito","date":"2026-06-29 13:28:47"}},"upgrade_notice":{"1.0.4":"<p>Description-only update: a &quot;Coming Soon&quot; overview of Designed2Use Events\nPro. No code changes and nothing to migrate.<\/p>","1.0.3":"<p>Internal rename to the unique <code>d2uevents<\/code> prefix and removal of the\ncalendar-block instance limit. No data migration is required for a fresh\ninstall.<\/p>","1.0.2":"<p>Fixes tickets wrongly showing &quot;sales have ended&quot; when no custom sale\nwindow is set.<\/p>","1.0.1":"<p>Adds developer hooks that the Designed2Use Events Pro recurrence engine\ndepends on. Update the free plugin before (or with) Pro 1.0.1.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3590130,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3590130,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3590130,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3590130,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"d2uevents\/events-list":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"d2uevents\/events-list","version":"1.0.0","title":"Events list","category":"d2u-events","icon":"list-view","description":"A chronological list of upcoming events. Equivalent to the [d2uevents_list] shortcode.","textdomain":"designed2use-events","keywords":["events","list","upcoming","designed2use"],"supports":{"html":false,"anchor":true,"align":["wide"]},"attributes":{"count":{"type":"number","default":10},"venue":{"type":"number","default":0},"category":{"type":"number","default":0},"featured":{"type":"boolean","default":false},"from":{"type":"string","default":""},"to":{"type":"string","default":""}},"editorScript":"file:.\/editor.js"},"d2uevents\/events-calendar":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"d2uevents\/events-calendar","version":"1.0.0","title":"Events calendar","category":"d2u-events","icon":"calendar-alt","description":"Embed the Designed2Use Events calendar (Month or List view) on any page.","textdomain":"designed2use-events","keywords":["calendar","events","designed2use"],"supports":{"html":false,"anchor":true,"align":["wide","full"]},"attributes":{"defaultView":{"type":"string","default":"month","enum":["month","list"]},"venue":{"type":"number","default":0},"category":{"type":"number","default":0},"featured":{"type":"boolean","default":false},"showFilters":{"type":"boolean","default":true},"monthsAhead":{"type":"number","default":3}},"editorScript":"file:.\/editor.js"},"d2uevents\/venues":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"d2uevents\/venues","version":"1.0.0","title":"Venues map + list","category":"d2u-events","icon":"location-alt","description":"The venues archive \u2014 Leaflet map + list. Equivalent to the [d2uevents_venues] shortcode.","textdomain":"designed2use-events","keywords":["venues","map","designed2use"],"supports":{"html":false,"anchor":true,"align":["wide","full"]},"attributes":{},"editorScript":"file:.\/editor.js"},"d2uevents\/event":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"d2uevents\/event","version":"1.0.0","title":"Event card","category":"d2u-events","icon":"tickets-alt","description":"A compact card for a single event. Equivalent to the [d2uevents_event id=\u2026] shortcode.","textdomain":"designed2use-events","keywords":["event","card","designed2use"],"supports":{"html":false,"anchor":true},"attributes":{"eventId":{"type":"number","default":0}},"editorScript":"file:.\/editor.js"}},"tagged_versions":["1.0.3","1.0.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3590130,"resolution":"1","location":"assets","locale":"","width":1074,"height":981},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3590130,"resolution":"2","location":"assets","locale":"","width":997,"height":1117},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3590130,"resolution":"3","location":"assets","locale":"","width":915,"height":1373},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3590130,"resolution":"4","location":"assets","locale":"","width":928,"height":1360},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3590130,"resolution":"5","location":"assets","locale":"","width":2341,"height":1103}},"screenshots":{"1":"Month view of the calendar archive Page with filters","2":"List view of the calendar archive Page","3":"Single event page with venue map and ticket purchase form","4":"Single venue page with upcoming events","5":"Events admin list with start date and venue columns"}},"plugin_section":[],"plugin_tags":[416,1486,7103,4771,1149],"plugin_category":[40,58],"plugin_contributors":[269038,269039],"plugin_business_model":[],"class_list":["post-322035","plugin","type-plugin","status-publish","hentry","plugin_tags-calendar","plugin_tags-events","plugin_tags-ical","plugin_tags-tickets","plugin_tags-venues","plugin_category-calendar-and-events","plugin_category-user-management","plugin_contributors-designed2use","plugin_contributors-guy1ncognito","plugin_committers-guy1ncognito"],"banners":{"banner":"https:\/\/ps.w.org\/designed2use-events\/assets\/banner-772x250.jpg?rev=3590130","banner_2x":"https:\/\/ps.w.org\/designed2use-events\/assets\/banner-1544x500.jpg?rev=3590130","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/designed2use-events\/assets\/icon-128x128.png?rev=3590130","icon_2x":"https:\/\/ps.w.org\/designed2use-events\/assets\/icon-256x256.png?rev=3590130","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/designed2use-events\/assets\/screenshot-1.png?rev=3590130","caption":"Month view of the calendar archive Page with filters"},{"src":"https:\/\/ps.w.org\/designed2use-events\/assets\/screenshot-2.png?rev=3590130","caption":"List view of the calendar archive Page"},{"src":"https:\/\/ps.w.org\/designed2use-events\/assets\/screenshot-3.png?rev=3590130","caption":"Single event page with venue map and ticket purchase form"},{"src":"https:\/\/ps.w.org\/designed2use-events\/assets\/screenshot-4.png?rev=3590130","caption":"Single venue page with upcoming events"},{"src":"https:\/\/ps.w.org\/designed2use-events\/assets\/screenshot-5.png?rev=3590130","caption":"Events admin list with start date and venue columns"}],"raw_content":"<!--section=description-->\n<p>Designed2Use Events is a self-contained events calendar for WordPress. Events\nand venues are custom post types \u2014 not products \u2014 so the calendar works fully\non its own. When WooCommerce is active, an opt-in ticketing module turns\nevents into purchasable tickets with attendee capture, capacity tracking,\nsale windows and refund-aware capacity release.<\/p>\n\n<p><strong>Calendar without WooCommerce<\/strong><\/p>\n\n<ul>\n<li>Events and venues as custom post types, with categories and tags<\/li>\n<li>Frontend Pages for the calendar (<code>\/events\/<\/code>) and the venues archive\n(<code>\/venues\/<\/code>) \u2014 created on activation and rendered through your active\ntheme, no template takeover<\/li>\n<li>Month + List calendar views with venue \/ category \/ featured filters,\nprev \/ next month navigation, and a shareable URL for every state<\/li>\n<li>Server-rendered first paint plus a vanilla-JS REST-driven view swap \u2014\nno JS framework, no build step<\/li>\n<li>Single-event pages with schedule, venue, address and an embedded\nOpenStreetMap (Leaflet) map<\/li>\n<li>Single-venue pages with address, map and upcoming events<\/li>\n<li>Multi-day events span every day they cover in the month view, with a\n\"Through {date}\" hint in the list view<\/li>\n<li>JSON-LD <code>Event<\/code> schema in the document <code>&lt;head&gt;<\/code> for Rich Results<\/li>\n<li>Per-event <code>.ics<\/code> download and a subscribable iCal feed\n(<code>\/event\/{slug}\/feed\/ics\/<\/code>)<\/li>\n<li>Theme overrides \u2014 copy any template part to\n  your-theme\/designed2use-events\/{name}.php<\/li>\n<li>Five free shortcodes (<code>[d2uevents_calendar]<\/code>, <code>[d2uevents_list]<\/code>,\n  [d2uevents_event], <code>[d2uevents_venues]<\/code>) and matching server-rendered blocks\nunder an \"Events shortcodes\" inserter category<\/li>\n<li>REST endpoint <code>\/wp-json\/d2uevents\/v1\/occurrences<\/code> for headless use<\/li>\n<\/ul>\n\n<p><strong>Optional WooCommerce ticketing<\/strong><\/p>\n\n<p>When WooCommerce is active, the Tickets meta box on the event editor\nappears and the rest of the integration switches on:<\/p>\n\n<ul>\n<li>Create a ticket product directly from the event, or link an existing\nproduct<\/li>\n<li>Inline editor on the event admin for name \/ description \/ price \/\nper-ticket capacity \/ sale window \u2014 no round-trip to the product\neditor for the common fields<\/li>\n<li>Single-cap cascade: per-ticket \u2192 event \u2192 venue \u2192 settings (first\nset value wins) so an admin can choose where to track capacity<\/li>\n<li>Sale window with event-end fallback \u2014 the form is replaced with a\n\"Tickets go on sale on X\" or \"Ticket sales have ended\" notice as\nappropriate<\/li>\n<li>Atomic capacity decrement at order completion \u2014 concurrent oversells\ncollapse to exactly one winner; the rejected order is recorded as an\norder note and a debug-log entry<\/li>\n<li>Refund-aware capacity release \u2014 the same counter the booking\nincremented is released<\/li>\n<li>Per-ticket attendee capture (name + email) on the event page \u2014 block\ncart \/ block checkout \/ classic cart all show the data, no React\nbuild step required<\/li>\n<li>Cart-aware quantity input \u2014 the visitor cannot purchase more tickets\nthan remain<\/li>\n<li>Block cart \/ mini-cart quantity is locked at the Store API schema\nlevel so attendee mappings cannot be quietly broken from the cart<\/li>\n<li>HPOS (High-Performance Order Storage) compatible<\/li>\n<li>Per-event Attendees admin screen with a CSV export of every booking<\/li>\n<li>WooCommerce privacy-export and erasure integration \u2014 attendee\npersonal data flows through the standard \"export \/ erase personal\ndata\" tools<\/li>\n<li>My-account view-order page lets the customer edit attendee details\nuntil a configurable cutoff before the event<\/li>\n<\/ul>\n\n<p><strong>Developer friendly<\/strong><\/p>\n\n<ul>\n<li>Public <code>d2uevents_<\/code> action \/ filter API \u2014 a documented contract for\nthird-party developers, not just the free \u2194 Pro boundary\n(<code>docs\/hooks.md<\/code>)<\/li>\n<li>Five shortcodes that mirror every server-rendered block\n(<code>docs\/shortcodes.md<\/code>)<\/li>\n<li>Filterable template loader \u2014 every part is overridable from the\nactive theme (<code>docs\/templates.md<\/code>)<\/li>\n<li>PSR-4 autoloader, namespaced <code>D2UEvents\\<\/code><\/li>\n<li>WooCommerce ticketing module is fully isolated \u2014 nothing outside it\nreferences a WooCommerce symbol, so the plugin works without\nWooCommerce installed at all<\/li>\n<\/ul>\n\n<p><strong>Designed2Use Events Pro \u2014 Coming Soon!<\/strong><\/p>\n\n<p>The free plugin is the real product, not a teaser \u2014 every feature above\nstays free, forever. Pro adds power alongside it, never gating what you\nalready have. Here's what's on the way:<\/p>\n\n<ul>\n<li><strong>Recurring events<\/strong> \u2014 daily, weekly, monthly and custom patterns, with\nproper series editing.<\/li>\n<li><strong>Multi-tier tickets<\/strong> \u2014 early-bird, standard and VIP pricing tiers, with\nper-occurrence inventory.<\/li>\n<li><strong>Registration form builder<\/strong> \u2014 collect exactly the attendee information\nyou need.<\/li>\n<li><strong>QR check-in<\/strong> \u2014 scan attendees in at the door from your phone.<\/li>\n<li><strong>Organizers<\/strong> \u2014 give each event an organizer profile with their own\ndetails and listings.<\/li>\n<li><strong>Week, Day and Map views<\/strong> \u2014 more ways for visitors to browse what's on.<\/li>\n<li><strong>Importer<\/strong> \u2014 bring your events across from The Events Calendar.<\/li>\n<li><strong>Automatic updates<\/strong> \u2014 licensed, with one-click updates straight from\nyour dashboard.<\/li>\n<\/ul>\n\n<p>Pro hooks into exactly the same public <code>d2uevents_<\/code> API a third-party\nadd-on would \u2014 no privileged access, no patching of free internals. See\n<a href=\"https:\/\/designed2use.co.uk\/plugins\/designed2use-events\/\">designed2use.co.uk\/plugins\/designed2use-events\/<\/a>.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on two OpenStreetMap services to provide venue geocoding and\nmaps. Both are optional to how you use the plugin and can be disabled or replaced\n(see below).<\/p>\n\n<p><strong>1. OpenStreetMap Nominatim (address geocoding)<\/strong><\/p>\n\n<p>When you create or edit a venue and enter an address but leave the latitude and\nlongitude blank, the plugin sends that address to the OpenStreetMap Nominatim\nservice to look up its coordinates. The request includes the address you entered\nand a User-Agent identifying this plugin and your site's URL (required by\nNominatim's usage policy). This happens only in the admin when a venue is saved,\nis throttled to one request per second, and results are cached for seven days. No\nrequest is sent if you fill in the latitude\/longitude yourself, or if you replace\nthe provider via the <code>d2uevents_geocode_provider<\/code> filter.<\/p>\n\n<ul>\n<li>Service: OpenStreetMap Nominatim \u2014 https:\/\/nominatim.org\/<\/li>\n<li>Usage policy: https:\/\/operations.osmfoundation.org\/policies\/nominatim\/<\/li>\n<li>Privacy policy: https:\/\/wiki.osmfoundation.org\/wiki\/Privacy_Policy<\/li>\n<\/ul>\n\n<p><strong>2. OpenStreetMap map tiles (Leaflet maps)<\/strong><\/p>\n\n<p>Single venue pages, the venues archive and the venue map display an interactive map\nrendered with the bundled Leaflet library. The map image tiles are loaded in the\nvisitor's browser from the OpenStreetMap tile servers, which receive the visitor's\nIP address and the map area being viewed. The tile source is configurable under\n<strong>Events \u2192 Settings<\/strong> (the \"Map tile URL\"), so you may point it at your own or a\nthird-party tile provider, and maps are only shown on pages that display one.<\/p>\n\n<ul>\n<li>Service: OpenStreetMap tile servers \u2014 https:\/\/www.openstreetmap.org\/<\/li>\n<li>Tile usage policy: https:\/\/operations.osmfoundation.org\/policies\/tiles\/<\/li>\n<li>Privacy policy: https:\/\/wiki.osmfoundation.org\/wiki\/Privacy_Policy<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>designed2use-events<\/code> folder to <code>\/wp-content\/plugins\/<\/code>,\nor install through <strong>Plugins \u2192 Add New<\/strong> in the dashboard.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>The Events calendar Page (<code>\/events\/<\/code>) and the Venues Page\n(<code>\/venues\/<\/code>) are created automatically the first time the plugin\nactivates. If a Page already exists at one of those slugs the\nplugin adopts it rather than creating a duplicate.<\/li>\n<li>Go to <strong>Events \u2192 Add New<\/strong> to create your first event. Add venues\nunder <strong>Venues \u2192 Add New<\/strong>.<\/li>\n<li>(Optional) Activate WooCommerce to unlock ticketing \u2014 the Tickets\nmeta box appears on the event editor.<\/li>\n<li>Adjust defaults under <strong>Events \u2192 Settings<\/strong>: page slugs, default\ncapacity, default timezone, map tile URL, attendee edit cutoff and\ndata deletion on uninstall.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20require%20woocommerce%3F\"><h3>Does this require WooCommerce?<\/h3><\/dt>\n<dd><p>No. The calendar, venues, single-event \/ single-venue pages, iCal\nfeeds, blocks, shortcodes and REST endpoint all work without\nWooCommerce. Activating WooCommerce just switches on the optional\nticketing module.<\/p><\/dd>\n<dt id=\"where%20does%20the%20calendar%20live%3F\"><h3>Where does the calendar live?<\/h3><\/dt>\n<dd><p>On a real WordPress Page at the configured calendar slug (default\n    \/events\/). The plugin renders its markup through the <code>the_content<\/code>\nfilter so the active theme's header, sidebar and footer surround the\ncalendar \u2014 no template takeover, works the same on block and classic\nthemes.<\/p><\/dd>\n<dt id=\"how%20do%20i%20override%20a%20template%3F\"><h3>How do I override a template?<\/h3><\/dt>\n<dd><p>Copy any file from <code>wp-content\/plugins\/designed2use-events\/templates\/<\/code>\nto <code>wp-content\/themes\/your-theme\/designed2use-events\/<\/code> at the same\nrelative path. The plugin picks up your version automatically. See\n    docs\/templates.md for the full lookup order and the variables each\npart receives.<\/p><\/dd>\n<dt id=\"where%20do%20i%20find%20the%20public%20hook%20api%3F\"><h3>Where do I find the public hook API?<\/h3><\/dt>\n<dd><p>docs\/hooks.md in the plugin folder. Every public action and filter\nis documented with parameters, since-version and example usage. The\nmachine-readable source is\n    src\/Extension\/HooksRegistry.php.<\/p><\/dd>\n<dt id=\"can%20i%20sell%20tickets%20without%20woocommerce%3F\"><h3>Can I sell tickets without WooCommerce?<\/h3><\/dt>\n<dd><p>Not in 1.0 \u2014 ticketing routes through WooCommerce only.<\/p><\/dd>\n<dt id=\"how%20is%20capacity%20tracked%3F\"><h3>How is capacity tracked?<\/h3><\/dt>\n<dd><p>When a ticket has its own capacity, that capacity tracks its own\ncounter. Otherwise the event's capacity (which itself cascades from\nevent \u2192 venue \u2192 settings \u2192 unlimited) is what every ticket on that\nevent shares. The cascade picks the first level that has a set value;\nbooked totals decrement that same level so refunds release back to\nwhere the booking came from.<\/p><\/dd>\n<dt id=\"what%20happens%20at%20uninstall%3F\"><h3>What happens at uninstall?<\/h3><\/dt>\n<dd><p>Nothing destructive by default. <strong>Events \u2192 Settings \u2192 Privacy &amp;\nuninstall<\/strong> has a \"delete data on uninstall\" opt-in \u2014 only when it's\non does uninstall remove events, venues, the occurrence table, the\nticket-stock table and the settings. Deactivating the plugin never\ndeletes data.<\/p><\/dd>\n<dt id=\"how%20do%20i%20subscribe%20to%20an%20event%20in%20a%20calendar%20app%3F\"><h3>How do I subscribe to an event in a calendar app?<\/h3><\/dt>\n<dd><p>Each event has an \"Add to calendar\" button that downloads an <code>.ics<\/code>\nfile. Subscribers can paste the iCal feed URL\n(<code>\/event\/{slug}\/feed\/ics\/<\/code>) into Google Calendar or any other\nRFC 5545 calendar client \u2014 updates flow through automatically.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20multisite%3F\"><h3>Does it work with multisite?<\/h3><\/dt>\n<dd><p>The CPT capability mapping follows the WordPress meta-cap rule (plural\nprimitive caps only, mapped to <code>edit_pages<\/code>) so super admins keep\naccess. The plugin has not yet been functionally regression-tested on\nmultisite \u2014 please report any issues.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Changed: refreshed the \"Designed2Use Events Pro\" section of the plugin\ndescription to a \"Coming Soon\" overview of the planned Pro features\n(recurring events, multi-tier tickets, registration form builder, QR\ncheck-in, organizers, week \/ day \/ map views, importer, automatic\nupdates). No code or behaviour changes \u2014 the free plugin is unchanged\nand every free feature stays free.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Changed: every global symbol now uses the longer, more distinct\n  d2uevents prefix (functions, hooks, options, post types, meta keys,\nthe <code>D2UEvents<\/code> namespace, REST route and blocks) to avoid collisions,\nper the WordPress.org plugin guidelines.<\/li>\n<li>Removed: the optional one-instance limit on the Events Calendar block \u2014\nany number of calendar blocks can now be placed on a page. The free\nplugin has no feature gating of any kind.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fixed: a ticket saved without an explicit sale window stored a\n  0000-00-00 00:00:00 zero-date instead of an empty window, which made\nthe event report \"Ticket sales for this event have ended\" even though\nthe event was in the future. Blank sale windows are now stored as NULL,\nand any existing zero-date rows are treated as \"no window\" on read.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added: <code>d2uevents_pre_sync_occurrences<\/code> filter, letting an add-on\n(e.g. Designed2Use Events Pro) take over occurrence-row management for\nan event \u2014 the foundation for the Pro recurrence engine.<\/li>\n<li>Added: <code>d2uevents_single_occurrence_limit<\/code> filter to control how many\nupcoming occurrences a single event's date picker offers.<\/li>\n<li>Added: occurrence-table repository helpers for in-place row updates and\nre-parenting rows between events (so bookings survive a series split).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Events, Venues and event categories \/ tags as custom post types\nwith sortable admin lists.<\/li>\n<li>Frontend Pages for the calendar and venues archive, created on\nactivation, rendered through <code>the_content<\/code> so the active theme owns\nthe chrome.<\/li>\n<li>Month + List calendar views with prev \/ next navigation, venue \/\ncategory \/ featured filters and a URL for every state.<\/li>\n<li>REST endpoint <code>\/wp-json\/d2uevents\/v1\/occurrences<\/code> and a\nserver-rendered + client-driven viewport swap.<\/li>\n<li>Four blocks under the \"Events shortcodes\" inserter category and\nfive shortcodes that mirror them.<\/li>\n<li>Per-event <code>.ics<\/code> download and subscribable iCal feed.<\/li>\n<li>JSON-LD <code>Event<\/code> schema in <code>&lt;head&gt;<\/code>.<\/li>\n<li>Multi-day events span every covered day in month view; \"Through\"\nhint in list view.<\/li>\n<li>Single event and single venue pages with embedded OpenStreetMap\n(Leaflet) maps.<\/li>\n<li>\"Add to calendar\" dropdown on the single event page \u2014 Google\nCalendar, Outlook.com, Yahoo Calendar and Apple Calendar (.ics).\nOutside-click and Esc both close the menu; Esc returns focus to\nthe trigger.<\/li>\n<li>Optional WooCommerce ticketing module \u2014 Tickets meta box with\ninline editor, deductive event-cap model (per-ticket capacities\nreserve from the event pool), sale window with event-end fallback,\natomic capacity decrement, refund-aware release, per-ticket\nattendee capture, HPOS compatibility.<\/li>\n<li>Per-event \"Maximum tickets per user\" limit for logged-in customers\n\u2014 enforced on the event page, at add-to-cart and at order\ncompletion.<\/li>\n<li>Per-event Attendees admin screen with CSV export (RFC-4180 +\nUTF-8 BOM, opens cleanly in Excel).<\/li>\n<li>WooCommerce privacy export \/ erasure integration.<\/li>\n<li>Customer my-account attendee editor with configurable cutoff.<\/li>\n<li>Email customisations \u2014 appended \"Your attendees\" section on\ncustomer order confirmation emails (HTML + plain-text,\ntheme-overridable). <strong>Events \u2192 Settings \u2192 Emails<\/strong> exposes a\nper-WC-email toggle, custom section heading, optional intro\nparagraph and column-visibility toggles.<\/li>\n<li>Full settings page under <strong>Events \u2192 Settings<\/strong>.<\/li>\n<li>Calendar grid is keyboard-navigable \u2014 arrow keys move focus by\n\u00b11 day \/ \u00b11 week, Home \/ End jump to row edges,\nPageUp \/ PageDown paginate months, Enter on a focused cell opens\nthe first event. <code>role=\"grid\"<\/code> + <code>aria-label<\/code> on each cell + a\nscreen-reader live region announce view swaps.<\/li>\n<li>Calendar query cached in the object cache (group\n  d2uevents_calendar) with namespace-version invalidation on\nevery event save, trash, settings save or category change. Two\nfilters (<code>d2uevents_calendar_query_cacheable<\/code>,\n  d2uevents_calendar_query_cache_ttl) and one action\n(<code>d2uevents_calendar_query_invalidated<\/code>) let downstream caches\nhook the same lifecycle.<\/li>\n<li>CSS custom properties (<code>--d2u-events-*<\/code>) for theming \u2014 accent,\nsurface, border, state and spacing tokens declared on a <code>:where()<\/code>\nselector list so theme overrides win without specificity wars.\nDocumented in <code>docs\/templates.md<\/code> with three worked\ntemplate-override examples.<\/li>\n<li>Toast feedback on the Tickets meta box for every AJAX round-trip\n(create \/ link \/ unlink \/ delete \/ save) so success messages\nsurvive the list-item DOM swap.<\/li>\n<li>Friendly empty states \u2014 calendar Page with active filters shows\n\"Clear filters\" CTA; site-wide empty shows admins a \"Create your\nfirst event \u2192\" prompt; REST-failure path on view-swap offers an\ninline <strong>Try again<\/strong> + \"Open server-rendered view\" link instead\nof an auto-redirect.<\/li>\n<li>Plugin Check clean (zero errors, zero warnings under the wp.org\npreset).<\/li>\n<\/ul>","raw_excerpt":"A standalone WordPress events calendar with month + list views, venue archive, iCal feeds, and optional WooCommerce ticketing.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/322035","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=322035"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/guy1ncognito"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=322035"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=322035"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=322035"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=322035"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=322035"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=322035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}