The Events Calendar
The Events Calendar stores events as an ordinary WordPress
custom post type, which means most of what you'd want to do with events in Oxygen is ordinary
Oxygen work: loop over them, build a template for a single event, bind their fields to
elements.
Oxygen's integration covers the part that isn't ordinary — making sure The Events Calendar's
own calendar views bring their stylesheets and scripts with them on pages that Oxygen renders,
including the Pro and Virtual Events assets when those add-ons are active.
Build event listings yourself
Events behave like any other post type in a loop:
- Add a Post Loop Builder and set its query's post type to Events.
- Bind the usual things — title, permalink, featured image — the way you would for posts.
- Bind event-specific values with the Post → Custom Field dynamic field, using The Events
Calendar's meta keys:

| What you want | Meta key |
|---|---|
| Start date and time | _EventStartDate |
| End date and time | _EventEndDate |
| Cost | _EventCost |
| All-day flag | _EventAllDay |
| Venue post ID | _EventVenueID |
| Organizer post ID | _EventOrganizerID |
Custom Field returns the stored value as a string, unchanged. Dates come out in MySQL form —
2026-09-10 10:00:00 — and the field has no date formatter, only the usual Prepend, Append,
Limit Characters and Fallback options. If you need "10 September, 10am" you'll have to format
it yourself in a PHP Code element or a snippet.
Note: _EventAllDay holds the string yes or no — not a boolean. A condition that
tests whether it's set or truthy is true for both values. Compare it to yes explicitly.
Note: _EventVenueID and _EventOrganizerID don't exist on an event until a venue or
organizer is actually linked to it. Give those bindings a fallback.
Ordering by start date
Oxygen's visual query builder can order by date, modified date, title, comment count, menu
order and random — plus ACF and Meta Box fields when those plugins are active. It has no
option for ordering on an arbitrary meta key, so sorting events by when they start needs the
loop's custom query instead:
post_type=tribe_events&meta_key=_EventStartDate&orderby=meta_value&order=ASC
Switch the loop's query to the text (or PHP) query type and use that.
Single event templates
Events can have an Oxygen template like any other post type. Check Events is enabled under
Oxygen → Settings → Post Types, then create a Single template and set its location to
Events.

Note: Venues and Organizers can't. The Events Calendar registers those two post types as
non-public, so they don't appear in Oxygen's post type list and can't be given a template.
Build venue and organizer content into your event template instead, from _EventVenueID /
_EventOrganizerID.
Using The Events Calendar's own views
The calendar at /events/ and the plugin's own single event pages keep working as they always
did — they're rendered by The Events Calendar, not by Oxygen.
To place one of the plugin's views inside an Oxygen layout, put its shortcode in a
Shortcode element. Oxygen runs the shortcode normally, and the integration makes sure the
view's assets are loaded so it comes out styled and interactive.

Note: the calendar view shortcode [tec_events] is part of Events Calendar Pro. The
free plugin registers only [tribe:event-details], so [tec_events] on a free install
prints as literal text rather than a calendar.
Troubleshooting
The shortcode prints as text on the page
That shortcode isn't registered on your install. The most common case is [tec_events]
without Events Calendar Pro — see the note above. Anything not registered comes out as the
literal string you typed, which is WordPress behaviour, not an Oxygen one.
The calendar view appears but looks unstyled
Check that The Events Calendar is active and up to date. Oxygen enqueues the plugin's Views v2
assets on the pages it renders; if the plugin's own views are switched off, those assets don't
exist to enqueue.
My event loop shows every event in a random order
Set the query's ordering. The visual query builder can't order on _EventStartDate — use the
text query shown above.
An event's venue name is blank
The event has no venue linked, so _EventVenueID isn't set on it at all. Link a venue in The
Events Calendar, or give the binding a fallback.