Repository navigation
Releases
Releases · GatherPress/gatherpress
0.37.0-alpha.1
Added
- Added a viewer local time tooltip to the Event Date block and an administrative setting under Events > Date & Time. When enabled and the event date displays a timezone, viewers in a different timezone see the converted event time in their local timezone via an accessible tooltip. #2065
- Added subscribe link placeholders for calendar feeds. Set any link or button to a placeholder such as
#gatherpress-calendar-subscribe-venue-urlor#gatherpress-calendar-feed-topic-workshops-url, and it links to the matching feed for the page, the whole site, the events archive, a venue or a topic, as awebcal://orhttps://address. A placeholder with no feed loses its address, so it is no longer a link that goes nowhere. In an Add to Calendar dropdown, a placeholder uses the event the block is set to. #2574 - Added the ability to filter a Query Loop of shadow-source posts (venues, productions, seasons) by whether those sources have upcoming or past events attached. A "Filter by event activity" toggle in the GatherPress query panel turns it on, and an Upcoming / Past choice (Upcoming by default) limits the list to sources with at least one upcoming event, or at least one past event. Supported over the REST API for editor previews. #2205
- Add event-end scheduler and cache invalidation. Schedules a single WP-Cron job at the event end timestamp to fire the
gatherpress_event_endedaction and invalidate post and query caches when an event concludes. #2412 - A new Email page in the Events menu lets an administrator email users without going through an event: all users, users with chosen roles, or, while RSVPs are turned on, users who RSVP'd to any event in the past 30, 90, 180 or 365 days. Users who turned event updates off are skipped, and the message goes out from cron in batches.
gatherpress_site_message_active_dayschanges the active windows on offer, andgatherpress_site_message_subjectthe subject. #2334 - A shared
Mailerclass now queues and sends event update emails and Email page messages from cron, in batches of 50 recipients, so a large send never holds up the request that started it. Code registers a mail type withregister()and queues it withqueue().gatherpress_email_recipient_consentdecides per recipient whether a message goes out (it defaults to the event updates opt-in, except for emails about a user's own RSVP),gatherpress_email_recipientsandgatherpress_email_batch_sizeadjust each batch, andgatherpress_email_pre_enqueue_joblets a companion plugin take over scheduling. #2334 - Attendees now get an email reminder before an event starts, a day ahead by default, and an hour ahead as well if chosen. Change the timing or turn reminders off under Settings > RSVP > Notifications, where waiting list emails can now be turned off too. Users can opt out of reminders in their profile, and the new
gatherpress_event_startingaction lets other code run when an event starts. #2554 - Attendees who move off the waiting list now get an email confirming their spot. Because it is about their own RSVP, it goes out even when they turned event updates off. #2323
- Close RSVPs for events that have been canceled. New RSVPs and status changes are refused, and reminder emails are not sent. The RSVP block gets an editable Canceled template, a disabled "Canceled" button by default, and the RSVP Form gets a "When Event Is Canceled" visibility setting with a canceled notice in its default template. Blocks saved before this show a default canceled button or notice. #2410
- Events can say they are canceled, postponed, rescheduled, moved or tentative, rather than leaving people to guess from a note in the description. The status is set from the event's Date & Time settings and reaches calendar apps as a real cancellation. Companion plugins and site owners can add statuses of their own with the gatherpress_event_statuses filter, and choose whether each one crosses out the date the way canceled and postponed do. #2229
- Four calendar blocks and an "Event Calendar" variation of the Query Loop block show events, or other posts, in a month, week or day calendar, with Previous and Next links, a popover for each event and an optional time grid of hours. The blocks come from the GatherPress Calendar plugin and keep its block names, so content made with the plugin continues to work. #2503
- Modals and RSVPs work without JavaScript. A modal opens and closes by reloading the page where it was clicked, and the RSVP block saves an RSVP, guest count and anonymity through the RSVP REST endpoint, then returns to the block. #2513
- On the Events > RSVPs screen, an RSVP can now be marked as a no-show as well as checked in. RSVPs that were never marked show as "Not recorded", and a new filter lists the RSVPs in each check-in state, so the remaining ones can be marked as no-shows together. Companion plugins can add their own check-in states, such as a check-in for people who joined online. #2550
- Show upcoming and past events, published venues, and attending and waiting list RSVPs in the dashboard At a Glance widget. #2397
- The event list query,
Event\Query::get_events_list(), now takes an arguments array instead of positional parameters, so code calling it with positional arguments needs to pass an array. A newgatherpress_event_query_varsfilter runs on every query that lists upcoming or past events, including the Event Query block, event archives and feeds, and the iCal feed. A plugin can use it to add meta constraints, taxonomies or its own ordering, for example to filter events by location, and GatherPress still applies the upcoming or past date range. #2339
Changed
- Clicking the confirmation link in an RSVP email now remembers the RSVP in that browser until it closes, and takes the token off the address bar, so it no longer ends up in browser history or a copied link. The RSVP block and REST API read this session cookie instead of the
gatherpress_rsvp_tokenURL parameter, and the RSVP REST route no longer takes anrsvp_tokenparameter. #2454 - Modals now open as the browser's own dialog, so the browser keeps keyboard focus inside an open modal, hides the page behind it from assistive technology, and closes it on Escape. #2535
- Settings import and export on the Tools tab now go through the
gatherpress/v1/settings/exportandgatherpress/v1/settings/importREST routes, replacing thegatherpress_export_settingsandgatherpress_import_settingsadmin-ajax actions. Results and errors show on the page instead of in an alert, and the import preview shows the file's contents as text rather than HTML. #2456 - The add-to-calendar links and iCalendar feeds moved from the
GatherPress\Core\Calendarnamespace toGatherPress\Core\Calendar\External, and their filters are nowgatherpress_calendar_external_urlandgatherpress_calendar_external_max_age. Code that uses the old class names or filter names needs updating. Feed and download URLs do not change. #2536 - The confirmation email for an RSVP without an account now goes out from cron through the shared Mailer, so submitting the RSVP no longer waits on the mail server. Its link works for 24 hours from when the email is sent, rather than from when the RSVP was made, and an unconfirmed RSVP is removed 24 hours after its email went out. #2454
- The profile opt-in names the post types that take RSVPs, for example "Events and Sessions", instead of always saying "events". A site can change the wording through the post types' own labels. #2334
- The
gatherpress_query_varsfilter is nowgatherpress_query_loop_vars. Code that hooks the old name needs to use the new one. #2205 - The
read_postandedit_postcapability constants move fromEventto a newGatherPress\Core\Capabilityclass. A newHas_Capabilitiestrait givesEventandVenueread_capability()andedit_capability()methods that default to those constants, so either class can use its own capability later without changing the shared default.Event::READ_CAPABILITYandEvent::EDIT_CAPABILITYare removed, so code using them should switch toEvent::read_capability()andEvent::edit_capability(). #2417
Removed
- Remove the fallbacks that let the pre-0.36.0 setting and event meta names keep answering. A site that has not re-saved its settings since 0.36.0, or an event whose meta was never rewritten, should run GatherPress Alpha's migration before updating. The former meta names are also no longer registered, so a REST consumer still reading
gatherpress_max_attendance_limitorgatherpress_max_guest_limitneeds to move togatherpress_capacityandgatherpress_guest_limit. [#2358](https://github.co...
0.36.2
Fixed
- A venue deleted while its static map renders, for example while a background prewarm job runs, no longer leaves a saved map or its PNG files behind. #2581
- Static venue maps no longer turn gray when a CARTO API key is set. Static maps now load tiles from the same CARTO host as interactive maps, and send the site's address with each tile request, so a key restricted to the site's domain is accepted. Maps already saved gray render again, and a map that gets no tiles is no longer saved, so it is retried instead of staying gray. Static maps on CARTO zoomed in past 18 use zoom 18 tiles, the highest CARTO serves, as interactive maps do. Changing the CARTO key renders saved maps again. A map that renders again gets a new file name, so a browser or CDN does not keep showing the gray image. A saved map whose file is missing renders again, and when a render fails, a saved map is kept only if it shows the venue's current location, without a missing retina image. A Regenerate Map that renders nothing reports the failure again. Old map images that no venue uses are deleted when a map renders again or a venue is deleted. Google maps saved before this update are not rendered again. #2569
0.36.1
Changed
- Compare RSVP tokens with hash_equals(). #2475
- Updated the configuration, settings and RSVP docs for the current setting names and RSVP Mode values, and the installation page for the WordPress 7.0 minimum. #2506
Fixed
- A password-protected event's RSVP and RSVP Form blocks stay hidden until the viewer enters its password, as its date and venue already do, including when they sit in a block template rather than the event's content. The RSVP form no longer accepts a response for a password-protected event without its password. #2520
- A password-protected event no longer gives its venue away: the REST API, the venue terms endpoint, the post classes and the head feed links leave it out, and lists filtered by a venue leave out password-protected events for anyone who cannot edit others' events. #2500
- A password-protected venue's details, and its link to the events held there, stay private for viewers without its password, as the Venue block already did: the venue's REST record, calendars, RSS feeds, and its events' location fields, REST records and feed links leave them out. The venue's name stays public, as for any password-protected post. New venue terms no longer start with "Protected: "; the GatherPress Alpha 0.36.1 migration renames existing ones. #2501
- Calendar feeds are cached separately for viewers who can see private events, so a feed loaded by an administrator is never served to other viewers, and only feeds that list public events alone are sent with public cache headers. #2473
- Event RSS feeds no longer add a password-protected event's date and venue to its excerpt and content. #2499
- Fix a second RSVP Form with the same layout as an earlier one on the same event using the first form's fields, which rejected its submissions for a field it does not have or dropped its answers. #2450
- Fix the event date in the Post Date block losing its first digit, and its time element, when the date format starts with a number, such as d/m/Y. #2478
- Keyboard focus no longer drops to the page after an RSVP change. Attend on a full event now opens the waiting list dialog instead of losing focus, and Attend or Not Attending moves focus only once the new RSVP state is on screen. #2447
- Make strings that stayed in English in translated sites translatable: the Venue block placeholders, the required field marker, the Dropdown block title, the Modal Content width settings, the RSVP list date, the separators in the Credits list, and the screen reader text of the Venues column. #2479
- Only users who can edit other people's events, such as Editors and Administrators, can send an event update to All Members. Anyone who can edit an event can still email its attendees, and the email dialog only offers All Members to users who can use it. #2472
- Opening the editor no longer changes the order, the upcoming or past setting, or the name of an Event Query Loop, and no longer shows unsaved changes for it. A loop without a name still gets a name, such as "Upcoming Events". A name that the author gives the loop now stays when the loop's settings change. #2496
- Password-protected events no longer appear in calendar feeds, their Add to Calendar links (iCal, Outlook, Google and Yahoo) only work for visitors who have entered the event's password, and the REST API leaves out their date, time and location for those visitors. Before, all three showed the event's date, time and location to anyone. #2481
- Remove the RSVP block's Login dialog for logged-in viewers. The dialog's class in the RSVP block template did not match the one checked when removing it, so it stayed in the page, hidden and unused. #2465
- Saving an event now marks its location as not public when the event is password-protected, unpublished, or at a venue that isn't public, past events included. Before, a past event's
geo_publicstayed as it was, since only viewing an upcoming event refreshed it. #2519 - Screen readers now name the RSVP and Login dialogs after their visible title, for example "RSVP to this event" or "Login Required", and read the instructions below the title when the dialog opens. Before, they said "RSVP Modal" or "Login Modal". Existing events get the change without an edit. #2463
- Screen readers now read the date on the start and end date buttons in the event settings, for example "Date & time start October 21, 2026 6:00 pm". Before, they read only the label, "Date & time start". #2467
- Stop a fatal error on calendar endpoint URLs when the requested calendar slug does not belong to the endpoint handling the request, such as an event's /outlook/ URL with page and feed query parameters. #2489
- Stop calling the private WordPress function apply_block_hooks_to_content() when a new venue is seeded from the venue template. The pattern registry already applies hooked blocks to that content. #2444
- The Event Date, Add to Calendar and Venue blocks keep a password-protected event's date, calendar links and venue hidden until the viewer enters the password, including in a Query Loop on another page. #2498
- The event email dialog no longer mentions "All Members" to users who can't send to all members, since the option is hidden for them. #2510
- The events calendar feed, the upcoming events ability, and
get_upcoming_events()andget_past_events()list events by their date again, instead of by when they were published. With a limit, they now keep the soonest upcoming events, or the most recent past ones, rather than the ones published first. #2521 - The public Get upcoming events ability leaves out password-protected events, so it no longer lists their date and time. #2497
- The RSVP Response, RSVP Template and RSVP Count blocks now respect an event's post password, the same way the attendee list in the REST API does. #2474
- The RSVP Template block no longer fails to render its list when it loads before the other RSVP blocks, as seen on an events archive in iOS Safari. #2509
- The venue address search no longer makes the first suggestion active before an arrow key is pressed. ArrowDown then Enter now chooses the first suggestion, not the second, and Enter with no suggestion chosen keeps the typed address. Suggestions with the same address are shown once. #2461
0.36.0
Added
- A CARTO API key setting for OpenStreetMap venue maps. Without a key, map tiles are watermarked. #2259
- Add an all day toggle to events, which stores a real full-day span and renders the date without a time. #2224
- Add an Uninstall settings screen that controls what deleting the plugin removes. Every option is off by default, so deleting GatherPress keeps your data unless you ask for it to go. You can opt in separately to removing events, RSVPs, topics, venues, generated files, scheduled jobs, per-user preferences, and the plugin settings. The choices never travel in a settings export and an import will not set them. The Plugins screen says so in the GatherPress row when anything is selected, so the consequence is beside the Delete link that triggers it. On multisite a network administrator can answer once for every site or leave each site to answer for its own data. #2279
- Add comprehensive unit test suite and isolated fixtures for Autoloader class. #2337
- Added an INNER_JOIN for the typical adjacent queries made by WP core, and add an ORDERBY for the event-date. So the normal core/post-navigation-link blocks follow the event-date, instead of the publication date. #2168
- Added an opt-in
gatherpress_static_map_generate_asyncfilter that defers venue-save-triggered static-map generation to a WP-Cron job instead of rendering inline, so bulk venue imports and REST integrations that save many venues in a tight loop no longer block on tile-fetch-and-composite time. #2048 - Added an RSVP flag API: a flag is a class extending
Rsvp\Flag\Basethat declares its slug and wraps one RSVP, so GatherPress and companion plugins can store yes/no markers such as check-in in one shared taxonomy without overwriting each other, withgatherpress_rsvp_flag_addedandgatherpress_rsvp_flag_removedactions. #2302 - Added caching to the iCalendar responses. Feeds and single-event .ics files now send
Cache-Control,ETagandLast-Modified, answer conditional requests with304 Not Modified, and keep their rendered body in a transient. Subscribed calendar clients poll several times an hour, so a poll that finds nothing changed now costs a validator instead of a full rebuild. A change to any event, venue, GatherPress meta or event term moves every cached calendar to a fresh key, andgatherpress_calendar_max_agecontrols the window (0 disables caching). #2067 - Added check-in for RSVPs. Check-in status is tracked per RSVP, shown in a Checked in column on the RSVPs screen, with Mark as Checked In and Not Checked In bulk actions, so organizers can record who actually turned up rather than only who said they would. #2064
- Add RSS feed support for topic archives with upcoming event ordering and date and venue details. #2329
- Add searchable event and response filters to the RSVP admin screen, and use the event picker for the Post ID Override on blocks instead of a raw number field. #2218
- Add
Event::is_online()andEvent::set_online()for owning the online-event term plusgatherpress_online_event_linkmeta as a single coordinated write, plusVenue\Setup::is_online_event_term_slug()andVenue\Setup::get_online_event_term_id()for direct access. Editor JS now reads the pre-resolved sentinel term id fromgatherpress.config.onlineEventTermIdsinstead of issuing a taxonomy REST lookup on every render. #2049 - Admin settings for the geocoding service and map tile source: a configurable Photon-compatible geocoding API URL, a country-code filter for geocoding results, and a custom tile layer URL/attribution for self-hosted or third-party OpenStreetMap tiles. #2275
- Documentation for the Form Field block: what each field type is for, what every setting does, and what happens when an answer is refused. #2349
- Event organizers can now set a custom subject line when sending the event-update email; the existing
📅 {title}default stays in place when the field is left untouched, and a newgatherpress_email_subjectfilter lets developers customize the default template. #2042 - Event queries now filter by event date. A date query on a query of event post types resolves against when events happen rather than when their posts were published. #2266
- Expose upcoming events and RSVP counts through the WordPress Abilities API, so REST clients, WP-CLI, and AI tooling can read a site's schedule without hard-coding GatherPress post types, meta keys, or RSVP comment storage. Both abilities are read-only. The upcoming events listing is public, matching the event archive it mirrors, and the RSVP counts follow the same access rule as the roster, for any post type that supports RSVPs. #2128
- Filters for the event date and the topic on the events admin list, alongside a relabeled filter for the post date. #2263
- Form Field blocks accept an optional Input ID. Set one to pin a fixed id on the field instead of the generated one, which is what makes the markup stable for caching, testing, or wiring up a label elsewhere. #2346
- Links that open in a new tab now say so to screen-reader users. One filter covers every GatherPress block, so blocks added later are announced without doing anything. The documentation links in the block sidebar say so too. #2258
- New
gatherpress_rsvp_form_schemasfilter, so RSVP custom-field schemas can come from somewhere other than the block editor. Saving a post no longer deletes a schema it did not create, which previously made externally-stored registration questions disappear on the next save. #2344 - Read-only venue and event geo data (
geo_latitude,geo_longitude,geo_address,geo_public) for Geodata-aware plugins like Simple Location, kept current without eager updates when a venue's address changes. #2322 - Settings can now declare that they do not travel. An option marked
exportable => falseis left out of a settings export, and is refused by an import, so a value that describes one site cannot be carried to another by a settings file. An option can also opt out of import alone withimportable => false, for a value worth reading in a file but never applying. Imports report anything they refused instead of counting it as an unknown key. #2279 - Support HTTP Accept: text/calendar content-negotiation for event URLs and calendar feeds. #2230
- The Event Query Loop's controls can now be filtered rather than only added to.
gatherpress.eventQueryControlsandgatherpress.eventInheritedQueryControlshand you the list of controls the panel is about to render, as{ name, Component, props }entries, so a companion plugin can drop the ones its own layout has no use for, reorder them or insert its own. The control components are also published onwindow.gatherpress.queryControls, reached through thegatherpress-query-controlsscript handle or by importing@gatherpress/query-controls, for plugins that would rather compose a panel of their own. #2362 - Topics are now registered for every post type that declares
gatherpress-event-datesupport, rather than for the built-in event post type alone, so a custom event post type is taggable with Topics the way it already gets datetimes and calendar feeds. #2350 - Welcome someone who has just activated GatherPress with a card on the plugins and GatherPress screens, pointing them at creating their first event. #2221
Form_Fieldcan now return its markup as a string withget_html(), alongside the existingrender()that echoes it, and its attribute array is documented as a supported way to render a single field outside the block editor. #2346
Changed
- A rejected RSVP now reports itself in the form rather than in a browser alert. Each field at fault gets its own message, marked up so screen readers announce it with the field, focus moves to the first one, and correcting a field clears its message. Failures that do not belong to a field, such as a duplicate RSVP, still show a single message at the top of the form. Themes can recolor both through the new
--gatherpress--rsvp-form--error-colorcustom property. #2349 - Clarify terminology for people across the codebase and document the rules in AGENTS.md. "Viewer" is the general term for anyone looking at a page, "visitor" is reserved for contexts where being without an account is the specific point, and "reader" is reserved for screen readers. [#2378](https://github.com/GatherPress/ga...
0.36.0-beta.2
Added
- A CARTO API key setting for OpenStreetMap venue maps. Without a key, map tiles are watermarked. #2259
- Add an all day toggle to events, which stores a real full-day span and renders the date without a time. #2224
- Add an Uninstall settings screen that controls what deleting the plugin removes. Every option is off by default, so deleting GatherPress keeps your data unless you ask for it to go. You can opt in separately to removing events, RSVPs, topics, venues, generated files, scheduled jobs, per-user preferences, and the plugin settings. The choices never travel in a settings export and an import will not set them. The Plugins screen says so in the GatherPress row when anything is selected, so the consequence is beside the Delete link that triggers it. On multisite a network administrator can answer once for every site or leave each site to answer for its own data. #2279
- Add comprehensive unit test suite and isolated fixtures for Autoloader class. #2337
- Added an INNER_JOIN for the typical adjacent queries made by WP core, and add an ORDERBY for the event-date. So the normal core/post-navigation-link blocks follow the event-date, instead of the publication date. #2168
- Added an opt-in
gatherpress_static_map_generate_asyncfilter that defers venue-save-triggered static-map generation to a WP-Cron job instead of rendering inline, so bulk venue imports and REST integrations that save many venues in a tight loop no longer block on tile-fetch-and-composite time. #2048 - Added an RSVP flag API: a flag is a class extending
Rsvp\Flag\Basethat declares its slug and wraps one RSVP, so GatherPress and companion plugins can store yes/no markers such as check-in in one shared taxonomy without overwriting each other, withgatherpress_rsvp_flag_addedandgatherpress_rsvp_flag_removedactions. #2302 - Added caching to the iCalendar responses. Feeds and single-event .ics files now send
Cache-Control,ETagandLast-Modified, answer conditional requests with304 Not Modified, and keep their rendered body in a transient. Subscribed calendar clients poll several times an hour, so a poll that finds nothing changed now costs a validator instead of a full rebuild. A change to any event, venue, GatherPress meta or event term moves every cached calendar to a fresh key, andgatherpress_calendar_max_agecontrols the window (0 disables caching). #2067 - Added check-in for RSVPs. Check-in status is tracked per RSVP, shown in a Checked in column on the RSVPs screen, with Mark as Checked In and Not Checked In bulk actions, so organizers can record who actually turned up rather than only who said they would. #2064
- Add RSS feed support for topic archives with upcoming event ordering and date and venue details. #2329
- Add searchable event and response filters to the RSVP admin screen, and use the event picker for the Post ID Override on blocks instead of a raw number field. #2218
- Add
Event::is_online()andEvent::set_online()for owning the online-event term plusgatherpress_online_event_linkmeta as a single coordinated write, plusVenue\Setup::is_online_event_term_slug()andVenue\Setup::get_online_event_term_id()for direct access. Editor JS now reads the pre-resolved sentinel term id fromgatherpress.config.onlineEventTermIdsinstead of issuing a taxonomy REST lookup on every render. #2049 - Admin settings for the geocoding service and map tile source: a configurable Photon-compatible geocoding API URL, a country-code filter for geocoding results, and a custom tile layer URL/attribution for self-hosted or third-party OpenStreetMap tiles. #2275
- Documentation for the Form Field block: what each field type is for, what every setting does, and what happens when an answer is refused. #2349
- Event organizers can now set a custom subject line when sending the event-update email; the existing
📅 {title}default stays in place when the field is left untouched, and a newgatherpress_email_subjectfilter lets developers customize the default template. #2042 - Event queries now filter by event date. A date query on a query of event post types resolves against when events happen rather than when their posts were published. #2266
- Expose upcoming events and RSVP counts through the WordPress Abilities API, so REST clients, WP-CLI, and AI tooling can read a site's schedule without hard-coding GatherPress post types, meta keys, or RSVP comment storage. Both abilities are read-only. The upcoming events listing is public, matching the event archive it mirrors, and the RSVP counts follow the same access rule as the roster, for any post type that supports RSVPs. #2128
- Filters for the event date and the topic on the events admin list, alongside a relabeled filter for the post date. #2263
- Form Field blocks accept an optional Input ID. Set one to pin a fixed id on the field instead of the generated one, which is what makes the markup stable for caching, testing, or wiring up a label elsewhere. #2346
- Links that open in a new tab now say so to screen-reader users. One filter covers every GatherPress block, so blocks added later are announced without doing anything. The documentation links in the block sidebar say so too. #2258
- New
gatherpress_rsvp_form_schemasfilter, so RSVP custom-field schemas can come from somewhere other than the block editor. Saving a post no longer deletes a schema it did not create, which previously made externally-stored registration questions disappear on the next save. #2344 - Read-only venue and event geo data (
geo_latitude,geo_longitude,geo_address,geo_public) for Geodata-aware plugins like Simple Location, kept current without eager updates when a venue's address changes. #2322 - Settings can now declare that they do not travel. An option marked
exportable => falseis left out of a settings export, and is refused by an import, so a value that describes one site cannot be carried to another by a settings file. An option can also opt out of import alone withimportable => false, for a value worth reading in a file but never applying. Imports report anything they refused instead of counting it as an unknown key. #2279 - Support HTTP Accept: text/calendar content-negotiation for event URLs and calendar feeds. #2230
- The Event Query Loop's controls can now be filtered rather than only added to.
gatherpress.eventQueryControlsandgatherpress.eventInheritedQueryControlshand you the list of controls the panel is about to render, as{ name, Component, props }entries, so a companion plugin can drop the ones its own layout has no use for, reorder them or insert its own. The control components are also published onwindow.gatherpress.queryControls, reached through thegatherpress-query-controlsscript handle or by importing@gatherpress/query-controls, for plugins that would rather compose a panel of their own. #2362 - Topics are now registered for every post type that declares
gatherpress-event-datesupport, rather than for the built-in event post type alone, so a custom event post type is taggable with Topics the way it already gets datetimes and calendar feeds. #2350 - Welcome someone who has just activated GatherPress with a card on the plugins and GatherPress screens, pointing them at creating their first event. #2221
Form_Fieldcan now return its markup as a string withget_html(), alongside the existingrender()that echoes it, and its attribute array is documented as a supported way to render a single field outside the block editor. #2346
Changed
- A rejected RSVP now reports itself in the form rather than in a browser alert. Each field at fault gets its own message, marked up so screen readers announce it with the field, focus moves to the first one, and correcting a field clears its message. Failures that do not belong to a field, such as a duplicate RSVP, still show a single message at the top of the form. Themes can recolor both through the new
--gatherpress--rsvp-form--error-colorcustom property. #2349 - Clarify terminology for people across the codebase and document the rules in AGENTS.md. "Viewer" is the general term for anyone looking at a page, "visitor" is reserved for contexts where being without an account is the specific point, and "reader" is reserved for screen readers. [#2378](https://github.com/GatherPress/ga...
0.36.0-beta.1
Added
- A CARTO API key setting for OpenStreetMap venue maps. Without a key, map tiles are watermarked. #2259
- Add an all day toggle to events, which stores a real full-day span and renders the date without a time. #2224
- Add an Uninstall settings screen that controls what deleting the plugin removes. Every option is off by default, so deleting GatherPress keeps your data unless you ask for it to go. You can opt in separately to removing events, RSVPs, topics, venues, generated files, scheduled jobs, per-user preferences, and the plugin settings. The choices never travel in a settings export and an import will not set them. The Plugins screen says so in the GatherPress row when anything is selected, so the consequence is beside the Delete link that triggers it. On multisite a network administrator can answer once for every site or leave each site to answer for its own data. #2279
- Add comprehensive unit test suite and isolated fixtures for Autoloader class. #2337
- Added an INNER_JOIN for the typical adjacent queries made by WP core, and add an ORDERBY for the event-date. So the normal core/post-navigation-link blocks follow the event-date, instead of the publication date. #2168
- Added an opt-in
gatherpress_static_map_generate_asyncfilter that defers venue-save-triggered static-map generation to a WP-Cron job instead of rendering inline, so bulk venue imports and REST integrations that save many venues in a tight loop no longer block on tile-fetch-and-composite time. #2048 - Added an RSVP flag API: a flag is a class extending
Rsvp\Flag\Basethat declares its slug and wraps one RSVP, so GatherPress and companion plugins can store yes/no markers such as check-in in one shared taxonomy without overwriting each other, withgatherpress_rsvp_flag_addedandgatherpress_rsvp_flag_removedactions. #2302 - Added caching to the iCalendar responses. Feeds and single-event .ics files now send
Cache-Control,ETagandLast-Modified, answer conditional requests with304 Not Modified, and keep their rendered body in a transient. Subscribed calendar clients poll several times an hour, so a poll that finds nothing changed now costs a validator instead of a full rebuild. A change to any event, venue, GatherPress meta or event term moves every cached calendar to a fresh key, andgatherpress_calendar_max_agecontrols the window (0 disables caching). #2067 - Added check-in for RSVPs. Check-in status is tracked per RSVP, shown in a Checked in column on the RSVPs screen, with Mark as Checked In and Not Checked In bulk actions, so organizers can record who actually turned up rather than only who said they would. #2064
- Add RSS feed support for topic archives with upcoming event ordering and date and venue details. #2329
- Add searchable event and response filters to the RSVP admin screen, and use the event picker for the Post ID Override on blocks instead of a raw number field. #2218
- Add
Event::is_online()andEvent::set_online()for owning the online-event term plusgatherpress_online_event_linkmeta as a single coordinated write, plusVenue\Setup::is_online_event_term_slug()andVenue\Setup::get_online_event_term_id()for direct access. Editor JS now reads the pre-resolved sentinel term id fromgatherpress.config.onlineEventTermIdsinstead of issuing a taxonomy REST lookup on every render. #2049 - Admin settings for the geocoding service and map tile source: a configurable Photon-compatible geocoding API URL, a country-code filter for geocoding results, and a custom tile layer URL/attribution for self-hosted or third-party OpenStreetMap tiles. #2275
- Documentation for the Form Field block: what each field type is for, what every setting does, and what happens when an answer is refused. #2349
- Event organizers can now set a custom subject line when sending the event-update email; the existing
📅 {title}default stays in place when the field is left untouched, and a newgatherpress_email_subjectfilter lets developers customize the default template. #2042 - Event queries now filter by event date. A date query on a query of event post types resolves against when events happen rather than when their posts were published. #2266
- Expose upcoming events and RSVP counts through the WordPress Abilities API, so REST clients, WP-CLI, and AI tooling can read a site's schedule without hard-coding GatherPress post types, meta keys, or RSVP comment storage. Both abilities are read-only. The upcoming events listing is public, matching the event archive it mirrors, and the RSVP counts follow the same access rule as the roster, for any post type that supports RSVPs. #2128
- Filters for the event date and the topic on the events admin list, alongside a relabeled filter for the post date. #2263
- Form Field blocks accept an optional Input ID. Set one to pin a fixed id on the field instead of the generated one, which is what makes the markup stable for caching, testing, or wiring up a label elsewhere. #2346
- Links that open in a new tab now say so to screen-reader users. One filter covers every GatherPress block, so blocks added later are announced without doing anything. The documentation links in the block sidebar say so too. #2258
- New
gatherpress_rsvp_form_schemasfilter, so RSVP custom-field schemas can come from somewhere other than the block editor. Saving a post no longer deletes a schema it did not create, which previously made externally-stored registration questions disappear on the next save. #2344 - Read-only venue and event geo data (
geo_latitude,geo_longitude,geo_address,geo_public) for Geodata-aware plugins like Simple Location, kept current without eager updates when a venue's address changes. #2322 - Settings can now declare that they do not travel. An option marked
exportable => falseis left out of a settings export, and is refused by an import, so a value that describes one site cannot be carried to another by a settings file. An option can also opt out of import alone withimportable => false, for a value worth reading in a file but never applying. Imports report anything they refused instead of counting it as an unknown key. #2279 - Support HTTP Accept: text/calendar content-negotiation for event URLs and calendar feeds. #2230
- The Event Query Loop's controls can now be filtered rather than only added to.
gatherpress.eventQueryControlsandgatherpress.eventInheritedQueryControlshand you the list of controls the panel is about to render, as{ name, Component, props }entries, so a companion plugin can drop the ones its own layout has no use for, reorder them or insert its own. The control components are also published onwindow.gatherpress.queryControls, reached through thegatherpress-query-controlsscript handle or by importing@gatherpress/query-controls, for plugins that would rather compose a panel of their own. #2362 - Topics are now registered for every post type that declares
gatherpress-event-datesupport, rather than for the built-in event post type alone, so a custom event post type is taggable with Topics the way it already gets datetimes and calendar feeds. #2350 - Welcome someone who has just activated GatherPress with a card on the plugins and GatherPress screens, pointing them at creating their first event. #2221
Form_Fieldcan now return its markup as a string withget_html(), alongside the existingrender()that echoes it, and its attribute array is documented as a supported way to render a single field outside the block editor. #2346
Changed
- A rejected RSVP now reports itself in the form rather than in a browser alert. Each field at fault gets its own message, marked up so screen readers announce it with the field, focus moves to the first one, and correcting a field clears its message. Failures that do not belong to a field, such as a duplicate RSVP, still show a single message at the top of the form. Themes can recolor both through the new
--gatherpress--rsvp-form--error-colorcustom property. #2349 - Clarify terminology for people across the codebase and document the rules in AGENTS.md. "Viewer" is the general term for anyone looking at a page, "visitor" is reserved for contexts where being without an account is the specific point, and "reader" is reserved for screen readers. [#2378](https://github.com/GatherPress/ga...
0.36.0-alpha.2
Added
- A CARTO API key setting for OpenStreetMap venue maps. Without a key, map tiles are watermarked. #2259
- Add an all day toggle to events, which stores a real full-day span and renders the date without a time. #2224
- Add an Uninstall settings screen that controls what deleting the plugin removes. Every option is off by default, so deleting GatherPress keeps your data unless you ask for it to go. You can opt in separately to removing events, RSVPs, topics, venues, generated files, scheduled jobs, per-user preferences, and the plugin settings. The choices never travel in a settings export and an import will not set them. The Plugins screen says so in the GatherPress row when anything is selected, so the consequence is beside the Delete link that triggers it. On multisite a network administrator can answer once for every site or leave each site to answer for its own data. #2279
- Add comprehensive unit test suite and isolated fixtures for Autoloader class. #2337
- Added an INNER_JOIN for the typical adjacent queries made by WP core, and add an ORDERBY for the event-date. So the normal core/post-navigation-link blocks follow the event-date, instead of the publication date. #2168
- Added an opt-in
gatherpress_static_map_generate_asyncfilter that defers venue-save-triggered static-map generation to a WP-Cron job instead of rendering inline, so bulk venue imports and REST integrations that save many venues in a tight loop no longer block on tile-fetch-and-composite time. #2048 - Added an RSVP flag API: a flag is a class extending
Rsvp\Flag\Basethat declares its slug and wraps one RSVP, so GatherPress and companion plugins can store yes/no markers such as check-in in one shared taxonomy without overwriting each other, withgatherpress_rsvp_flag_addedandgatherpress_rsvp_flag_removedactions. #2302 - Added caching to the iCalendar responses. Feeds and single-event .ics files now send
Cache-Control,ETagandLast-Modified, answer conditional requests with304 Not Modified, and keep their rendered body in a transient. Subscribed calendar clients poll several times an hour, so a poll that finds nothing changed now costs a validator instead of a full rebuild. A change to any event, venue, GatherPress meta or event term moves every cached calendar to a fresh key, andgatherpress_calendar_max_agecontrols the window (0 disables caching). #2067 - Added check-in for RSVPs. Check-in status is tracked per RSVP, shown in a Checked in column on the RSVPs screen, with Mark as Checked In and Not Checked In bulk actions, so organizers can record who actually turned up rather than only who said they would. #2064
- Add RSS feed support for topic archives with upcoming event ordering and date and venue details. #2329
- Add searchable event and response filters to the RSVP admin screen, and use the event picker for the Post ID Override on blocks instead of a raw number field. #2218
- Add
Event::is_online()andEvent::set_online()for owning the online-event term plusgatherpress_online_event_linkmeta as a single coordinated write, plusVenue\Setup::is_online_event_term_slug()andVenue\Setup::get_online_event_term_id()for direct access. Editor JS now reads the pre-resolved sentinel term id fromgatherpress.config.onlineEventTermIdsinstead of issuing a taxonomy REST lookup on every render. #2049 - Admin settings for the geocoding service and map tile source: a configurable Photon-compatible geocoding API URL, a country-code filter for geocoding results, and a custom tile layer URL/attribution for self-hosted or third-party OpenStreetMap tiles. #2275
- Documentation for the Form Field block: what each field type is for, what every setting does, and what happens when an answer is refused. #2349
- Event organizers can now set a custom subject line when sending the event-update email; the existing
📅 {title}default stays in place when the field is left untouched, and a newgatherpress_email_subjectfilter lets developers customize the default template. #2042 - Event queries now filter by event date. A date query on a query of event post types resolves against when events happen rather than when their posts were published. #2266
- Expose upcoming events and RSVP counts through the WordPress Abilities API, so REST clients, WP-CLI, and AI tooling can read a site's schedule without hard-coding GatherPress post types, meta keys, or RSVP comment storage. Both abilities are read-only. The upcoming events listing is public, matching the event archive it mirrors, and the RSVP counts follow the same access rule as the roster, for any post type that supports RSVPs. #2128
- Filters for the event date and the topic on the events admin list, alongside a relabeled filter for the post date. #2263
- Form Field blocks accept an optional Input ID. Set one to pin a fixed id on the field instead of the generated one, which is what makes the markup stable for caching, testing, or wiring up a label elsewhere. #2346
- Links that open in a new tab now say so to screen-reader users. One filter covers every GatherPress block, so blocks added later are announced without doing anything. The documentation links in the block sidebar say so too. #2258
- New
gatherpress_rsvp_form_schemasfilter, so RSVP custom-field schemas can come from somewhere other than the block editor. Saving a post no longer deletes a schema it did not create, which previously made externally-stored registration questions disappear on the next save. #2344 - Read-only venue and event geo data (
geo_latitude,geo_longitude,geo_address,geo_public) for Geodata-aware plugins like Simple Location, kept current without eager updates when a venue's address changes. #2322 - Settings can now declare that they do not travel. An option marked
exportable => falseis left out of a settings export, and is refused by an import, so a value that describes one site cannot be carried to another by a settings file. An option can also opt out of import alone withimportable => false, for a value worth reading in a file but never applying. Imports report anything they refused instead of counting it as an unknown key. #2279 - Support HTTP Accept: text/calendar content-negotiation for event URLs and calendar feeds. #2230
- The Event Query Loop's controls can now be filtered rather than only added to.
gatherpress.eventQueryControlsandgatherpress.eventInheritedQueryControlshand you the list of controls the panel is about to render, as{ name, Component, props }entries, so a companion plugin can drop the ones its own layout has no use for, reorder them or insert its own. The control components are also published onwindow.gatherpress.queryControls, reached through thegatherpress-query-controlsscript handle or by importing@gatherpress/query-controls, for plugins that would rather compose a panel of their own. #2362 - Topics are now registered for every post type that declares
gatherpress-event-datesupport, rather than for the built-in event post type alone, so a custom event post type is taggable with Topics the way it already gets datetimes and calendar feeds. #2350 - Welcome someone who has just activated GatherPress with a card on the plugins and GatherPress screens, pointing them at creating their first event. #2221
Form_Fieldcan now return its markup as a string withget_html(), alongside the existingrender()that echoes it, and its attribute array is documented as a supported way to render a single field outside the block editor. #2346
Changed
- A rejected RSVP now reports itself in the form rather than in a browser alert. Each field at fault gets its own message, marked up so screen readers announce it with the field, focus moves to the first one, and correcting a field clears its message. Failures that do not belong to a field, such as a duplicate RSVP, still show a single message at the top of the form. Themes can recolor both through the new
--gatherpress--rsvp-form--error-colorcustom property. #2349 - Clarify terminology for people across the codebase and document the rules in AGENTS.md. "Viewer" is the general term for anyone looking at a page, "visitor" is reserved for contexts where being without an account is the specific point, and "reader" is reserved for screen readers. [#2378](https://github.com/GatherPress/ga...
0.36.0-alpha.1
Added
- A CARTO API key setting for OpenStreetMap venue maps. Without a key, map tiles are watermarked. #2259
- Add an all day toggle to events, which stores a real full-day span and renders the date without a time. #2224
- Add an Uninstall settings screen that controls what deleting the plugin removes. Every option is off by default, so deleting GatherPress keeps your data unless you ask for it to go. You can opt in separately to removing events, RSVPs, topics, venues, generated files, scheduled jobs, per-user preferences, and the plugin settings. The choices never travel in a settings export and an import will not set them. The Plugins screen says so in the GatherPress row when anything is selected, so the consequence is beside the Delete link that triggers it. On multisite a network administrator can answer once for every site or leave each site to answer for its own data. #2279
- Add comprehensive unit test suite and isolated fixtures for Autoloader class. #2337
- Added an INNER_JOIN for the typical adjacent queries made by WP core, and add an ORDERBY for the event-date. So the normal core/post-navigation-link blocks follow the event-date, instead of the publication date. #2168
- Added an opt-in
gatherpress_static_map_generate_asyncfilter that defers venue-save-triggered static-map generation to a WP-Cron job instead of rendering inline, so bulk venue imports and REST integrations that save many venues in a tight loop no longer block on tile-fetch-and-composite time. #2048 - Added an RSVP flag API: a flag is a class extending
Rsvp\Flag\Basethat declares its slug and wraps one RSVP, so GatherPress and companion plugins can store yes/no markers such as check-in in one shared taxonomy without overwriting each other, withgatherpress_rsvp_flag_addedandgatherpress_rsvp_flag_removedactions. #2302 - Added caching to the iCalendar responses. Feeds and single-event .ics files now send
Cache-Control,ETagandLast-Modified, answer conditional requests with304 Not Modified, and keep their rendered body in a transient. Subscribed calendar clients poll several times an hour, so a poll that finds nothing changed now costs a validator instead of a full rebuild. A change to any event, venue, GatherPress meta or event term moves every cached calendar to a fresh key, andgatherpress_calendar_max_agecontrols the window (0 disables caching). #2067 - Added check-in for RSVPs. Check-in status is tracked per RSVP, shown in a Checked in column on the RSVPs screen, with Mark as Checked In and Not Checked In bulk actions, so organizers can record who actually turned up rather than only who said they would. #2064
- Add RSS feed support for topic archives with upcoming event ordering and date and venue details. #2329
- Add searchable event and response filters to the RSVP admin screen, and use the event picker for the Post ID Override on blocks instead of a raw number field. #2218
- Add
Event::is_online()andEvent::set_online()for owning the online-event term plusgatherpress_online_event_linkmeta as a single coordinated write, plusVenue\Setup::is_online_event_term_slug()andVenue\Setup::get_online_event_term_id()for direct access. Editor JS now reads the pre-resolved sentinel term id fromgatherpress.config.onlineEventTermIdsinstead of issuing a taxonomy REST lookup on every render. #2049 - Admin settings for the geocoding service and map tile source: a configurable Photon-compatible geocoding API URL, a country-code filter for geocoding results, and a custom tile layer URL/attribution for self-hosted or third-party OpenStreetMap tiles. #2275
- Documentation for the Form Field block: what each field type is for, what every setting does, and what happens when an answer is refused. #2349
- Event organizers can now set a custom subject line when sending the event-update email; the existing
📅 {title}default stays in place when the field is left untouched, and a newgatherpress_email_subjectfilter lets developers customize the default template. #2042 - Event queries now filter by event date. A date query on a query of event post types resolves against when events happen rather than when their posts were published. #2266
- Expose upcoming events and RSVP counts through the WordPress Abilities API, so REST clients, WP-CLI, and AI tooling can read a site's schedule without hard-coding GatherPress post types, meta keys, or RSVP comment storage. Both abilities are read-only. The upcoming events listing is public, matching the event archive it mirrors, and the RSVP counts follow the same access rule as the roster, for any post type that supports RSVPs. #2128
- Filters for the event date and the topic on the events admin list, alongside a relabeled filter for the post date. #2263
- Form Field blocks accept an optional Input ID. Set one to pin a fixed id on the field instead of the generated one, which is what makes the markup stable for caching, testing, or wiring up a label elsewhere. #2346
- Links that open in a new tab now say so to screen-reader users. One filter covers every GatherPress block, so blocks added later are announced without doing anything. The documentation links in the block sidebar say so too. #2258
- New
gatherpress_rsvp_form_schemasfilter, so RSVP custom-field schemas can come from somewhere other than the block editor. Saving a post no longer deletes a schema it did not create, which previously made externally-stored registration questions disappear on the next save. #2344 - Read-only venue and event geo data (
geo_latitude,geo_longitude,geo_address,geo_public) for Geodata-aware plugins like Simple Location, kept current without eager updates when a venue's address changes. #2322 - Settings can now declare that they do not travel. An option marked
exportable => falseis left out of a settings export, and is refused by an import, so a value that describes one site cannot be carried to another by a settings file. An option can also opt out of import alone withimportable => false, for a value worth reading in a file but never applying. Imports report anything they refused instead of counting it as an unknown key. #2279 - Support HTTP Accept: text/calendar content-negotiation for event URLs and calendar feeds. #2230
- The Event Query Loop's controls can now be filtered rather than only added to.
gatherpress.eventQueryControlsandgatherpress.eventInheritedQueryControlshand you the list of controls the panel is about to render, as{ name, Component, props }entries, so a companion plugin can drop the ones its own layout has no use for, reorder them or insert its own. The control components are also published onwindow.gatherpress.queryControls, reached through thegatherpress-query-controlsscript handle or by importing@gatherpress/query-controls, for plugins that would rather compose a panel of their own. #2362 - Topics are now registered for every post type that declares
gatherpress-event-datesupport, rather than for the built-in event post type alone, so a custom event post type is taggable with Topics the way it already gets datetimes and calendar feeds. #2350 - Welcome someone who has just activated GatherPress with a card on the plugins and GatherPress screens, pointing them at creating their first event. #2221
Form_Fieldcan now return its markup as a string withget_html(), alongside the existingrender()that echoes it, and its attribute array is documented as a supported way to render a single field outside the block editor. #2346
Changed
- A rejected RSVP now reports itself in the form rather than in a browser alert. Each field at fault gets its own message, marked up so screen readers announce it with the field, focus moves to the first one, and correcting a field clears its message. Failures that do not belong to a field, such as a duplicate RSVP, still show a single message at the top of the form. Themes can recolor both through the new
--gatherpress--rsvp-form--error-colorcustom property. #2349 - Date and time formats are now chosen from a list of rendered examples, in Events settings and on the Event Date block alike, with a Custom field for raw PHP format codes. #2353
- Define class constants for post type supports across Event, Rsvp, Venue, and Shadow_Sou...
0.35.4
Security
- Tighten request and rendering checks. The nonce endpoint only answers requests from the site's own origin, RSVP template signatures only verify for the site and event they were emitted for, the venue and RSVP count blocks only show a post the viewer could open directly, and an event's online link is carried in its own meta key only for a viewer who could edit the event. #2305
Fixed
- Fixed several PHP
Array to string conversionwarnings (and one latent TypeError) triggered when a value that WordPress or a malformed request can legitimately deliver as an array reached an unguarded(string)cast: the event archive redirect handler'spost_typequery var, the venue map REST endpoint'saspect_ratio/map_typeparams, the settings page sanitizer's scalar fields, and the venue map prewarm job'saspectRatioblock attribute. Each now guards withis_string()/is_scalar()before casting, consistent with the existing pattern already used elsewhere in the codebase (Admin_List::handle_column_sorting(),Geocoding's Photon property extraction). #2169
0.35.3
Security
- Fix an information disclosure in the RSVP status endpoint. A request could supply its own block tree and, through the venue and online-event blocks, read private, draft, trashed, and revision content without logging in. The endpoint now renders only the template the server emitted, and both blocks resolve a selected or overridden post on the same terms as a direct visit. #2243