EP Events
EP Events turns a PageMotor site into a full event platform. Events with tiered ticketing, buyer registrations, attendee QR codes, an offline-capable check-in PWA, Stripe Connect payments with EU VAT compliance, automated Zoom meeting creation, Schema.org JSON-LD, ICS calendar feeds, post-event newsletter campaigns, and depth integration across the rest of the EP Suite.
Published by ElmsPark Studio.
Overview
Section titled “Overview”What you get end-to-end:
- You define events (sub-typed as conference, workshop, retreat, gala, meetup, seminar, summit, reunion, speed-dating, tournament, webinar, or neutral). Each event gets a body laid out with the matching sub-type’s editorial stack.
- You define tickets as EP Ecommerce products attached to the event. Tiered pricing, member-only gating, and inventory caps are all available.
- You optionally add speakers, sponsors, promo codes, payment plans, and a venue (online, hybrid, or physical).
- Visitors browse upcoming events via the
[ep-events]listing page, land on an individual event, register through[ep-event-register], and pay via Stripe Connect. - On payment, the buyer becomes a customer, each ticket becomes an attendee with a unique QR token, a confirmation email goes out with ICS attachment, the newsletter list segment grows, and Zoom auto-creates the meeting where applicable.
- On the day, your organiser opens
[ep-event-checkin]on a phone or tablet at the gate. The page works offline as a PWA, snapshots attendees to local storage, validates QR codes against the snapshot, and syncs check-ins back to the server when the network returns. - After the event, automated thank-you emails and a recap newsletter campaign go out. Post-event reports and a no-show sweep run on cron.
What EP Events is NOT: a one-off appointment scheduler (that is EP Booking), a course platform (EP Courses), or a generic calendar widget. It is for events with buyers, attendees, money, and operational depth.
Requirements
Section titled “Requirements”- PageMotor 0.8.3 or later
- EP Suite base class (bundled)
- EP Ecommerce and EP Ecommerce Stripe for payments
- EP Email for transactional mail (confirmations, reminders, thank-you)
Optional siblings (each unlocks specific features when present):
- EP SEO 1.5.4+: per-event Open Graph and Twitter Card metadata via the
record_meta()iteration hook - EP GDPR 1.1.28+: DSR export and erasure for buyer data via the sibling-plugin hook
- EP Assistant 1.0.4+: AI table allowlist + PII filter so the assistant can read aggregate event data without buyer PII
- EP MCP Bridge 0.18.0+: three MCP tools registered:
events_list_upcoming,events_get_by_slug,events_get_stats - EP Newsletter: auto-subscribe attendees with per-event segmentation, recap + next-year-invite campaigns
- EP Cards: render the
[ep-events]listing through EP Cards’ renderer - EP Affiliate: capture referral attribution at registration, fire conversion tracking on confirmation
- EP Membership: prefill member identity on the registration form, optionally auto-apply a member promo code
- EP Booking Zoom: auto-create Zoom meetings for online events
- EP Locations / EP Local Business: resolve Organisation identity in Schema.org
Installation
Section titled “Installation”EP Events installs like any PageMotor plugin.
- Download. Grab
ep-events.zipfrom your ElmsPark account. - Sign in to your PageMotor admin at
yourdomain.com/admin/. - Go to Plugins, then Manage Plugins.
- Upload the zip. Use the plugin upload interface to upload
ep-events.zip. - Activate in your Theme. Enable EP Events in your active Theme’s plugin configuration. On first activation:
- 18 database tables are created (
pm_ep_events_meta,pm_ep_events_registrations,pm_ep_events_attendees, and so on). - The Event template is cloned from your active theme’s Page template.
- A sample event is seeded at
/ep-events-sample/. - An Events listing page is auto-created at
/events/(or your configured slug).
- 18 database tables are created (
How to verify: after activation, go to Plugins then Plugin Settings. You should see EP Events Settings with the Quick Start panel at the top showing the sample event URL and listing URL. Both should resolve when you click them.
Configuration
Section titled “Configuration”EP Events settings are split into sections you can collapse and expand:
- Quick Start: sample event, listing URL, hint for creating your next event.
- Configuration: listing slug, timezone, default sub-type, currency, payment provider routing, and a Default Event Body textarea (see below).
- Stripe Connect: onboard your platform Stripe account so payments route correctly.
- VAT and tax: EU rate table (27 countries plus UK) with VIES B2B reverse-charge validation.
- Email reminders: pre-event 7-day, 24-hour, 1-hour windows; post-event thank-you. Idempotent via the email_sends log.
- Cron: three trigger paths (admin-page-load throttled to 60s, external secret endpoint, admin AJAX). The secret is autogenerated and shown here.
- Newsletter integration: per-event segmentation, recap, next-year invites.
- AI Organiser Suite: 11 bundled
ep-agentskills for event-from-brief, pricing, promo copy, schedule, speaker outreach, sponsor outreach, FAQ, follow-up, attendance prediction, anomaly detection, recap. - AI Schema: export an event as Markdown, import a full event definition (event + tickets + speakers + sponsors + promos + email sequence + theme) atomically.
- Shortcodes reference: every shortcode the plugin registers, with the key arguments. Useful while authoring event bodies.
Default Event Body
Section titled “Default Event Body”By default, a new event’s body is seeded from one of twelve built-in editorial stacks, chosen by the event’s sub-type (conference, workshop, retreat, gala, meetup, seminar, summit, reunion, speed-dating, tournament, webinar, or a neutral default). If your events are simpler than that — a single venue running the same kind of event every time, for example — fill in Default Event Body in Configuration and every new event, regardless of sub-type, starts from that HTML instead.
- Applies to: a brand-new event, the empty-body backfill pass, and the Insert default layout recovery panel (see Recovery panels) — all three share the same seeding logic, so setting this once covers all of them.
- Your HTML is wrapped in
<div class="text page-content">automatically, unless it already contains one. - Nothing is added to it — no event-block shortcodes are injected, no headings are rewritten. It is used exactly as typed.
- AI Schema imports bypass this setting. An imported event always arrives with its own complete body, so there is nothing for the default to seed.
- Leave it blank to keep using the built-in per-sub-type stacks.
Stripe Connect
Section titled “Stripe Connect”Stripe Connect is required for payments to route to the right place. EP Events itself does not collect funds. It routes payments via your Stripe platform account so each event’s organiser can be paid directly if you operate a multi-organiser site, or all funds flow to a single account if you do not.
- In EP Events Settings, open Stripe Connect.
- Click Onboard with Stripe.
- Complete the Stripe Connect onboarding (business details, bank account, identity verification).
- Return to the plugin and confirm the status reads Connected.
EU VAT
Section titled “EU VAT”For events sold to EU customers, the plugin handles VAT automatically:
- B2C sales: the destination country’s standard VAT rate is applied at checkout.
- B2B sales: the buyer enters their VAT number. If VIES validates it, reverse-charge applies; the invoice records the buyer’s VAT number and zero-rates the line.
- Inclusive vs exclusive pricing is configurable per site.
Shortcodes
Section titled “Shortcodes”EP Events registers 18 shortcodes, grouped by purpose. Every shortcode is ep- prefixed; a bare, unprefixed alias also works for every one of them except [ep-event-add-to-calendar] (added in 1.0.44, so there is no pre-existing bare name to stay compatible with). The ep- prefixed form is canonical — it can never collide with a same-named shortcode from a sibling plugin, since PageMotor’s shortcode registry is first-wins. The bare aliases are kept only for back-compat with content authored before the suite-wide ep- namespace migration; new content should use the ep- forms below. The Shortcodes Reference panel inside Settings shows the full list with arguments.
Listings (use on any page)
Section titled “Listings (use on any page)”| Shortcode | What it does |
|---|---|
[ep-events] | Upcoming-events listing. Args: view (list default, grid, month, week, day, agenda), columns (grid column count), category, audience, event_mode, sub_type (filter), from / to (date range), limit (default 50). view="month" (optionally with year / month args) renders a full calendar grid — there is no separate calendar shortcode. Renders through EP Cards when present for list/grid views, falls back to a native grid. |
Single event (use inside an Event content row)
Section titled “Single event (use inside an Event content row)”| Shortcode | What it does |
|---|---|
[ep-event-hero] | Hero section: title (hidden by default; opt in with show_title="1"), dates, location, hero image, live attendance counter, Register CTA, and an Add to calendar control (folded into the facts list). Args: poster="true" (the image IS designed artwork — shown uncropped, facts/counter/CTA hidden by default), show_facts, show_counter, show_cta, show_title (each overrides the poster default individually), cta_label (default “Register”), cta_dual="true" (promotes Add to calendar to a second full CTA button beside Register, instead of folding it into the facts list). |
[ep-event-add-to-calendar] | Add to calendar menu: Google Calendar, iCalendar (.ics download), Outlook 365, Outlook Live — matching the option set on The Events Calendar’s own dropdown. Rendered automatically inside every [ep-event-hero]; use this shortcode directly when your event body has no hero block at all. |
[ep-event-schedule] | Start/end date-time block for the event. (Per-session agenda rows are a planned future addition, not yet built.) |
[ep-event-speakers] | Speaker grid for this event: photo, name, role, title, bio, social links. Optional heading="false" suppresses the built-in “Speakers” heading. |
[ep-event-sponsors] | Sponsor logos grouped by tier (platinum, gold, silver, bronze, standard, supporter). Optional heading="false" and show_tier_labels="false". |
[ep-event-location] | Map (OpenStreetMap embed) and address for physical events, an online/hybrid join-link notice for virtual events. Optional heading="false". Renders nothing for an in-person event with no venue on record. |
[ep-event-register] | Registration form with ticket selection, quantity, buyer details (prefilled when a member is signed in), promo code, GDPR/marketing consents, and order summary. Optional heading="false" suppresses the built-in “Register” heading — useful when your own body already has one above the shortcode. |
[ep-event-countdown] | Live countdown to event start (or to a ticket’s sales-end with target="sales_end" product_id="…"). |
Buyer and organiser tools
Section titled “Buyer and organiser tools”| Shortcode | What it does |
|---|---|
[ep-event-tickets-mine] | ”My tickets” view, resolved by an order_token (arg or ?order= query param) rather than login: registration status, one QR code per attendee, Add to calendar link, and Cancel registration. |
[ep-event-checkin] | Admin-only organiser check-in screen: QR scanner, manual name/email search, live checked-in/registered counter. With no event resolvable, shows an event picker instead. |
[ep-event-feed] | A link to subscribe to calendar feeds: the single event’s .ics when an event resolves, otherwise a link to the all-upcoming-events .ics feed (format arg reserved for future formats; only ics is implemented). |
[ep-event-speaker-portal] | Token-gated self-serve portal (token arg or ?portal= query param) for a speaker to update their own bio and headshot. |
[ep-event-submit] | Community event submission form (goes to moderation if the “Require approval” setting is enabled). |
[ep-event-recording] | Embeds a past event’s recording. Requires a url arg (YouTube link, or any URL as a plain “Watch the recording” fallback). Renders nothing without one. |
[ep-event-gallery] | Delegates to the sibling EP Gallery plugin’s [gallery] shortcode for this event’s photo album (album arg, defaults to event-{id}-photos). No-op without EP Gallery active. |
[ep-event-credits] | Shows a signed-in (or emailed-in via email arg / ?email= query param) customer’s account credit balance, applied automatically at their next checkout. |
Two names that sound like shortcodes are something else: FAQ and recap are two of the eleven bundled AI Organiser Suite prompt skills (see Configuration) — event-faq and event-recap generate content for you to paste into the event body, but EP Events does not register [event-faq] or [event-recap] shortcodes itself. A per-event FAQ block is authored using the sibling EP FAQ plugin’s own [ep-faq] (or bare [faq]) shortcode inside the event body, the same way the seeded editorial stacks do it.
Duplicating an event
Section titled “Duplicating an event”Open any event in Admin > Content > Events, and its edit screen has a Duplicate this event button below the event details editor. It creates a new draft event with the same title (suffixed ” (copy)”), body, tickets configuration, dates, venue, and organiser settings — no registrations carry over. Useful for a recurring one-off booking or “run the same event again next year” without rebuilding it from scratch.
The check-in PWA
Section titled “The check-in PWA”When you place [ep-event-checkin] on a page and pin that page to a phone or tablet at your venue, it becomes a Progressive Web App. The first time the page loads online, it pulls a snapshot of confirmed attendees into local storage. From then on:
- Scans are validated against the local snapshot, not against the server. The server is contacted only to record the check-in.
- If the network drops mid-event, scans queue locally. A status row at the top shows online/offline state and the pending-queue count.
- When the network returns (or the organiser hits Sync now), the queue drains and the server records each check-in with the original scan timestamp.
- The check-in audit trail records what time the scan actually happened, not what time the device caught up.
Privacy and GDPR
Section titled “Privacy and GDPR”When EP GDPR is active, EP Events contributes to data-subject requests via the sibling-plugin hook:
- Export surfaces the data subject’s registrations, attendances, payment history, credits, consent log, lawful basis map, and retention policy.
- Erasure anonymises buyer PII (name, email, IP, user-agent) while retaining financial records (Stripe IDs, amounts) under HMRC’s seven-year retention rule.
- Retention: IP, user-agent, and referrer data are purged at 90 days by a cron sweep.
- Consent: registration captures marketing-consent and GDPR-consent with UTC timestamps and a lawful basis map per PII field.
Recovery panels
Section titled “Recovery panels”EP Events watches for two specific failure modes that can leave events rendering blank and surfaces a fix for each.
Stripped Event template
Section titled “Stripped Event template”If an admin removes blocks from the Event template via Admin > Theme > Editor and reduces it to just the body wrapper, every event renders blank. EP Events detects this state on admin page loads, snapshots the broken state, and re-clones the template from the Page template. A transparent banner in Settings explains what happened and offers a one-click revert.
If you land on a broken event page before any admin page (the auto-heal hasn’t fired yet), an admin-only floating panel appears on the public event page offering Restore template now. Conservative threshold protects deliberately minimal custom templates from being touched.
Empty event body
Section titled “Empty event body”If an admin creates an event via Admin > Content > New Event (skipping the seeded body) or empties the body via the editor, the event will render blank. An admin-only floating panel surfaces on the public event page offering Insert default layout, which seeds the matching sub-type’s editorial stack.
Non-admins never see either panel.
Troubleshooting
Section titled “Troubleshooting”The Quick Start “Create your next event” link goes to a content type picker, not directly to the new-event form.
That is intentional. PageMotor’s admin content navigation uses POST forms for content-type selection, not GET URLs. From the picker, choose Event and click Add New.
My event page is blank.
If you’re signed in as an admin, look for a yellow or rose-tinted floating panel at the bottom of the page. It will tell you which failure mode you’ve hit (empty body or stripped template) and offer a one-click fix. If you see no panel, confirm:
- The body has visible blocks. Open the event in Admin > Content > Events and check the body field is not empty.
- The Event template has chrome blocks. Open Admin > Theme > Editor and check the Event template’s Body block has children (Header, Navigation, Content_Page, Footer at minimum).
Reminder emails are not arriving.
Check the cron status in Settings. Three triggers are configured:
- Admin page load: throttled to once per 60 seconds. If no admin has visited the site in over an hour, reminders may be delayed.
- External endpoint:
https://yoursite/?ep_events_cron=<your-secret>. Wire this to a real cron service for reliable triggering. - Admin AJAX: Run cron now button in Settings for manual ad-hoc runs.
The pm_ep_events_email_sends table records every send and dedupes future attempts, so triggering cron repeatedly is safe.
Open Graph type on event pages is article, not event.
A PageMotor core limitation. The Open_Graph plugin overrides per-record contributions for non-home pages. Event-specific titles, descriptions, hero images, and event:start_time flow correctly. A PM core patch will close this gap.
Apple Wallet and Google Wallet passes are not generated.
Deferred to a later release pending Apple cert provisioning. The plugin currently emits ICS attachments on every confirmation email, which covers iOS Calendar, Google Calendar, Outlook, and every other modern calendar app.
Feedback
Section titled “Feedback”EP Events is in active development. Bug reports, feature requests, and notes on rough edges are welcome via the Send feedback link at the bottom of the plugin’s settings page, or by emailing ElmsPark.
If your site uses a sibling plugin EP Events does not yet integrate with, let us know. The sibling-plugin valet pattern means most integrations are a single method on each side.
Changelog
Section titled “Changelog”1.0.70
Section titled “1.0.70”- Settings language menu. The language menu in this plugin’s settings now lists only the languages it is actually translated into, plus English, so you can no longer pick a language that changes nothing.
- Danish. Adds a Danish translation.
1.0.69
Section titled “1.0.69”- A booking refunded in Stripe before its payment reached EP Events no longer stays pending. Stripe does not always send its messages in order. When a ticket bought through Stripe’s hosted checkout is refunded in full straight away, the refund can arrive first. EP Ecommerce Stripe 0.1.30 and later then gives no place. The booking now shows as refunded, with a note explaining why, instead of waiting for a payment that has gone back. No seat is taken and no email is sent. This needs EP Ecommerce Stripe 0.1.31.
- If that refund later fails or you cancel it, the money stays with you, so the booking is confirmed like any paid booking: its place, its ticket and the confirmation email.
- In EP Finance, the ticket shows as sold and refunded. If the refund fails, it shows as sold again.
1.0.68
Section titled “1.0.68”- Booking an event that needs a waiver now works with the confirm-by-email step in EP Waivers 1.2.13. A visitor who is not signed in, and signs the waiver while booking, now sees “Check your email” with the address the link went to, instead of an error message. Once they have clicked the link in the email, an “I have confirmed, continue booking” button carries on with the same booking. If they press it too early, it says the confirmation has not arrived yet.
- If the waiver is updated while someone is reading it, the new version is shown with a short note to read it again, instead of their signature failing with an error.
- Members who are signed in and book with their own email address carry straight on, as before.
1.0.67
Section titled “1.0.67”- A booking withdrawn by a Stripe refund comes back if the refund fails. Since 1.0.65 a full refund made in Stripe withdraws the booking. If Stripe then fails that refund (for example because the customer’s card has been closed) or you cancel it while it is still pending, the money stays with you, so the booking is now confirmed again, its place is taken again and its ticket checks in again. This needs EP Ecommerce Stripe 0.1.28 or later.
- If the place has gone to someone else in the meantime, the booking is still confirmed, because the customer has paid. The booking then carries a note saying the event is now full, and the audit log records it, so you can find a seat or refund again.
- Only bookings withdrawn by a Stripe refund are brought back. A booking you refunded or cancelled yourself is never changed by what happens at Stripe.
- No email is sent when a booking comes back.
- Bookings refunded in Stripe before this version are not brought back automatically.
1.0.66
Section titled “1.0.66”- The QR scanner on the check-in screen now checks people in. Every scan was refused with “failed”, so the only way to check someone in was to search for them by name and tap their entry. Offline mode never worked either: the screen could not download the attendee list it needs to accept scans without a connection, and could not send queued check-ins. Scanning, the offline attendee list and sending queued check-ins now all work, and a refused scan now shows the reason (a ticket for a different event, or one that is no longer valid, such as a refunded ticket) instead of just “failed”. Searching by name was not affected.
- “Sync now” no longer shows when there is nothing to sync. On some themes the button appeared on the check-in screen all the time.
- A refused offline check-in no longer stays queued for ever. If a ticket scanned offline was refused when the screen came back online (for example, because it had been refunded in the meantime), it stayed in the queue and was retried on every sync. It is now removed, and the screen names the attendee and says why they were not checked in. After a sync fails because the connection drops again, the “Sync now” button now reappears so you can retry.
1.0.65
Section titled “1.0.65”- Class and event capacity is now enforced on the booking form. A booking paid through the event’s own form (Stripe Checkout) never counted against the ticket’s capacity, so a class of 12 could sell any number of places. Full events now refuse new bookings before payment, and when two people pay for the last place at the same moment only one gets it. The other is kept on the waitlist, marked “paid, the event was full”, so you can refund or seat them. Nobody’s payment disappears.
- Paid bookings now get their confirmation email and ticket. Bookings confirmed by Stripe, marked paid in the admin, or paid with a class credit (with EP Class Passes 1.2.13 or later) now receive the confirmation email (with the calendar file) and get their check-in QR code. Before this, only the admin “resend confirmation” button sent a confirmation for these bookings.
- The waitlist no longer gives away paid places. When a place frees up, the next person on the waitlist is now emailed an invitation to book and pay for it, instead of being given the place automatically.
- Refunds made in Stripe now withdraw the booking. A full refund of a booking paid through Stripe Checkout (including one issued from the Stripe dashboard) now marks the registration refunded, frees its place and stops the ticket checking in. Before, the refunded buyer kept a valid ticket.
- Check-in refuses tickets that are not valid. Refunded, cancelled, unpaid and waitlisted tickets can no longer be checked in, and the check-in screen refuses a ticket for a different event.
- Cancelling frees a place only once. A cancelled booking now gives back its place exactly once, and only if it held one, so a place someone else has paid for is never released by mistake.
- Cancelling a class hands back class credits. When you cancel an event, members who booked it with an EP Class Passes credit get the credit back.
- Tickets bought through the shop checkout now create the booking. Buying an event ticket product through EP Ecommerce took the payment but created no registration and sent no email.
1.0.64
Section titled “1.0.64”- Calendar files now open in Gmail. Every EP Events calendar file, both the one attached to confirmation emails and the “Add to calendar” .ics download, carried an invalid timestamp line. Apple Calendar and Outlook ignored it, but Gmail refused the event and showed “Unable to load event”. The timestamp is now written correctly.
- The calendar entry’s unique ID now always names your site, even when the file is built outside a normal page visit.
1.0.63
Section titled “1.0.63”- Ticket emails now reach your attendees. EP Events was not handing its emails to EP Email properly. It skipped your configured sending service (SMTP, Mailgun, Brevo and the rest) and your sender address, so on most sites confirmations, reminders and cancellation notices were never delivered, even though EP Events recorded them as sent. They now go through EP Email exactly like every other email on your site.
- A failed send is now reported as failed. Previously a send that never left the site was logged as sent, so it was never tried again. A reminder that fails is tried again on the next scheduled run while it is still due, and the admin “resend confirmation” button tells you when a send did not go.
- Confirmation emails carry the event as a calendar invite. Every confirmation, including one you resend from the admin, now includes the event’s calendar file, so attendees can add the event to their calendar straight from the email.
- If EP Email is not active, EP Events sends through EP Newsletter instead, and failing that through the server’s own mail.
- Emails already recorded as sent before this update are not re-sent. If you know a confirmation did not arrive, use “resend confirmation” on that registration.
1.0.62
Section titled “1.0.62”- Fixes a doubled cache-busting tag on its front-end stylesheet. On PageMotor 0.11 and later the page asked for the file with two version tags on the end of its address (
?v=…?v=…), because the core had started adding its own tag and the plugin was still adding one too. The file loaded correctly, so nothing was visibly broken; the address was just malformed and every cache saw a longer key than it needed. The plugin now leaves the tag to the core on 0.11 and later, and still adds its own on older cores, where nothing else would. - No change to what that stylesheet does.
1.0.61
Section titled “1.0.61”- Tickets stop selling when the event ends. An event that has already finished no longer shows a registration form with a working checkout button. If you never set a ticket sales close, the event’s own end time is now used as one.
- Sales close at the event’s end, not its start, so selling on the day is unaffected: late arrivals and walk-ins can still buy while the event is running. Only sales after it has finished are refused.
- Nothing changes for a ticket you gave an explicit sales close. That date still wins, exactly as before, whether it falls before or after the event.
- Selling a recording or on-demand access after the event? Set
sells_after_eventtotrueon that ticket and it keeps selling with no close at all. Like the sales window itself, it is a ticket field set through the API or an AI schema import, not a setting on the admin screen. - A finished event’s page now reads “No tickets are currently on sale for this event.” in place of the form, and the event’s Google listing data stops advertising the offer as open.
- Checkout refuses a closed ticket too, not just the page. A stale tab or a direct post can no longer buy a ticket the page would not show you.
1.0.60
Section titled “1.0.60”- A listing never loses its badges to EP Cards again. The mode, category and sold-out chips on each listing card are handed to EP Cards to draw. EP Cards only gained a badge field in its 1.0.22 release, so on a site still running an older EP Cards the chips had nowhere to go and vanished. The listing now checks first, and falls back to this plugin’s own cards — which have always drawn the chips — rather than handing them to a renderer that will drop them.
- Update EP Cards to 1.0.22 or later and your listings go back to EP Cards markup with the chips included, which is the better-looking of the two. Nothing to configure either way.
- This only affects listings whose events actually have chips to show. A listing with no badges is handed to EP Cards exactly as before, on any version.
1.0.59
Section titled “1.0.59”- You can choose which card markup a listing uses.
renderer="native"renders a listing with EP Events’ own cards even when EP Cards is installed, so a theme that styles one listing can style all of them.renderer="cards"asks for EP Cards explicitly. - Without it, nothing changes: listings use EP Cards when it is active, exactly as before.
show_price="true"still selects the native cards on its own, because EP Cards cannot carry a price.
1.0.58
Section titled “1.0.58”- Listings can now show past events. Add
when="past"to show the events that have already happened, most recent first, orwhen="all"for everything.when="upcoming"is the default and is what every existing listing already does. - The window is worked out from the day the page is served, so a past-events section keeps itself right as events go by. There is no date to go back and change.
- Listings can be sorted.
order="start_asc",order="start_desc"ororder="created_desc"override the default for that listing. - Nothing changes unless you ask for it. A listing with no
whenrenders exactly as before.
1.0.57
Section titled “1.0.57”- Listing summaries end on a whole word. A summary long enough to be shortened now ends at a word with an ellipsis, instead of stopping mid-word as though the text had been cut off.
- Completes the listing summary work in 1.0.55 and 1.0.56.
1.0.56
Section titled “1.0.56”- Listing summaries now read as prose. A card takes the event’s first real paragraph, so an event whose body opens with breadcrumbs or a date-and-venue line no longer summarises as “Home / Events / …” followed by its own meta row.
- Punctuation in summaries displays properly. Characters written as HTML entities in the body, such as a middle dot, appeared literally as
·on the card. They now render as the character. - Follows on from 1.0.55, which restored listing summaries after they had been blank on every site.
1.0.55
Section titled “1.0.55”- Event listings show their summaries again. Each card in an
[ep-events]listing carries a short summary drawn from the event’s own body. This has been blank on every site since listings were introduced, so listings that looked deliberately sparse were in fact missing text they were meant to show. - Listing links no longer bounce through a redirect. Each event link now points straight at the event’s real address instead of one the site had to redirect, so clicks land a step sooner and any event filed under a parent page links correctly.
- Nothing to change on your side. Both fixes apply to existing listings as soon as you update.
1.0.54
Section titled “1.0.54”- Event listings can now show a “from” price. Add
show_price="true"to the listing shortcode —[ep-events view="list" show_price="true"]— and each event shows the cheapest ticket still on sale, as “From £380”. - An event with nothing on sale shows no price at all, rather than advertising £0.00. Free tickets read “Free” and donation tickets read “Any amount”; a donation is never used as a “from” price when the event also has a real ticket.
- Whole amounts drop their decimals in listings, so you get “From £380” rather than “From £380.00”.
- Nothing changes unless you ask for it. Without
show_priceyour listings render exactly as before.
1.0.53
Section titled “1.0.53”- Corrects the PageMotor 0.11.3 preparation shipped in 1.0.52. That release grouped this plugin’s API and MCP actions into families, but in a shape PageMotor 0.11.3 does not accept. On 0.11.3 the plugin would have registered none of its actions, and nothing on screen would have said so.
- This version uses the shape 0.11.3 expects, and keeps the earlier shape for sites still on an older PageMotor. One build serves both, so there is no order you have to update things in.
- Safe to install now. Nothing you can see changes.