Description
Solvian Academy Connect integrates your WordPress website with the Solvian platform. After installation and configuration you get:
- Live course catalog sourced directly from Solvian
- Calendar with start dates per course
- Online booking form (private individuals, freelancers, and business)
- Waitlist when no dates are available
- Automatic “price on request” handling: courses without a price (Solvian’s “Prijs op aanvraag” toggle) show a contact form instead of planning/booking, with submissions collected in the WordPress admin panel
- Multi-course shopping cart
- Booking management in the WordPress admin panel
- Optional Mollie payment integration (iDEAL, creditcard, Bancontact, invoice)
- Optional Zitadel OIDC login for returning customers
- Configurable location visibility (filter and location names can be hidden site-wide)
- Configurable notification e-mail addresses for bookings/payments, waitlist, and information requests
- Date of birth field for each participant, optionally required (Settings Deelnemersvelden)
External Services
This plugin communicates with the following external services:
- Solvian API (your own Solvian environment, e.g.
https://yourorg.solvian.nl) — to fetch course catalog, availability, and submit bookings. Solvian privacy policy - Mollie (
https://api.mollie.com) — optional, for online payment processing. Only used when payment is enabled and a Mollie API key is configured. Mollie privacy policy - Zitadel (your own Zitadel instance) — optional, for customer login (OIDC). Only used when Zitadel login is enabled. Zitadel privacy policy
No data is sent to these services without the site administrator explicitly entering API credentials.
Installation
- Upload the plugin folder to
/wp-content/plugins/ - Activate the plugin via Plugins in WordPress admin
- Go to Solvian Settings and enter:
- Base URL (e.g.
https://yourorg.solvian.nl) - Bearer token (obtain from Solvian or IT-Legends)
- Base URL (e.g.
- The required pages are created automatically on activation
Shortcodes
[solvac_courses]— Course catalog page[solvac_featured_courses]— Compact grid widget of featured/recent courses (e.g. for the homepage)[solvac_planning]— “Kies je module” style planning overview: a module sidebar (grouped by category) plus a per-module table of upcoming course dates/location/price with Inschrijven/Meer info links. One page handles every module via a?module=query var. Attributes:default_module,limit[solvac_booking]— Booking form[solvac_my_page]— Customer account page (requires Zitadel)[solvac_cart]— Shopping cart
FAQ
-
Do I need a Solvian account?
-
Yes. You need an active Solvian Academy account and API credentials. Contact IT-Legends or Solvian to obtain these.
-
Is Mollie required?
-
No. Mollie integration is optional. Bookings can be submitted without payment (invoice flow). Enable Mollie in Settings Payment when you want to offer online payment.
-
Does the plugin store personal data?
-
Yes. Booking data (name, email, company) is stored temporarily in a private WordPress custom post type. Enable debug mode only when troubleshooting — debug logs are stored for a maximum of 24 hours. See your privacy policy for details.
-
What PHP version is required?
-
PHP 7.4 or higher. Tested on PHP 8.1 and 8.2.
-
How do I flush the course cache?
-
Go to Solvian Settings and click Clear cache, or run
wp solvian clear-cachevia WP-CLI. -
What happens for courses with no price (“Prijs op aanvraag”)?
-
If a course has no price set in Solvian (via Solvian’s own “Prijs op aanvraag (website)” toggle) and isn’t explicitly marked as intentionally free, the course detail page automatically hides planning and pricing and shows a contact form instead. Submissions are collected under Solvian Informatieaanvragen and e-mailed to the configured notification address.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Solvian Academy Connect” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Solvian Academy Connect” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.29
- Cleanup: de “Catalog structuur”-pagina verwijderd (was leeg/ongebruikt — de onderliggende override-mechaniek blijft intact voor het geval het ooit nodig is, alleen het admin-scherm is weg).
1.0.28
- Cleanup: de “Booking debug”-pagina (eventGroupId-lookup en directe GuestBookings-testPOST) verwijderd — was alleen nodig tijdens de initiële API-koppeling. De onderliggende debug-logging blijft intact, alleen het admin-scherm eromheen is weg.
- Cleanup: de knop “Test Courses endpoint” op de instellingenpagina verwijderd.
- Change: de shortcode-lijst op de instellingenpagina toont nu ook [solvac_featured_courses] en [solvac_planning].
1.0.27
- New: cursussen zonder prijs (Solvian’s “Prijs op aanvraag (website)”-schakelaar — die geen apart API-veld heeft, maar resulteert in een lege/null prijs) tonen op de detailpagina nu geen planning, prijzen of boekingsknop meer, maar een contactformulier (“Vraag informatie aan”). Aanvragen komen terecht bij Solvian Informatieaanvragen en worden gemaild naar het in te stellen adres (Solvian Instellingen), net als de wachtlijst. Cursussen zonder prijs die niet expliciet als “bewust gratis” zijn gemarkeerd, laten nu overal “Prijs op aanvraag” zien in plaats van een lege of onterechte prijs (catalogus, uitgelichte cursussen); het planningsoverzicht liet deze al automatisch weg.
1.0.26
- Change: de datumtekst in [solvac_planning] is aangepast naar “Eerste mogelijkheid: …” zodat duidelijker is dat dit de eerstvolgende beschikbare startdatum is, niet de enige.
1.0.25
- Change: [solvac_planning] toont nu maximaal één rij per cursus (de eerstvolgende startdatum) in plaats van een aparte rij per beschikbare datum — een wekelijks terugkerende cursus (bijv. elke vrijdag) vulde de lijst anders met meerdere regels voor dezelfde cursus.
1.0.24
- Cleanup: het tijdelijke diagnostische debug-blok (
&solvac_debug=1) uit [solvac_planning] verwijderd nu de tijdweergave bevestigd is opgelost.
1.0.23
- Fix (root cause found): alle verkeerde starttijden kwamen niet door tijdzone-parsing, maar door WordPress’ eigen date_i18n()-functie. Op deze site is de tijdzone-instelling een handmatige UTC-offset (geen stad geselecteerd) — in precies die situatie past date_i18n() de offset niet toe op een echte Unix-timestamp en toont het de rauwe UTC-tijd. wp_date() (de moderne, door WordPress zelf aanbevolen vervanger sinds 5.3) doet dit wel goed; bevestigd met een directe A/B-test in het debug-blok. Alle plekken die een Solvian-tijdstip tonen (planningsoverzicht, Startdata-kalender, winkelmandje, checkout-overzicht, “Mijn boekingen”) gebruiken nu wp_date() in plaats van date_i18n().
1.0.22
- Fix: [solvac_planning] toonde een verzonnen eindtijd (gelijk aan de starttijd) — de Solvian Availability-koppeling levert helemaal geen eindtijd per startmoment (bevestigd via de ruwe API-data: alleen ‘startDateTime’, geen ‘endDateTime’-veld). Toont nu alleen de echte starttijd, geen “start-eind”-bereik meer.
- Debug: het diagnostische blok (
&solvac_debug=1) toont nu ook wat wp_timezone() en de tijdzone-opties daadwerkelijk teruggeven op de server, plus een testvoorbeeld — om de resterende starttijd-afwijking te doorgronden.
1.0.21
- Debug: tijdelijke diagnostische weergave in [solvac_planning] — voeg als ingelogde beheerder
&solvac_debug=1toe aan de cursusoverzicht-URL om de ruwe Solvian Availability-data (voor/na normalisatie) direct op de pagina te zien. Alleen zichtbaar voor “Beheerder”-gebruikers, nooit voor bezoekers. Wordt verwijderd zodra de tijdweergave bevestigd is opgelost.
1.0.20
- Fix: de vorige tijdzone-fix (1.0.19, wp_timezone()) loste de verkeerde starttijden niet op omdat de aanname zelf niet klopte. Solvian’s Availability-API levert de datum/tijd al als UTC, niet als “kale lokale tijd” — Solvian’s eigen planningsscherm toont bijvoorbeeld 08:00 terwijl deze API-velden voor datzelfde moment 06:00 bevatten (precies het Amsterdamse zomertijdverschil). Overal waar dit veld gelezen wordt (planningsoverzicht, Startdata-kalender, structured data voor Google, .ics-agenda-export) wordt het nu als UTC geparsed en pas daarna naar de sitetijdzone omgezet voor weergave — dat is ook de reden dat de vorige fix geen enkel effect leek te hebben, ongeacht de WordPress-tijdzone-instelling.
1.0.19
- Fix: alle overige plekken die een Solvian-startdatum/tijd toonden (de “Startdata”-kalender op de cursusdetailpagina, de “eerstvolgende start” in de zijbalk, en de ongebruikte event_card()-helper) gebruikten nog strtotime(), wat — net als het planningsoverzicht vorige versie — de weergegeven tijd verkeerd kon tonen als de tijdzone van de PHP-server afwijkt van de sitetijdzone. Nu overal via de nieuwe gedeelde parse_solvian_datetime()-helper, die net als wp_timezone() de site-tijdzone gebruikt in plaats van de servertijdzone.
1.0.18
- Fix: het planningsoverzicht ([solvac_planning]) las Solvian’s starttijden met strtotime(), wat de weergegeven tijd verkeerd kon tonen wanneer de tijdzone van de server afwijkt van de site-tijdzone. Nu, net als elders in het plugin, geparsed via wp_timezone().
- Change: “Inschrijven” in [solvac_planning] springt niet meer direct naar de checkout met een vastgezet event — het linkt naar de startdata-kalender op de cursusdetailpagina, zodat de bezoeker daar zelf een datum kiest.
- New: een cursus (of specifieke startdatum) zonder ingestelde prijs (€0) wordt nergens meer als boekbaar getoond en kan nergens meer daadwerkelijk geboekt worden — noch in [solvac_planning], noch via de “In winkelmandje”-knop op de cursusdetailpagina, noch via de winkelmandje/checkout-verwerking zelf (cart-add en alle boekingspaden valideren nu server-side tegen Solvian’s PriceCalculations). Een €0-prijs betekent bijna altijd dat de prijs nog niet is ingesteld in Solvian, niet dat de cursus gratis is.
- New: nieuwe optie “Deze cursus is bewust gratis” bij Solvian Cursusverrijking, voor de uitzondering waarbij €0 wél de bedoelde prijs is (bijv. een gratis kennismakingssessie) — die cursussen blijven zichtbaar en boekbaar.
1.0.17
- New:
[solvac_planning]shortcode — a “Kies je module” style planning overview page (module sidebar, grouped by category, + per-module table of upcoming startdata, locatie, prijs, Inschrijven/Meer info). One WordPress page can serve every module via a?module=query var, so no separate page per module is needed.
1.0.16
- New: geboortedatumveld toegevoegd bij elke deelnemer op het inschrijfformulier (los cursusformulier en winkelmandje-checkout, inclusief dynamisch toegevoegde deelnemers). Instelbaar via Instellingen Deelnemersvelden of dit veld verplicht is; wordt meegestuurd naar Solvian als
participantBirthDateop de booking line.
1.0.15
- New: optie “Altijd deze locatie gebruiken” bij de generieke agenda-locatie (Instellingen Agenda-knoppen) — toont de ingestelde locatie altijd in de agenda-afspraak, ook wanneer Solvian zelf een locatie meegeeft.
1.0.14
- New: “Voeg toe aan agenda” knoppen zijn nu optioneel via Instellingen Agenda-knoppen (standaard aan).
- New: instelbare generieke locatie die wordt gebruikt in de agenda-afspraak wanneer Solvian geen locatie meegeeft bij een startmoment (bijv. e-learning of in-company cursussen).
1.0.13
- New: “Voeg toe aan agenda” knoppen op de boekingsbevestiging (na factuur-boeking en na geslaagde Mollie-betaling) — een Google Agenda-link per geboekt startmoment plus een .ics-download voor Outlook/Apple Agenda. Alle datum/tijdzone-berekening gebeurt serverside op basis van de sitetijdzone.
- New: Schema.org Course/CourseInstance structured data (JSON-LD) op cursusdetailpagina’s, met naam, beschrijving, prijs en tot 20 aankomende startdata/locaties — maakt cursuspagina’s geschikt voor Google’s Course rich result. Wordt via wp_head uitgevoerd zodat het nooit door content-filtering kan worden verwijderd.
1.0.12
- New:
[solvac_featured_courses]shortcode — a compact grid widget showing a handful of courses (e.g. on the homepage), driven by Solvian’s per-course “Uitlichten op website” toggle. Supportslimit,columns,title, andbutton/button_textattributes; falls back to showing regular courses if none are flagged as featured yet.
1.0.11
- Fix: BTW was calculated per settings default everywhere instead of per course. The shopping cart page didn’t look up Solvian’s per-course VAT at all, and the checkout page only used the first cart item’s VAT rate for the whole order — both now calculate VAT per line item, so mixed carts (exempt + taxed courses) total correctly.
- Fix: a course with no VAT data returned by Solvian’s price-calculation endpoint was treated as 0% (“btw-vrijgesteld”), which could silently charge €0 VAT on every course, not just exempt ones. A missing/empty response now falls back to the configured default rate instead of assuming exemption; only an explicit 0% or exempt VAT code from Solvian is now trusted.
- New: courses that Solvian marks with an exempt VAT code (e.g. “Vrij”) are now automatically detected and shown as “btw vrijgesteld” — on the course detail page, in the shopping cart, and at checkout — instead of a hardcoded default percentage. A manual “btw-vrijgesteld” override is also available per course on the Verrijking admin page for cases where Solvian’s data can’t be used directly.
- Fix: “Cache legen” in Settings deleted every visitor’s shopping cart along with the intended API cache, because both were stored as similarly-prefixed transients. Cart data is now explicitly excluded from the cache-clear action.
- Fix: on the checkout page, switching the “Boek ik als” selection to Particulier could reset the order subtotal to €0,00 in the sidebar summary due to a JavaScript data-parsing issue. The total recalculation now safely falls back to the correct, server-rendered amount instead of blanking it.
- New: the Verrijking (course enrichment) admin page’s “Introductietekst” and “Programma” fields now use a rich-text editor instead of a plain text box, so formatted HTML (bold, links, lists) can be entered directly.
- Fix: the course detail page checked VAT status without a specific start date, so Solvian couldn’t resolve a concrete price/VAT line and the page silently fell back to the default rate. It now uses the course’s nearest upcoming start date for this check, matching the cart and checkout pages.
1.0.10
- Fix: booking as a private individual (Particulier) could silently fail to submit. The private-person phone field shared its HTML name with the company phone field, so the hidden company field’s
requiredattribute blocked native form validation. The private phone field now has its own name and required-state handling.
1.0.9
- New: separate, configurable notification e-mail addresses for booking/payment notifications and waitlist notifications (Settings Notificaties). Both fall back to the site administrator e-mail when left empty.
1.0.8
- Fix: clicking a date in the course detail page’s calendar view navigated straight to the old booking page instead of adding the course to the cart, unlike the list view. Calendar view now uses the same add-to-cart behaviour as the list view.
1.0.7
- Change: simplified the Startdata list’s date indicator to a plain calendar icon (matching the site’s existing icon style) instead of a styled date card.
1.0.6
- Change: restyled the Startdata list’s date badge from a flat dark square into a calendar-card look (superseded by 1.0.7).
1.0.5
- New: “Locatie tonen” setting to show/hide location entirely. When disabled, the location filter is removed and location names are hidden across the catalog, course detail page, cart, checkout, and account pages.
1.0.4
- Fix: phone number field was not actually required and accepted invalid formats; it is now required with format validation, both client- and server-side.
- Fix: customers booking as a private individual could add multiple participants; the checkout form now restricts private bookings to a single participant.
1.0.3
- Fix: language and month filters on the course detail page’s calendar section stopped working under some themes. The filtering logic depended on an inline script that WordPress doesn’t guarantee prints after the shortcode output; it now lives in the plugin’s static frontend.js instead.
1.0.2
- Fix: catalog page’s card/list view toggle no longer left the previous button looking active after switching views.
- Fix: location filter on the catalog page returned no results — course event locations are now cached from the Availability API (mirroring the existing price cache) and warmed automatically after a cache clear and daily via cron.
- Fix: catalog category filter now supports selecting/deselecting all categories at once, and a shareable
?cat=URL parameter to link directly to a pre-filtered category view. - Fix: catalog grid cards misaligned when a category label or course subtitle wrapped to two lines; card content now reserves consistent height across a row.
- Fix: moved the catalog page’s view/filter JavaScript out of a per-page inline script into the plugin’s static frontend.js. The inline version depended on WordPress printing the script tag after the shortcode ran, which isn’t guaranteed under every theme (notably some block themes) — this caused the whole catalog UI to be non-interactive with no console error.
- Fix: the four companion storefront themes (bhv-ehbo, comm-training, it-academy, solvian) referenced the plugin’s old pre-rename class name (
SCE_Stable_Plugin) and shortcode ([solvian_course_grid]), so switching to any of them silently fell back to static demo content instead of live Solvian data. Updated to the currentSOLVAC_Pluginclass and[solvac_courses]shortcode.
1.0.1
- Renamed shortcodes from solvian_* to solvac_* prefix per WordPress plugin guidelines
- Wrapped shortcode_booking output with wp_kses() to satisfy escaping requirements
1.0.0
- Initial release
- Live course catalog from Solvian API
- Online booking form
- Shopping cart for multi-course bookings
- Mollie payment integration (iDEAL, creditcard, Bancontact, invoice)
- Zitadel OIDC login integration
- Booking management in WordPress admin
- WP-CLI commands for cache management