Connecting your own services
Lumina Edu has five seams — five places where it hands a visitor to a service somebody else runs. It never runs one of those services itself, and it never embeds one: no third-party script, frame, map tile, font or tracker is loaded on any page, whatever you connect. A seam is a link, a name and a sentence that says where the link goes.
There is one integration that needs nobody at all: a dated session hands out its own calendar file. That one works the moment you install the ZIP.
The five seams
| Seam | Where you fill it in | What appears on the site |
|---|---|---|
| Registration | Settings → Site details → How people register, and per programme and per session | The main action on a programme, a session and the final action band |
| Consultation | Settings → Site details → How people register, and per programme | "Book a consultation" wherever no registration address applies |
| Contact form | Settings → Site details → Where else this site hands over | The contact action, where your theme places the seam block |
| Directions | Settings → Site details → Where else this site hands over | A "Get directions" link beside your address — a link, never a map |
| Mailing list | Settings → Site details → Where else this site hands over | A "Join the mailing list" action |
Each seam stores two things: an address, and the provider's name as you would say it out loud. Fill in both and the site tells a visitor where they are going before they go:
Register for this session Registration continues on Northline Bookings. This site does not process enrolment or payment.
Fill in only the address and the same control appears with the anonymous wording it has always had. Fill in neither and no control is rendered at all — not a greyed-out button, not a link to nowhere. An empty seam is silent.
What is not a seam, and why
These were considered and left out on purpose. If you need one, it is a link you add to a page yourself; nothing here pretends to manage it.
- Payment or checkout. Lumina Edu makes no claim about money and stores none of it. Where a learner pays is on the registration provider's side of the seam, which is already named.
- An LMS or student login. Lessons, progress, grades and enrolment records are not part of this product, and a field for them would imply they are.
- Social profiles and your e-mail address. Both are already Site details fields. A second home for the same fact is a second truth waiting to disagree with the first.
- A third-party calendar feed. The plugin writes its own calendar file (below), so subscribing to somebody else's copy of the same dates would buy a dependency for nothing.
Which address wins
- The dated session's own address.
- The programme's address.
- Site details.
- For registration and consultation only: this site's own consultation page, so the action is never a dead end. That case prints no "continues on…" sentence, because nothing continues anywhere — the visitor stays here.
A session or programme address with no name of its own borrows the Site details name only when it is on the same host. A programme that books through a different provider stays honestly anonymous rather than wearing a name that is not that provider's.
Recipes
Each recipe is the same four questions. No product is named as compatible anywhere in this documentation: compatibility is a dated test on an exact version, and where one has been run it is recorded in Tested versions. What follows describes the shape of the thing to look for.
A booking or scheduling tool
The shape: a hosted page, one address per bookable thing, that opens a chooser and confirms by e-mail.
- Where to paste the address. Per session: Programs → Sessions → Edit → Session details → Registration or consultation URL. Per programme: Programs → Edit → Program decision details. Site-wide: Settings → Site details → How people register.
- What the theme does with it. Renders the action, prints the provider name beside it, and leaves. Nothing else.
- What it does not do. It does not pass the programme, the date, the price or the learner
along; it does not hold a place; it does not know whether the booking succeeded. If your tool
can accept context, put it in the address yourself as a query — for example
https://booking.example.com/b2-spanish?cohort=october. - How to test it. Open the programme page in a private window. Confirm the button's name matches the service that opens. Complete one booking and check the confirmation arrives. Change the session's status to Closed and confirm the action becomes "Book a consultation".
A form plugin, or a hosted form
The shape: either a page on your own site that a form plugin renders, or a page on the form service's domain.
- Where to paste the address. Settings → Site details → Where else this site hands over → Contact form address. A page on your own site is a perfectly good answer here.
- What the theme does with it. Links to it, and names it. If it is a page on your own site the note still appears; edit the provider name to your own studio's name so the sentence reads true.
- What it does not do. It never posts a form, stores a submission, sends mail or records consent. Delivery, spam handling, retention and the privacy notice are the form's owner's job — yours. See Registration, forms and privacy.
- How to test it. Submit the form twice, to two different mailboxes, and check the spam folder. Then test it with JavaScript disabled, and with a screen reader, because the form is a page of your site to a visitor even when it is not one to you.
A CRM or a mailing list
The shape: a hosted sign-up page, with its own consent text and its own unsubscribe link.
- Where to paste the address. Settings → Site details → Where else this site hands over → Mailing list address.
- What the theme does with it. Renders "Join the mailing list" and names the service.
- What it does not do. No address, no name and no consent is collected or stored on this site. There is no embedded sign-up field anywhere in the theme, deliberately: an embedded field would mean a third-party script on every page and a consent record this product will not keep.
- How to test it. Follow the link and subscribe with a fresh address. Confirm the consent wording on the service's page is yours and is accurate. Confirm the unsubscribe link works. Then read your own privacy notice again and make sure it describes what actually happens.
A calendar or scheduling page
The shape: a published calendar somebody can browse, or a per-person scheduling page.
- Where to paste the address. As a consultation address — per programme, or site-wide in How people register.
- What the theme does with it. Treats it as the consultation seam: the action reads "Book a consultation" and the note names the service.
- What it does not do. It does not read the calendar, show availability, or synchronise anything. A session's status on this site is what you typed; it never means a seat is free.
- How to test it. Confirm the page loads for somebody who is not signed in to the service.
Add to calendar: the integration with no account
Every session that has a published start date offers Add to calendar — in the session ledger
and in the decision panel beside the main action. The file is generated by the plugin itself at
?lue_calendar=<session id>, served as text/calendar with the session's own file name. No
account, no configuration, no request leaves your site, and it works on a plain permalink setting.
The event carries the start date, the programme title as its summary, the session's location text, and a link back to the programme page.
It is an all-day event, and that is deliberate. A session stores a date and a schedule label written for a person — "Tue & Thu · 18:30–20:00". Turning that sentence into a machine-readable instant would mean guessing an hour and a timezone, and a wrong hour in somebody's calendar is worse than no hour at all. The entry therefore covers the whole day, and the schedule label travels in the event's description, where a person reads it. Publish an end date on the session and the entry spans the whole run.
To test it: open a programme with a dated session, press Add to calendar, and open the downloaded file. Your calendar should show the programme title on the session's start date.
Destination profiles
A destination profile is a named map of seam to name and address. It exists so that a demonstration site and a real site can be the same installation in two states rather than two different builds.
placeholderis the default, and the state this theme ships in. Its addresses are examples of the shape of the thing. They are printed in the Site details field descriptions to show you what belongs there, and they are never linked from a page. On a placeholder profile, the only destinations a visitor can reach are the ones you recorded yourself.- A live profile supplies real destinations. It is registered in code by whoever runs the
installation, on the
lumina_edu_core_destination_profilesfilter, from a site-specific must-use plugin. No live third-party address ships inside the theme or plugin ZIP. A live profile answers before Site details, deliberately: it belongs to the installation rather than to its content, so re-importing the demo cannot take a hosted demonstration off its real services.
Choose the profile in Settings → Site details → Where else this site hands over → Destination
profile, or pin it where no editor and no importer can reach it by putting this in
wp-config.php:
define( 'LUMINA_EDU_CORE_DESTINATION_PROFILE', 'placeholder' );
A profile's shape, for anyone registering one:
add_filter(
'lumina_edu_core_destination_profiles',
function ( $profiles ) {
$profiles['my-demo'] = array(
'label' => 'My demonstration services',
'live' => true,
'seams' => array(
'registration' => array(
'url' => 'https://booking.example.org/demo',
'name' => 'Example Bookings',
),
),
);
return $profiles;
}
);
Seams a live profile does not name fall through to Site details as usual, so a profile can supply one destination and leave the rest alone.
Before you launch
- Replace every demo address in Site details with your own, or empty the field.
- Give every seam you use a provider name, so the sentence beside the button says where it goes.
- Check the destination profile is the one you mean.
- Click every action on a published page, in a private window, and watch where it lands.
- Recheck the links whenever a provider changes — nothing on this site can notice that for you.