{"id":313469,"date":"2026-08-17T09:38:50","date_gmt":"2026-08-17T09:38:50","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/eventspress\/"},"modified":"2026-08-17T09:42:52","modified_gmt":"2026-08-17T09:42:52","slug":"happenboard","status":"publish","type":"plugin","link":"https:\/\/mfe.wordpress.org\/plugins\/happenboard\/","author":12819032,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.0","stable_tag":"0.1.0","tested":"7.0.4","requires":"6.9","requires_php":"8.2","requires_plugins":null,"header_name":"HappenBoard","header_author":"rainbowgeek","header_description":"Block-native events calendar \u2014 recurring events, RSVPs, iCal feeds, and Event Schema markup. Built for the Site Editor.","assets_banners_color":"","last_updated":"2026-08-17 09:42:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/rainbowgeek\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":28,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"rainbowgeek","date":"2026-08-17 09:42:52"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":{"happenboard\/event-series-occurrences":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/event-series-occurrences","title":"Event Series \u2014 All Dates","category":"happenboard","description":"Lists every upcoming occurrence of the current recurring event. Renders nothing for one-shot events. Used by the Series page template and the default Single Event template.","icon":"list-view","keywords":["event","series","recurring","occurrences","dates"],"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true,"lineHeight":true}},"attributes":{"limit":{"type":"number","default":24},"showRrule":{"type":"boolean","default":true},"groupByMonth":{"type":"boolean","default":true},"heading":{"type":"string","default":"All dates"}},"usesContext":["postId","postType"],"textdomain":"happenboard","editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"happenboard\/countdown":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/countdown","title":"Event Countdown","description":"Live countdown to the event's start time. Falls back to a static label when the event has started.","category":"happenboard","icon":"backup","keywords":["countdown","timer","live"],"textdomain":"happenboard","version":"0.1.0","usesContext":["postId","postType"],"attributes":{"showDays":{"type":"boolean","default":true},"showHours":{"type":"boolean","default":true},"showMinutes":{"type":"boolean","default":true},"showSeconds":{"type":"boolean","default":true},"liveLabel":{"type":"string","default":"Event has started"},"endedLabel":{"type":"string","default":"Event has ended"}},"supports":{"html":false,"align":["wide"],"color":{"background":true,"text":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true,"fontWeight":true}},"editorScript":"file:.\/index.js","viewScript":"file:.\/view.js","style":"file:.\/style-index.css"},"happenboard\/rsvp-form":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/rsvp-form","title":"RSVP Form","description":"Collect free RSVPs for the current event. Capacity-aware, no extra plugin required.","category":"happenboard","icon":"yes-alt","keywords":["events","rsvp","registration","form"],"textdomain":"happenboard","version":"0.1.0","usesContext":["postId","postType"],"attributes":{"showCapacity":{"type":"boolean","default":true},"allowQuantity":{"type":"boolean","default":false},"maxQuantity":{"type":"number","default":4},"successMessage":{"type":"string","default":""}},"supports":{"html":false,"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","viewScript":"file:.\/view.js","style":"file:.\/style-index.css"},"happenboard\/my-schedule":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/my-schedule","title":"My Schedule","category":"happenboard","description":"Lists the events the current visitor has saved. Empty state when nothing is saved. Designed for a dedicated \"My schedule\" page that visitors can bookmark.","icon":"calendar","keywords":["favorites","wishlist","schedule","saved","personal"],"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true,"lineHeight":true}},"attributes":{"showImage":{"type":"boolean","default":true},"showDate":{"type":"boolean","default":true},"showVenue":{"type":"boolean","default":true},"emptyTitle":{"type":"string","default":"No saved events yet"},"emptyText":{"type":"string","default":"Tap the Save button on any event to add it here."}},"textdomain":"happenboard","editorScript":"file:.\/index.js","viewScript":"file:.\/view.js","style":"file:.\/style-index.css"},"happenboard\/event-date-time":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/event-date-time","title":"Event Date & Time","description":"Display the next occurrence date and time for the current event.","category":"happenboard","icon":"clock","keywords":["event","date","time","schedule"],"textdomain":"happenboard","version":"0.1.0","usesContext":["postId","postType"],"attributes":{"showEnd":{"type":"boolean","default":true},"showTimezone":{"type":"boolean","default":false}},"supports":{"html":false,"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true},"typography":{"fontSize":true,"lineHeight":true,"fontStyle":true,"fontWeight":true}},"editorScript":"file:.\/index.js"},"happenboard\/my-bookings":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/my-bookings","title":"My Bookings","category":"happenboard","description":"Lists the appointments the signed-in visitor booked, with a cancel action on upcoming ones. Signed-out visitors get a sign-in prompt. Bookings made without an account are not listed \u2014 those are managed through the link in the confirmation email.","icon":"clipboard","keywords":["bookings","appointments","account","cancel","customer"],"supports":{"html":false,"align":["wide"],"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true,"lineHeight":true}},"attributes":{"showPast":{"type":"boolean","default":true}},"textdomain":"happenboard","editorScript":"file:.\/index.js","viewScript":"file:.\/view.js","style":"file:.\/style-index.css"},"happenboard\/events-grid":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/events-grid","title":"Events Grid","description":"Server-rendered grid of upcoming events with featured image, date, venue, and a link to each event.","category":"happenboard","icon":"grid-view","keywords":["events","grid","cards","upcoming","tiles"],"textdomain":"happenboard","version":"0.1.0","attributes":{"count":{"type":"number","default":6},"columns":{"type":"number","default":3},"showImage":{"type":"boolean","default":true},"showDate":{"type":"boolean","default":true},"showVenue":{"type":"boolean","default":true},"showExcerpt":{"type":"boolean","default":false}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"happenboard\/event-categories-tags":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/event-categories-tags","title":"Event Categories & Tags","description":"Show the current event's categories and tags as linked chips.","category":"happenboard","icon":"tag","keywords":["event","category","tag","taxonomy"],"textdomain":"happenboard","version":"0.1.0","usesContext":["postId","postType"],"attributes":{"showCategories":{"type":"boolean","default":true},"showTags":{"type":"boolean","default":true},"linked":{"type":"boolean","default":true}},"supports":{"html":false,"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"happenboard\/event-organizer":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/event-organizer","title":"Event Organizer","description":"Display the organizer name and contact for the current event.","category":"happenboard","icon":"businessperson","keywords":["event","organizer","host","contact"],"textdomain":"happenboard","version":"0.1.0","usesContext":["postId","postType"],"attributes":{"showEmail":{"type":"boolean","default":true},"showLabel":{"type":"boolean","default":false}},"supports":{"html":false,"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js"},"happenboard\/event-weather":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/event-weather","title":"Event Weather","description":"Show the weather for the event's date at its venue \u2014 forecast, observed history, or a typical-for-the-season normal.","category":"happenboard","icon":"cloud","keywords":["event","weather","forecast","temperature","meteo"],"textdomain":"happenboard","version":"0.1.0","usesContext":["postId","postType"],"attributes":{"display":{"type":"string","default":"detailed"},"tempUnit":{"type":"string","default":"celsius"},"windUnit":{"type":"string","default":"kmh"},"precipUnit":{"type":"string","default":"mm"},"showCondition":{"type":"boolean","default":true},"showPrecip":{"type":"boolean","default":true},"showWind":{"type":"boolean","default":true},"showHumidity":{"type":"boolean","default":false},"showSun":{"type":"boolean","default":false},"latitude":{"type":"number","default":0},"longitude":{"type":"number","default":0},"dateOverride":{"type":"string","default":""}},"supports":{"html":false,"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true},"__experimentalBorder":{"color":true,"radius":true,"style":true,"width":true}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"happenboard\/event-venue":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/event-venue","title":"Event Venue","description":"Display the venue name and address for the current event.","category":"happenboard","icon":"location-alt","keywords":["event","venue","location","address"],"textdomain":"happenboard","version":"0.1.0","usesContext":["postId","postType"],"attributes":{"showAddress":{"type":"boolean","default":true},"showLabel":{"type":"boolean","default":false},"showMap":{"type":"boolean","default":false},"mapHeight":{"type":"number","default":280},"mapZoom":{"type":"number","default":15},"mapProvider":{"type":"string","default":"site"}},"supports":{"html":false,"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js"},"happenboard\/event-query-loop":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/event-query-loop","title":"Event Query Loop","description":"Filterable server-rendered loop of events by date range, category, tag, venue, or organizer. The events-flavoured Query Loop.","category":"happenboard","icon":"feedback","keywords":["events","query","loop","filter","list","grid"],"textdomain":"happenboard","version":"0.1.0","attributes":{"count":{"type":"number","default":10},"dateRange":{"type":"string","default":"upcoming"},"order":{"type":"string","default":"asc"},"categoryIds":{"type":"array","default":[],"items":{"type":"number"}},"tagIds":{"type":"array","default":[],"items":{"type":"number"}},"venueId":{"type":"number","default":0},"organizerId":{"type":"number","default":0},"layout":{"type":"string","default":"list"},"columns":{"type":"number","default":3},"showImage":{"type":"boolean","default":true},"showDate":{"type":"boolean","default":true},"showVenue":{"type":"boolean","default":true},"showOrganizer":{"type":"boolean","default":false},"showCategories":{"type":"boolean","default":false},"showExcerpt":{"type":"boolean","default":false}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"happenboard\/events-list":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/events-list","title":"Events List","description":"Server-rendered list of upcoming events with date, venue, and a link to each event.","category":"happenboard","icon":"list-view","keywords":["events","list","schedule","upcoming","agenda"],"textdomain":"happenboard","version":"0.1.0","attributes":{"count":{"type":"number","default":10},"showVenue":{"type":"boolean","default":true},"showOrganizer":{"type":"boolean","default":false},"groupByMonth":{"type":"boolean","default":true}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"happenboard\/upcoming-events":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/upcoming-events","title":"Upcoming Events","description":"Display a server-rendered list of upcoming events.","category":"happenboard","icon":"calendar-alt","keywords":["events","calendar","schedule","upcoming"],"textdomain":"happenboard","version":"0.1.0","attributes":{"count":{"type":"number","default":5}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css"},"happenboard\/event-description":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/event-description","title":"Event Description","description":"Renders the current event's content with the standard the_content filter applied.","category":"happenboard","icon":"editor-paragraph","keywords":["event","description","content","body"],"textdomain":"happenboard","version":"0.1.0","usesContext":["postId","postType"],"attributes":{"showExcerptOnly":{"type":"boolean","default":false}},"supports":{"html":false,"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js"},"happenboard\/favorite-toggle":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/favorite-toggle","title":"Save Event Button","category":"happenboard","description":"A heart \/ bookmark toggle so visitors can save an event to their personal schedule. Persists in their account when logged in, in localStorage otherwise.","icon":"heart","keywords":["favorite","save","bookmark","wishlist","schedule"],"supports":{"html":false,"spacing":{"margin":true,"padding":true},"color":{"background":true,"text":true},"typography":{"fontSize":true}},"attributes":{"saveLabel":{"type":"string","default":"Save event"},"savedLabel":{"type":"string","default":"Saved"},"iconStyle":{"type":"string","default":"heart","enum":["heart","bookmark","star"]},"showCount":{"type":"boolean","default":false}},"usesContext":["postId","postType"],"textdomain":"happenboard","editorScript":"file:.\/index.js","viewScript":"file:.\/view.js","style":"file:.\/style-index.css"},"happenboard\/calendar":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/calendar","title":"Calendar","description":"Display a server-rendered month calendar of upcoming events.","category":"happenboard","icon":"calendar","keywords":["events","calendar","month","schedule"],"textdomain":"happenboard","version":"0.1.0","attributes":{"defaultView":{"type":"string","default":"month"},"agendaDays":{"type":"number","default":30},"showViewSwitcher":{"type":"boolean","default":true}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","viewScript":"file:.\/view.js"},"happenboard\/booking-types-list":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/booking-types-list","title":"Booking Types","description":"A catalogue of bookable services. Each card links to that service's own booking page.","category":"happenboard","icon":"list-view","keywords":["booking","services","appointments","catalogue"],"textdomain":"happenboard","version":"0.1.0","attributes":{"columns":{"type":"number","default":2},"showDuration":{"type":"boolean","default":true},"showDescription":{"type":"boolean","default":true}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"happenboard\/booking-availability":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/booking-availability","title":"Booking Availability","description":"Publishes when a service is free \u2014 as a month calendar or a schedule list \u2014 anywhere on the site. Each time links straight into the booking page with that slot pre-selected.","category":"happenboard","icon":"clock","keywords":["availability","booking","appointment","schedule","slots"],"textdomain":"happenboard","version":"0.1.0","attributes":{"bookingTypeId":{"type":"number","default":0},"layout":{"type":"string","default":"calendar"},"daysAhead":{"type":"number","default":30},"showHeader":{"type":"boolean","default":true}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","viewScript":"file:.\/view.js","style":"file:.\/style-index.css"},"happenboard\/booking-page":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/booking-page","title":"Booking Page","description":"A self-service appointment-booking flow: pick a time, fill your details, get confirmed. FSE-native, no iframe.","category":"happenboard","icon":"calendar-alt","keywords":["booking","appointment","schedule","calendar"],"textdomain":"happenboard","version":"0.1.0","attributes":{"bookingTypeId":{"type":"number","default":0},"introText":{"type":"string","default":""}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","viewScript":"file:.\/view.js","style":"file:.\/style-index.css"},"happenboard\/add-to-calendar":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"happenboard\/add-to-calendar","title":"Add to Calendar","description":"One-click links to add this event to Google, Outlook, Yahoo, or download an .ics file.","category":"happenboard","icon":"calendar-alt","keywords":["calendar","ics","google","outlook","save"],"textdomain":"happenboard","version":"0.1.0","usesContext":["postId","postType"],"attributes":{"showGoogle":{"type":"boolean","default":true},"showOutlook":{"type":"boolean","default":true},"showYahoo":{"type":"boolean","default":false},"showIcal":{"type":"boolean","default":true}},"supports":{"html":false,"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true,"margin":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"}},"tagged_versions":["0.1.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[8132,269,416,1486,15480],"plugin_category":[40],"plugin_contributors":[80067],"plugin_business_model":[],"class_list":["post-313469","plugin","type-plugin","status-publish","hentry","plugin_tags-appointments","plugin_tags-booking","plugin_tags-calendar","plugin_tags-events","plugin_tags-rsvp","plugin_category-calendar-and-events","plugin_contributors-rainbowgeek","plugin_committers-rainbowgeek"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/happenboard.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>HappenBoard<\/strong> is a modern, lightweight events calendar <strong>and appointment-booking plugin<\/strong>, built from the ground up for the WordPress block editor and the Site Editor. It uses only core WordPress components, server-rendered blocks, and clean PSR-4 PHP 8.2 code.<\/p>\n\n<p>It is built by the team behind <a href=\"https:\/\/www.seopress.org\/\">SEOPress<\/a> and <a href=\"https:\/\/www.mailerpress.com\/\">MailerPress<\/a>, with the same focus on speed, native integration, and a generous free tier.<\/p>\n\n<h4>Why HappenBoard<\/h4>\n\n<ul>\n<li><strong>Fast and SEO-friendly out of the box.<\/strong> Server-rendered blocks load instantly and are indexed by Google \u2014 no JavaScript-only pages that hurt your rankings.<\/li>\n<li><strong>Works with your theme.<\/strong> Native blocks adapt to your design without custom CSS, and Site Editor templates let you redesign every event page visually.<\/li>\n<li><strong>Stop losing attendees.<\/strong> Free RSVPs with capacity limits, email confirmations, automatic reminders, and a one-click cancellation link, everything your visitors need to actually show up.<\/li>\n<li><strong>Real recurring events.<\/strong> Weekly classes, monthly meetups, yearly conferences \u2014 set it once and HappenBoard handles every occurrence.<\/li>\n<li><strong>Take appointments too.<\/strong> A full booking flow in the free plugin: booking types, per-host weekly availability with buffers and notice windows, days off, round-robin assignment across unlimited hosts, group bookings, a standards-compliant <code>.ics<\/code> invite attached to every confirmation, and a token link so visitors cancel or reschedule themselves.<\/li>\n<li><strong>Get found on Google.<\/strong> Event Schema (JSON-LD) is added automatically so your events appear in Google's rich event results.<\/li>\n<li><strong>Move in without retyping anything.<\/strong> One-click importers for The Events Calendar, Events Manager, Sugar Calendar, EventKoi, Amelia, and any <code>.ics<\/code> file \u2014 they even work when the old plugin is already deactivated.<\/li>\n<li><strong>No lock-in, no clutter.<\/strong> Standard custom post types, REST API, and iCal feeds \u2014 your data stays yours and works with any tool.<\/li>\n<li><strong>Familiar admin.<\/strong> The same look and feel as WordPress core, so your team doesn't need to learn a new interface.<\/li>\n<\/ul>\n\n<h4>Also in the free plugin<\/h4>\n\n<ul>\n<li><strong>21 blocks<\/strong>, 11 patterns, and Site Editor templates for single events, the events archive, category archives, single booking types, and the per-event \u201cAll dates\u201d page<\/li>\n<li><strong>Weather forecast<\/strong> on event pages, for outdoor events (optional, powered by Open-Meteo)<\/li>\n<li><strong>Favourites and a personal \u201cMy schedule\u201d<\/strong> so visitors can save the events they care about<\/li>\n<li><strong>Multilingual<\/strong> \u2014 WPML and Polylang, through the bundled <code>wpml-config.xml<\/code><\/li>\n<li><strong>GDPR-native<\/strong> \u2014 real WordPress personal-data exporter and eraser, not just a settings page<\/li>\n<li><strong>Spam protection<\/strong> \u2014 honeypot and signed timestamps by default, optional Cloudflare Turnstile and Akismet<\/li>\n<li><strong>Site Health checks<\/strong> that tell you when a cron failure is about to stop your reminders<\/li>\n<li><strong>REST API<\/strong> for every entity, <strong>WP-CLI<\/strong> commands for event creation and migrations, plus an Elementor widget for classic-builder sites<\/li>\n<\/ul>\n\n<h4>Built the WordPress way<\/h4>\n\n<ul>\n<li>PHP 8.2+ with strict types and PSR-4 autoloading<\/li>\n<li>Vendor libraries (sabre\/vobject) prefixed with Strauss \u2014 no conflict with any other plugin shipping the same dependency<\/li>\n<li>PHPCS (WordPress Coding Standards), PHPStan level 5, PHPUnit test suite<\/li>\n<li>Translation-ready (text domain <code>happenboard<\/code>)<\/li>\n<li>Accessibility-aware front-end components<\/li>\n<\/ul>\n\n<h4>From the team<\/h4>\n\n<p>HappenBoard is built by the same team behind <a href=\"https:\/\/www.seopress.org\/\">SEOPress<\/a> \u2014 trusted by 300,000+ WordPress sites. Same engineering bar, same support commitments, same long-term maintenance.<\/p>\n\n<h3>Source code and build<\/h3>\n\n<p>HappenBoard is fully GPL and ships its complete, human-readable source inside the plugin \u2014 nothing is obfuscated.<\/p>\n\n<ul>\n<li><strong>PHP<\/strong> \u2014 uncompiled PSR-4 source in <code>src\/<\/code>. Third-party libraries are prefixed with <a href=\"https:\/\/github.com\/BrianHenryIE\/strauss\">Strauss<\/a> and ship readable in <code>vendor-prefixed\/<\/code> (notably <code>sabre\/vobject<\/code> for RRULE parsing).<\/li>\n<li><strong>JavaScript \/ CSS<\/strong> \u2014 the editor and admin code in <code>build\/<\/code> is compiled with <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\"><code>@wordpress\/scripts<\/code><\/a> (webpack). The matching uncompiled source ships alongside it: block source in <code>src\/blocks\/<\/code>, the admin SPA in <code>assets\/js\/admin\/<\/code>, and the post-editor scripts in <code>assets\/js\/post-editor\/<\/code>. The build configuration (<code>package.json<\/code> and <code>webpack.config.js<\/code>) is included too.<\/li>\n<\/ul>\n\n<p>To regenerate every compiled asset from source:<\/p>\n\n<pre><code>npm install\nnpm run build\n<\/code><\/pre>\n\n<p>Requires Node 20+. <code>npm run start<\/code> runs the same build in watch mode. PHP dependencies, if you rebuild the prefixed tree, are managed with <code>composer install<\/code>.<\/p>\n\n<p>All declarations follow WordPress prefixing rules: PHP is namespaced under <code>HappenBoard\\<\/code>, options\/transients use the <code>happenboard_<\/code> prefix, post meta uses <code>_happenboard_<\/code>, and taxonomies use <code>happenboard_<\/code> (<code>happenboard_category<\/code>, <code>happenboard_tag<\/code>). Post types use the shorter <code>hboard_<\/code> prefix (<code>hboard_event<\/code>, <code>hboard_venue<\/code>, <code>hboard_organizer<\/code>, <code>hboard_booking_type<\/code>) because WordPress caps post type names at 20 characters.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>HappenBoard stores attendee and booking data (name, email, RSVP or appointment status) in your own WordPress database. It collects no telemetry, requires no account, and sends nothing anywhere by default.<\/p>\n\n<p>Four optional features do contact a third party, and only once you turn them on:<\/p>\n\n<ul>\n<li><strong>Event weather<\/strong> \u2014 the event's coordinates and date are sent to <a href=\"https:\/\/open-meteo.com\/\">Open-Meteo<\/a> to fetch a forecast. No visitor or attendee data is included.<\/li>\n<li><strong>Venue maps<\/strong> \u2014 an embedded map loads from OpenStreetMap (default), Google Maps, or a custom tile provider you configure. Your visitor's browser contacts that provider directly, as with any embedded map.<\/li>\n<li><strong>Cloudflare Turnstile<\/strong> \u2014 when enabled for the RSVP or booking forms, the submitting visitor's IP address and challenge token are sent to <a href=\"https:\/\/www.cloudflare.com\/privacypolicy\/\">Cloudflare<\/a> for verification.<\/li>\n<li><strong>Akismet<\/strong> \u2014 when enabled, the submission's name, email, IP address and user agent are sent to <a href=\"https:\/\/akismet.com\/privacy\/\">Akismet<\/a> for spam scoring.<\/li>\n<\/ul>\n\n<p>All four are off unless you enable them. HappenBoard also registers with WordPress's own privacy tools, so a personal-data export or erasure request made through <strong>Tools \u2192 Export\/Erase Personal Data<\/strong> covers the visitor's RSVPs and tickets.<\/p>\n\n<!--section=installation-->\n<h4>From WordPress.org<\/h4>\n\n<ol>\n<li>Search <strong>HappenBoard<\/strong> under <strong>Plugins \u2192 Add New<\/strong> in your WordPress admin.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>Run the onboarding wizard that appears (general settings \u2192 email).<\/li>\n<li>Go to <strong>Events \u2192 Add New<\/strong> to create your first event.<\/li>\n<li>Insert the <strong>Calendar<\/strong> or <strong>Upcoming Events<\/strong> block into any page or template.<\/li>\n<\/ol>\n\n<h4>Manual upload<\/h4>\n\n<ol>\n<li>Download the .zip from WordPress.org.<\/li>\n<li>Go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, choose the .zip, click <strong>Install Now<\/strong>.<\/li>\n<li>Activate and follow the onboarding wizard.<\/li>\n<\/ol>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.9 or newer<\/li>\n<li>PHP 8.2 or newer<\/li>\n<li>MySQL 5.7+ \/ MariaDB 10.3+ (uses standard <code>dbDelta<\/code>)<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20classic%20themes%3F\"><h3>Does this work with classic themes?<\/h3><\/dt>\n<dd><p>Yes. All blocks can be inserted in any post, page, or widget area. If your theme supports the Site Editor (FSE), HappenBoard also ships matching block templates for single events and the event archive.<\/p><\/dd>\n<dt id=\"will%20this%20conflict%20with%20other%20event%20plugins%3F\"><h3>Will this conflict with other event plugins?<\/h3><\/dt>\n<dd><p>No. HappenBoard uses its own post type (<code>hboard_event<\/code>), prefixed meta keys (<code>_happenboard_*<\/code>), prefixed database tables (<code>happenboard_occurrences<\/code>, <code>happenboard_attendees<\/code>, <code>happenboard_bookings<\/code>, <code>happenboard_availability_rules<\/code>, <code>happenboard_agent_log<\/code>), and prefixed third-party libraries (<code>HappenBoard\\Vendor\\\u2026<\/code>). You can run it alongside any other event plugin without conflict.<\/p><\/dd>\n<dt id=\"does%20happenboard%20add%20event%20schema%20%28json-ld%29%20for%20seo%3F\"><h3>Does HappenBoard add Event schema (JSON-LD) for SEO?<\/h3><\/dt>\n<dd><p>Yes \u2014 automatically, on every single-event page, conforming to the <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/event\">Google rich-result spec<\/a>. If <a href=\"https:\/\/www.seopress.org\/\">SEOPress<\/a> is active and an Event schema has been manually configured for the same post through SEOPress's custom-schema feature, HappenBoard defers to SEOPress to avoid double emission.<\/p><\/dd>\n<dt id=\"does%20it%20support%20recurring%20events%3F\"><h3>Does it support recurring events?<\/h3><\/dt>\n<dd><p>Yes. Recurrence is stored as a standard RFC 5545 RRULE and expanded into a persisted occurrences table using the same library (<code>sabre\/vobject<\/code>) that powers most calendar servers.<\/p><\/dd>\n<dt id=\"where%20are%20attendees%20managed%3F\"><h3>Where are attendees managed?<\/h3><\/dt>\n<dd><p>Under <strong>HappenBoard \u2192 Attendees<\/strong> in the admin. The screen is built on <code>@wordpress\/dataviews<\/code>, the same component library the Site Editor and the Posts screen use. HappenBoard bundles its own copy, because WordPress does not register <code>wp-dataviews<\/code> as a public script handle.<\/p><\/dd>\n<dt id=\"can%20i%20export%20translations%3F\"><h3>Can I export translations?<\/h3><\/dt>\n<dd><p>Yes. The text domain is <code>happenboard<\/code> and the plugin is ready for translation on translate.wordpress.org. To generate a fresh <code>.pot<\/code> locally, run <code>npm run makepot<\/code>.<\/p><\/dd>\n<dt id=\"how%20do%20i%20completely%20uninstall%20happenboard%20and%20erase%20all%20its%20data%3F\"><h3>How do I completely uninstall HappenBoard and erase all its data?<\/h3><\/dt>\n<dd><p>By default, deleting the plugin from <strong>Plugins \u2192 Installed Plugins \u2192 Delete<\/strong> preserves all of your data \u2014 events, attendees, occurrences, settings, taxonomy terms, and custom capabilities all stay in the database. This is intentional, so re-installing later restores everything as it was.<\/p>\n\n<p>To opt in to a full wipe, add the following constant to your <code>wp-config.php<\/code> <em>before<\/em> clicking <strong>Delete<\/strong>:<\/p>\n\n<pre><code>define( 'HAPPENBOARD_UNINSTALL', true );\n<\/code><\/pre>\n\n<p>When that constant is set, deleting the plugin will:<\/p>\n\n<ul>\n<li>Remove every event, venue, organizer, and booking-type post (and their post meta)<\/li>\n<li>Remove every event category and event tag<\/li>\n<li>Drop the custom tables <code>wp_happenboard_occurrences<\/code>, <code>wp_happenboard_attendees<\/code>, <code>wp_happenboard_bookings<\/code>, <code>wp_happenboard_availability_rules<\/code> and <code>wp_happenboard_agent_log<\/code><\/li>\n<li>Delete every option starting with <code>happenboard_<\/code> (general settings, onboarding flag, DB versions, etc.)<\/li>\n<li>Delete every plugin transient<\/li>\n<li>Clear the plugin's scheduled WP-Cron events<\/li>\n<li>Remove every HappenBoard custom capability from every role<\/li>\n<\/ul>\n\n<p>The wipe is multisite-aware \u2014 on a network install it runs once per blog. After the uninstall completes you can remove the constant from <code>wp-config.php<\/code>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<p>First public release.<\/p>","raw_excerpt":"Block-native events calendar and appointment booking for WordPress. Built for the Site Editor. Recurring events, RSVPs, iCal feeds, Event Schema.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/313469","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=313469"}],"author":[{"embeddable":true,"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/rainbowgeek"}],"wp:attachment":[{"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=313469"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=313469"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=313469"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=313469"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=313469"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mfe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=313469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}