v3.2.0
New Features
- Expose
flags.all_day(EventON'sevcal_allday) on reads and accept it on writes, so consumers can tell an all-day event from one that happens to run 00:00 to 23:59. - Expose
featured_media(the featured image attachment ID) on event reads, so a read-modify-write clone keeps its image. - RSVP attendee records expose
headcount(raw stored party size) alongsidecount(displayed party size), plusrepeat_intervalfor the occurrence the RSVP belongs to. - RSVP attendee and summary routes accept a
repeat_intervalfilter, and thersvpfilter acceptswaitlist. - RSVP summaries report
waitlist_recordsandwaitlist_attendees_totalas their own buckets.
Improvements
- Date-range and
upcominglist filters now match any occurrence of a repeating event, not just the first, andorderby=start_atno longer drops events that have no stored start timestamp from results or totals. - Unknown
statusvalues on the events list return400instead of silently returning the default status set, and aslugfilter whose every value sanitizes away now matches nothing instead of returning every event. start_time/end_timeacceptHH:MM:SS(seconds are dropped), matching what the published schema already advertised.- Coordinates are range-checked (
lat±90,lon±180),virtual.moderator_idrejects negatives instead of flipping their sign, malformed email addresses are rejected instead of silently erasing the stored value, and a virtual end before the event start is rejected. - Repeat configuration and per-interval RSVP capacities survive being toggled off, matching EventON's own admin behavior, so re-enabling restores the prior setup.
event_typeterm colors can be cleared by sending an empty value.- FAQ display order is persisted to
_evotax_order_evo_faq, and organizers and FAQs are returned in EventON's saved order rather than alphabetically. - The MCP manifest's documented list filters and examples now match the parameters the routes actually accept,
required_for_createincludestitle, andfields/custom_fieldsare declared write args. Publishedlocation.lat/lontypes arestring, matching what reads return. - RSVP event-time lookups cache their EventON objects per request instead of rebuilding them per attendee.
- Permanently deleting an event now removes its RSVP records instead of leaving orphans.
Bug Fixes
- Stop corrupting event times on unrelated updates. Datetime meta was rewritten on every save from the boundary-extended
_unix_*_evvalues, so a title-onlyPATCHon adl/ml/ylevent overwrote the stored times with 00:00/23:59 permanently. Datetime meta is now written only when the request carries datetime input, and the base wall clock is read fromevcal_srow/evcal_erow. - Fix custom repeat intervals being written in the wrong coordinate space. Client-authored intervals were stored as real epochs where EventON expects the wall clock interpreted as UTC, rendering occurrences hours off, and EventON silently dropped the first interval because index 0 did not match the base occurrence. Intervals are now built in EventON's space with the base occurrence always at index 0, and
intervals[].start_at/end_atare formatted from that space so their ISO offsets are correct. - Fix the documented
fields/custom_fieldswrapper discarding every nested object. Normalization read the raw request body instead of the flattened payload, so a wrappedlocation,timezone,flags,virtual,repeat,rsvp,seo,faqs,health,interaction, ororganizerswas dropped, and a wrappedlocationreturned400 eventon_apify_missing_location_termafter the post had already been created. - Fix
start_at/end_atvalues carrying an explicit UTC or offset designator being stored as site-local wall time, shifting the event by the offset. The instant is now converted into the event timezone. - Fix every formatted time falling back to UTC on sites configured with a UTC offset rather than a named timezone, while the payload still reported the offset.
- Stop partial RSVP and repeat updates from enabling the feature. Sending any
rsvp.*sub-field withoutrsvp_enabledunconditionally wroteevors_rsvp = yes, so a PATCH of justadditional_emailsopened the public RSVP form on an event where RSVP was deliberately off. Presence now implies enabling only when no stored flag exists. - Stop re-asserting
event_statusfrom deleting the storedstatus_reason. - Reject unknown
interaction.modevalues instead of silently rewriting them toslide_down_eventcard, which also deleted the stored interaction URL. - Preserve legitimately falsy EventON term meta such as a latitude of
0, which EventON's own save helper strips viaarray_filter. - Preserve client keys in
rsvp.repeat_capacities; reindexing a sparse map shifted capacities between occurrences, and EventON treats a missing or zero entry as sold out. - Correct RSVP summary math to match EventON: only published RSVP records count, records with a stored headcount of
0are skipped, and waitlisted records no longer inflate theyestotals. - Reject impossible calendar dates such as
2026-02-31instead of silently rolling them over to2026-03-03. - Reject event times before 1970 instead of flipping them into the future via
absint. - Close a redaction bypass on the
wp/v2compatibility surface: because WordPress dispatches routes case-insensitively while the guard compared the raw path, a request for/wp/v2/Typesor/wp/v2/Taxonomiesreturned the EventON type and taxonomy metadata that the guard strips from the lowercase paths. Route matching is now case-folded, and the guard's taxonomy fallback list coversevent_type_3andevent_type_4. - Attaching a term by a name whose sanitized slug collides with a differently-named existing term no longer renames that shared term.
- Read legacy
evcal_lat/evcal_lonin the pre-taxonomy location fallback, somap_urlandlatlngpopulate for events that only stored coordinates. - Re-slash post content when rolling back a failed write, so backslashes survive the compensating update.
- Exclude
repeat_interval,uid, andlangfrom RSVP attendeecustom_fields.
Full Changelog: v3.1.0...v3.2.0