{"id":318004,"date":"2026-06-27T08:45:17","date_gmt":"2026-06-27T08:45:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/solvian-academy-connect\/"},"modified":"2026-07-27T20:01:55","modified_gmt":"2026-07-27T20:01:55","slug":"solvian-academy-connect","status":"publish","type":"plugin","link":"https:\/\/haz.wordpress.org\/plugins\/solvian-academy-connect\/","author":23505559,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.29","stable_tag":"1.0.29","tested":"7.0.2","requires":"5.9","requires_php":"7.4","requires_plugins":null,"header_name":"Solvian Academy Connect","header_author":"IT-Legends","header_description":"Koppel uw website direct aan Solvian: cursuscatalogus, live startdata, online boekingen en beheer. Whitelabel voor installatie bij klanten.","assets_banners_color":"","last_updated":"2026-07-27 20:01:55","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.solvian.nl","header_author_uri":"https:\/\/www.it-legends.nl","rating":0,"author_block_rating":0,"active_installs":0,"downloads":303,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"itlegends","date":"2026-06-27 08:45:01"},"1.0.10":{"tag":"1.0.10","author":"itlegends","date":"2026-07-17 11:12:02"},"1.0.11":{"tag":"1.0.11","author":"itlegends","date":"2026-07-17 14:22:50"},"1.0.12":{"tag":"1.0.12","author":"itlegends","date":"2026-07-17 14:35:26"},"1.0.15":{"tag":"1.0.15","author":"itlegends","date":"2026-07-18 11:00:12"},"1.0.16":{"tag":"1.0.16","author":"itlegends","date":"2026-07-25 07:20:45"},"1.0.2":{"tag":"1.0.2","author":"itlegends","date":"2026-07-12 07:42:46"},"1.0.29":{"tag":"1.0.29","author":"itlegends","date":"2026-07-27 20:01:55"}},"upgrade_notice":{"1.0.11":"<p>Important VAT fix: BTW is now calculated correctly per course (including exempt courses) in the cart, checkout, and detail pages, and &quot;Cache legen&quot; no longer clears visitor shopping carts. Recommended update.<\/p>","1.0.10":"<p>Fixes bookings by private individuals silently failing to submit. Recommended update.<\/p>","1.0.2":"<p>Fixes catalog page filters (location filter, view toggle, category select-all) and theme compatibility. Recommended update.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","1.0.10","1.0.11","1.0.12","1.0.15","1.0.16","1.0.2","1.0.29"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Course catalog with list and grid view","2":"Course detail page with booking widget","3":"Booking form with cart support","4":"Admin settings panel"}},"plugin_section":[],"plugin_tags":[140904,269,7114,269076,4775],"plugin_category":[40],"plugin_contributors":[269077],"plugin_business_model":[],"class_list":["post-318004","plugin","type-plugin","status-publish","hentry","plugin_tags-academy","plugin_tags-booking","plugin_tags-courses","plugin_tags-solvian","plugin_tags-training","plugin_category-calendar-and-events","plugin_contributors-itlegends","plugin_committers-itlegends"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/solvian-academy-connect.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Solvian Academy Connect integrates your WordPress website with the Solvian platform. After installation and configuration you get:<\/p>\n\n<ul>\n<li>Live course catalog sourced directly from Solvian<\/li>\n<li>Calendar with start dates per course<\/li>\n<li>Online booking form (private individuals, freelancers, and business)<\/li>\n<li>Waitlist when no dates are available<\/li>\n<li>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<\/li>\n<li>Multi-course shopping cart<\/li>\n<li>Booking management in the WordPress admin panel<\/li>\n<li>Optional Mollie payment integration (iDEAL, creditcard, Bancontact, invoice)<\/li>\n<li>Optional Zitadel OIDC login for returning customers<\/li>\n<li>Configurable location visibility (filter and location names can be hidden site-wide)<\/li>\n<li>Configurable notification e-mail addresses for bookings\/payments, waitlist, and information requests<\/li>\n<li>Date of birth field for each participant, optionally required (Settings \u2192 Deelnemersvelden)<\/li>\n<\/ul>\n\n<h4>External Services<\/h4>\n\n<p>This plugin communicates with the following external services:<\/p>\n\n<ul>\n<li><strong>Solvian API<\/strong> (your own Solvian environment, e.g. <code>https:\/\/yourorg.solvian.nl<\/code>) \u2014 to fetch course catalog, availability, and submit bookings. <a href=\"https:\/\/www.solvian.nl\/privacy\">Solvian privacy policy<\/a><\/li>\n<li><strong>Mollie<\/strong> (<code>https:\/\/api.mollie.com<\/code>) \u2014 optional, for online payment processing. Only used when payment is enabled and a Mollie API key is configured. <a href=\"https:\/\/www.mollie.com\/en\/privacy\">Mollie privacy policy<\/a><\/li>\n<li><strong>Zitadel<\/strong> (your own Zitadel instance) \u2014 optional, for customer login (OIDC). Only used when Zitadel login is enabled. <a href=\"https:\/\/zitadel.com\/docs\/legal\/policies\/privacy-policy\">Zitadel privacy policy<\/a>\nNo data is sent to these services without the site administrator explicitly entering API credentials.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin via <strong>Plugins<\/strong> in WordPress admin<\/li>\n<li>Go to <strong>Solvian \u2192 Settings<\/strong> and enter:\n\n<ul>\n<li>Base URL (e.g. <code>https:\/\/yourorg.solvian.nl<\/code>)<\/li>\n<li>Bearer token (obtain from Solvian or IT-Legends)<\/li>\n<\/ul><\/li>\n<li>The required pages are created automatically on activation<\/li>\n<\/ol>\n\n<h4>Shortcodes<\/h4>\n\n<ul>\n<li><code>[solvac_courses]<\/code> \u2014 Course catalog page<\/li>\n<li><code>[solvac_featured_courses]<\/code> \u2014 Compact grid widget of featured\/recent courses (e.g. for the homepage)<\/li>\n<li><code>[solvac_planning]<\/code> \u2014 \"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 <code>?module=<\/code> query var. Attributes: <code>default_module<\/code>, <code>limit<\/code><\/li>\n<li><code>[solvac_booking]<\/code> \u2014 Booking form<\/li>\n<li><code>[solvac_my_page]<\/code> \u2014 Customer account page (requires Zitadel)<\/li>\n<li><code>[solvac_cart]<\/code> \u2014 Shopping cart<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20solvian%20account%3F\"><h3>Do I need a Solvian account?<\/h3><\/dt>\n<dd><p>Yes. You need an active Solvian Academy account and API credentials. Contact IT-Legends or Solvian to obtain these.<\/p><\/dd>\n<dt id=\"is%20mollie%20required%3F\"><h3>Is Mollie required?<\/h3><\/dt>\n<dd><p>No. Mollie integration is optional. Bookings can be submitted without payment (invoice flow). Enable Mollie in Settings \u2192 Payment when you want to offer online payment.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20store%20personal%20data%3F\"><h3>Does the plugin store personal data?<\/h3><\/dt>\n<dd><p>Yes. Booking data (name, email, company) is stored temporarily in a private WordPress custom post type. Enable debug mode only when troubleshooting \u2014 debug logs are stored for a maximum of 24 hours. See your privacy policy for details.<\/p><\/dd>\n<dt id=\"what%20php%20version%20is%20required%3F\"><h3>What PHP version is required?<\/h3><\/dt>\n<dd><p>PHP 7.4 or higher. Tested on PHP 8.1 and 8.2.<\/p><\/dd>\n<dt id=\"how%20do%20i%20flush%20the%20course%20cache%3F\"><h3>How do I flush the course cache?<\/h3><\/dt>\n<dd><p>Go to <strong>Solvian \u2192 Settings<\/strong> and click <strong>Clear cache<\/strong>, or run <code>wp solvian clear-cache<\/code> via WP-CLI.<\/p><\/dd>\n<dt id=\"what%20happens%20for%20courses%20with%20no%20price%20%28%22prijs%20op%20aanvraag%22%29%3F\"><h3>What happens for courses with no price (\"Prijs op aanvraag\")?<\/h3><\/dt>\n<dd><p>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 <strong>Solvian \u2192 Informatieaanvragen<\/strong> and e-mailed to the configured notification address.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.29<\/h4>\n\n<ul>\n<li>Cleanup: de \"Catalog structuur\"-pagina verwijderd (was leeg\/ongebruikt \u2014 de onderliggende override-mechaniek blijft intact voor het geval het ooit nodig is, alleen het admin-scherm is weg).<\/li>\n<\/ul>\n\n<h4>1.0.28<\/h4>\n\n<ul>\n<li>Cleanup: de \"Booking debug\"-pagina (eventGroupId-lookup en directe GuestBookings-testPOST) verwijderd \u2014 was alleen nodig tijdens de initi\u00eble API-koppeling. De onderliggende debug-logging blijft intact, alleen het admin-scherm eromheen is weg.<\/li>\n<li>Cleanup: de knop \"Test Courses endpoint\" op de instellingenpagina verwijderd.<\/li>\n<li>Change: de shortcode-lijst op de instellingenpagina toont nu ook [solvac_featured_courses] en [solvac_planning].<\/li>\n<\/ul>\n\n<h4>1.0.27<\/h4>\n\n<ul>\n<li>New: cursussen zonder prijs (Solvian's \"Prijs op aanvraag (website)\"-schakelaar \u2014 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 \u2192 Informatieaanvragen en worden gemaild naar het in te stellen adres (Solvian \u2192 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.<\/li>\n<\/ul>\n\n<h4>1.0.26<\/h4>\n\n<ul>\n<li>Change: de datumtekst in [solvac_planning] is aangepast naar \"Eerste mogelijkheid: ...\" zodat duidelijker is dat dit de eerstvolgende beschikbare startdatum is, niet de enige.<\/li>\n<\/ul>\n\n<h4>1.0.25<\/h4>\n\n<ul>\n<li>Change: [solvac_planning] toont nu maximaal \u00e9\u00e9n rij per cursus (de eerstvolgende startdatum) in plaats van een aparte rij per beschikbare datum \u2014 een wekelijks terugkerende cursus (bijv. elke vrijdag) vulde de lijst anders met meerdere regels voor dezelfde cursus.<\/li>\n<\/ul>\n\n<h4>1.0.24<\/h4>\n\n<ul>\n<li>Cleanup: het tijdelijke diagnostische debug-blok (<code>&amp;solvac_debug=1<\/code>) uit [solvac_planning] verwijderd nu de tijdweergave bevestigd is opgelost.<\/li>\n<\/ul>\n\n<h4>1.0.23<\/h4>\n\n<ul>\n<li>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) \u2014 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().<\/li>\n<\/ul>\n\n<h4>1.0.22<\/h4>\n\n<ul>\n<li>Fix: [solvac_planning] toonde een verzonnen eindtijd (gelijk aan de starttijd) \u2014 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.<\/li>\n<li>Debug: het diagnostische blok (<code>&amp;solvac_debug=1<\/code>) toont nu ook wat wp_timezone() en de tijdzone-opties daadwerkelijk teruggeven op de server, plus een testvoorbeeld \u2014 om de resterende starttijd-afwijking te doorgronden.<\/li>\n<\/ul>\n\n<h4>1.0.21<\/h4>\n\n<ul>\n<li>Debug: tijdelijke diagnostische weergave in [solvac_planning] \u2014 voeg als ingelogde beheerder <code>&amp;solvac_debug=1<\/code> toe 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.<\/li>\n<\/ul>\n\n<h4>1.0.20<\/h4>\n\n<ul>\n<li>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\" \u2014 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 \u2014 dat is ook de reden dat de vorige fix geen enkel effect leek te hebben, ongeacht de WordPress-tijdzone-instelling.<\/li>\n<\/ul>\n\n<h4>1.0.19<\/h4>\n\n<ul>\n<li>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 \u2014 net als het planningsoverzicht vorige versie \u2014 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.<\/li>\n<\/ul>\n\n<h4>1.0.18<\/h4>\n\n<ul>\n<li>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().<\/li>\n<li>Change: \"Inschrijven\" in [solvac_planning] springt niet meer direct naar de checkout met een vastgezet event \u2014 het linkt naar de startdata-kalender op de cursusdetailpagina, zodat de bezoeker daar zelf een datum kiest.<\/li>\n<li>New: een cursus (of specifieke startdatum) zonder ingestelde prijs (\u20ac0) wordt nergens meer als boekbaar getoond en kan nergens meer daadwerkelijk geboekt worden \u2014 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 \u20ac0-prijs betekent bijna altijd dat de prijs nog niet is ingesteld in Solvian, niet dat de cursus gratis is.<\/li>\n<li>New: nieuwe optie \"Deze cursus is bewust gratis\" bij Solvian \u2192 Cursusverrijking, voor de uitzondering waarbij \u20ac0 w\u00e9l de bedoelde prijs is (bijv. een gratis kennismakingssessie) \u2014 die cursussen blijven zichtbaar en boekbaar.<\/li>\n<\/ul>\n\n<h4>1.0.17<\/h4>\n\n<ul>\n<li>New: <code>[solvac_planning]<\/code> shortcode \u2014 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 <code>?module=<\/code> query var, so no separate page per module is needed.<\/li>\n<\/ul>\n\n<h4>1.0.16<\/h4>\n\n<ul>\n<li>New: geboortedatumveld toegevoegd bij elke deelnemer op het inschrijfformulier (los cursusformulier en winkelmandje-checkout, inclusief dynamisch toegevoegde deelnemers). Instelbaar via Instellingen \u2192 Deelnemersvelden of dit veld verplicht is; wordt meegestuurd naar Solvian als <code>participantBirthDate<\/code> op de booking line.<\/li>\n<\/ul>\n\n<h4>1.0.15<\/h4>\n\n<ul>\n<li>New: optie \"Altijd deze locatie gebruiken\" bij de generieke agenda-locatie (Instellingen \u2192 Agenda-knoppen) \u2014 toont de ingestelde locatie altijd in de agenda-afspraak, ook wanneer Solvian zelf een locatie meegeeft.<\/li>\n<\/ul>\n\n<h4>1.0.14<\/h4>\n\n<ul>\n<li>New: \"Voeg toe aan agenda\" knoppen zijn nu optioneel via Instellingen \u2192 Agenda-knoppen (standaard aan).<\/li>\n<li>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).<\/li>\n<\/ul>\n\n<h4>1.0.13<\/h4>\n\n<ul>\n<li>New: \"Voeg toe aan agenda\" knoppen op de boekingsbevestiging (na factuur-boeking en na geslaagde Mollie-betaling) \u2014 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.<\/li>\n<li>New: Schema.org Course\/CourseInstance structured data (JSON-LD) op cursusdetailpagina's, met naam, beschrijving, prijs en tot 20 aankomende startdata\/locaties \u2014 maakt cursuspagina's geschikt voor Google's Course rich result. Wordt via wp_head uitgevoerd zodat het nooit door content-filtering kan worden verwijderd.<\/li>\n<\/ul>\n\n<h4>1.0.12<\/h4>\n\n<ul>\n<li>New: <code>[solvac_featured_courses]<\/code> shortcode \u2014 a compact grid widget showing a handful of courses (e.g. on the homepage), driven by Solvian's per-course \"Uitlichten op website\" toggle. Supports <code>limit<\/code>, <code>columns<\/code>, <code>title<\/code>, and <code>button<\/code>\/<code>button_text<\/code> attributes; falls back to showing regular courses if none are flagged as featured yet.<\/li>\n<\/ul>\n\n<h4>1.0.11<\/h4>\n\n<ul>\n<li>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 \u2014 both now calculate VAT per line item, so mixed carts (exempt + taxed courses) total correctly.<\/li>\n<li>Fix: a course with no VAT data returned by Solvian's price-calculation endpoint was treated as 0% (\"btw-vrijgesteld\"), which could silently charge \u20ac0 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.<\/li>\n<li>New: courses that Solvian marks with an exempt VAT code (e.g. \"Vrij\") are now automatically detected and shown as \"btw vrijgesteld\" \u2014 on the course detail page, in the shopping cart, and at checkout \u2014 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.<\/li>\n<li>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.<\/li>\n<li>Fix: on the checkout page, switching the \"Boek ik als\" selection to Particulier could reset the order subtotal to \u20ac0,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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.10<\/h4>\n\n<ul>\n<li>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 <code>required<\/code> attribute blocked native form validation. The private phone field now has its own name and required-state handling.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>New: separate, configurable notification e-mail addresses for booking\/payment notifications and waitlist notifications (Settings \u2192 Notificaties). Both fall back to the site administrator e-mail when left empty.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Change: restyled the Startdata list's date badge from a flat dark square into a calendar-card look (superseded by 1.0.7).<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Fix: phone number field was not actually required and accepted invalid formats; it is now required with format validation, both client- and server-side.<\/li>\n<li>Fix: customers booking as a private individual could add multiple participants; the checkout form now restricts private bookings to a single participant.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix: catalog page's card\/list view toggle no longer left the previous button looking active after switching views.<\/li>\n<li>Fix: location filter on the catalog page returned no results \u2014 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.<\/li>\n<li>Fix: catalog category filter now supports selecting\/deselecting all categories at once, and a shareable <code>?cat=<\/code> URL parameter to link directly to a pre-filtered category view.<\/li>\n<li>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.<\/li>\n<li>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) \u2014 this caused the whole catalog UI to be non-interactive with no console error.<\/li>\n<li>Fix: the four companion storefront themes (bhv-ehbo, comm-training, it-academy, solvian) referenced the plugin's old pre-rename class name (<code>SCE_Stable_Plugin<\/code>) and shortcode (<code>[solvian_course_grid]<\/code>), so switching to any of them silently fell back to static demo content instead of live Solvian data. Updated to the current <code>SOLVAC_Plugin<\/code> class and <code>[solvac_courses]<\/code> shortcode.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Renamed shortcodes from solvian_* to solvac_* prefix per WordPress plugin guidelines<\/li>\n<li>Wrapped shortcode_booking output with wp_kses() to satisfy escaping requirements<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Live course catalog from Solvian API<\/li>\n<li>Online booking form<\/li>\n<li>Shopping cart for multi-course bookings<\/li>\n<li>Mollie payment integration (iDEAL, creditcard, Bancontact, invoice)<\/li>\n<li>Zitadel OIDC login integration<\/li>\n<li>Booking management in WordPress admin<\/li>\n<li>WP-CLI commands for cache management<\/li>\n<\/ul>","raw_excerpt":"Connect your WordPress website directly to Solvian Academy for live course catalogs and online bookings.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/318004","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=318004"}],"author":[{"embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/itlegends"}],"wp:attachment":[{"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=318004"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=318004"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=318004"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=318004"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=318004"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/haz.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=318004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}