Releases: ChristianKarlConsulting/livento-kurskatalog
Release list
v1.46.0 — KI-Kennzeichnung der Kursbilder
KI-Kennzeichnung der Kursbilder. Ist ein Kursbild in Campus Connect als KI-generiert gekennzeichnet, sitzt auf Karte und Detailbild eine Plakette „KI-generiert" in der unteren rechten Ecke (Petrol #004D33 mit hellem Ring).
Der Anlass: Kursbilder liegen nicht in der WordPress-Mediathek, sondern im Supabase-Bucket public-course-images. Das Plugin „Livento KI-Kennzeichnung" kann sie deshalb nicht erfassen — zu ihnen gibt es keinen WordPress-Anhang, an dem ein Häkchen hängen könnte. Ein Häkchen in der Mediathek bleibt auf Kursbilder folgenlos.
Gepflegt wird die Kennzeichnung darum in Campus Connect (ab v3.220.0): Öffentliche Kurse → Kurs bearbeiten → Basis, Häkchen unter dem Bild. Das Plugin liest sie über das neue Feld public_image_ai_generated aus public_offerings.
Voraussetzung: Campus Connect ab v3.220.0. Fehlt das Feld, bleibt die Plakette einfach aus — das Plugin bricht nicht.
Eigene CSS-Klassen im lvk-Namensraum statt der Klassen des Mediathek-Plugins: sonst hinge der Katalog an einem Stylesheet, das nur geladen wird, solange in der Mediathek mindestens ein Bild angehakt ist. Der Text der Plakette lässt sich über den Filter livento_cc_ki_text ändern.
v1.45.1 — Eigener Reiter Dozenten im Backend
Backend-Ergänzung zu v1.45.0 — an der Ausgabe auf der Website ändert sich nichts.
Eigener Reiter „Dozenten"
Bis hier war der Dozenten-Teil im Plugin nur ein Einstellungsfeld. Wer wissen wollte, warum jemand nicht auf der Seite steht, fand im Plugin keinen Anhaltspunkt — und suchte den Fehler an der falschen Stelle.
Der neue Reiter zeigt:
- Anzahl der freigegebenen Profile und wie viele davon ein Foto haben
- Tabelle mit Name, Funktionsbezeichnung, Foto-Status und Stichworten
- den Shortcode zum Kopieren und die drei Einrichtungsschritte
- die vollständige Liste der Bedingungen, unter denen ein Profil überhaupt erscheint — samt dem Hinweis, dass die Ursache immer in Campus Connect liegt und nie im Plugin
- Warnung bei null Profilen; Hinweis bei weniger als drei, weil eine Personenseite mit einem einzigen Eintrag als dünn bewertet wird
Außerdem
[livento_dozenten]steht jetzt in der Shortcode-Übersicht (Reiter „Shortcodes")- Die Anleitung hat einen eigenen Abschnitt 8 „Dozentinnen und Dozenten"; die bisherigen Abschnitte 8 und 9 rücken auf 9 und 10
v1.45.0 — Dozentenseite + stabile Schema-Entitaeten
Dozentinnen und Dozenten werden auf der Website sichtbar — Etappe 2 zu Campus Connect Feature #181.
Neu
Shortcode [livento_dozenten] rendert alle in Campus Connect freigegebenen Profile als Raster: rundes Portrait, Name, Funktionsbezeichnung, Qualifikations-Stichworte und eine Kurzvorstellung, deren Rest sich aufklappt. Dazu ein Abschnitt „Wer dich unterrichtet" auf jeder Kursdetailseite.
Der Shortcode ist bewusst URL-frei. Anders als beim Katalog gibt es keine Slug-Konstante, keine Rewrite-Regel und keine Detailseiten je Dozent — einzelne dünne Personenseiten wären eine SEO-Last, kein Gewinn. Die Seite legst du an, wo du willst.
Profile ohne Foto verschwinden nicht, sondern bekommen ein eigenes Textlayout mit farbiger Kante. Eine Karte mit leerem Bildbereich wäre in einem Portraitraster der offensichtliche Bruch.
Das Plugin filtert nichts nach. Wer erscheint, entscheiden allein die beiden Tore in Campus Connect: Der Dozent muss eingewilligt und die Institutsleitung freigegeben haben. Die View public_instructors gibt nur sieben Spalten heraus — nie E-Mail, Telefon, Adresse oder Bankdaten. Ist niemand freigegeben, gibt der Shortcode nichts aus statt eines Platzhalters.
Schema.org: erstmals stabile Entitäten
Bis v1.44.0 trug keine Entität im Plugin eine @id — jede Nennung war für eine Suchmaschine ein eigenes, unverbundenes Objekt. Bei Kursen folgenlos, bei Personen nicht: Ein Dozent erscheint auf der Dozentenseite und auf jeder seiner Kursseiten. Ohne @id sind das ebenso viele verschiedene Menschen, und genau der kumulierte Autorenbezug entsteht nicht.
Person.@id=<dozentenseite>#dozent-<uuid>— bewusst die UUID statt des Namens, damit die Kennung eine Namensänderung überlebt und bei Namensgleichheit nicht kollidiert- Das
id-Attribut der Karte trägt dasselbe Fragment: die@idzeigt auf ein real vorhandenes Element, nicht ins Leere - Kursseiten führen nur eine schlanke Referenz ohne
description/knowsAbout— denselben Langtext mehrfach zu wiederholen bringt keinen Aussagewert - Neuer Organisationsknoten
https://livento-bildung.de/#organization; Kurs-providerund Dozenten-worksForzeigen jetzt auf denselben Knoten ItemListmitnumberOfItems, Kartenüberschrifth2auf der Übersicht undh3im Kursabschnitt (keine übersprungene Ebene)
Titel, Meta-Description und Canonical der Dozentenseite kommen wie bei jeder normalen WordPress-Seite aus Rank Math — das Plugin greift dort nicht ein.
Nach dem Update
- WordPress-Seite anlegen (Slug frei wählbar, z. B.
/dozenten/) und[livento_dozenten]einfügen. - Die URL dieser Seite unter Livento Katalog → Einstellungen → Dozentenseite eintragen. Bleibt das Feld leer, wird der Dozenten-Abschnitt auf den Kursseiten ohne Verlinkung gerendert — ein toter Link entsteht nie.
Voraussetzung: Campus Connect ab v3.218.0 (View public_instructors, Spalte public_offerings.instructors).
v1.44.0 — Unterrichtszeiten & Wochentage auf der Kursseite
Mehrtägige Weiterbildungen zeigen auf der Kursseite jetzt die Unterrichtszeiten und Wochentage.
- Faktenbox „Auf einen Blick": abgeleitete Zusammenfassung (z. B. „Mo & Mi · 17:00–20:15 Uhr, dazu einzelne Sa 08:30–15:30 Uhr").
- Im Kurstext: eigener Abschnitt „Unterrichtszeiten & Termine" mit aufklappbarer Liste ALLER Termine (Datum + Uhrzeit).
- Automatisch aus den in Campus Connect hinterlegten Lektionsterminen abgeleitet (View-Spalte
public_offerings.schedule, Campus Connect v3.192.0) — nur Live-/Präsenztermine; Selbstlernphasen und Praktikum ausgenommen. - Zusätzlich als schema.org
courseScheduleimcourseInstance-JSON-LD (SEO/GEO).
Enthält auch die zuvor im Workdir fehlenden v1.43.0-Änderungen (Testzugang über die Ticketseite).
v1.43.0 — Testzugang ueber die Ticketseite anfragen
Interessierte Einrichtungen koennen einen Testzugang jetzt direkt auf der Ticketseite anfragen.
Neu auf den Ticket-Detailseiten
- Abschnitt „Erst testen, dann entscheiden" (Anker
#testzugang) mit eigenem Formular - Unter jedem Kaufknopf ein dezenter Textlink „oder erst 14 Tage testen". Der Kaufknopf bleibt bewusst die Hauptaktion — ein gleich grosser Testknopf daneben holt zuverlaessig auch die ab, die ohnehin gekauft haetten.
- Die
bundle_idder angesehenen Setting-Variante reist mit, damit in Campus Connect genau das angefragte Ticket freigegeben wird - Die Beschaeftigtenzahl wird aus dem Preisrechner vorbelegt
Technik
- Neuer WP-REST-Proxy
POST /wp-json/livento/v1/trialreicht die Anfrage serverseitig an die Campus-Connect-Functionsubmit-trial-requestweiter — kein CORS, und der anon-Schluessel bleibt aus dem Quelltext der Seite draussen - Nach bestaetigtem Eingang Redirect auf
/danke-anfrage/, damit die Conversion als URL-Ziel messbar ist und nicht nur als dataLayer-Event - Sperre je IP (5/Stunde) und je E-Mail (1/Tag) per Transient, Honeypot wie beim Lead-Formular
- Bei einem Serverfehler wird die E-Mail-Sperre wieder geloest, damit ein Ausfall den zweiten Versuch nicht blockiert
Datenschutz
- Zwei getrennte Haekchen: Kenntnisnahme des Datenschutzhinweises (Pflicht) und Werbeeinwilligung (freiwillig). Den Testzugang von der Werbeeinwilligung abhaengig zu machen waere eine unzulaessige Kopplung — die Verarbeitung der Angaben ist Vertragsanbahnung.
Setzt Campus Connect v3.190.0 voraus.
v1.42.0 — Kopfpreis statt Teamsumme
Die Tarif-Karten zeigen jetzt den echten Kopfpreis je Monat (KomplettTicket 8,25 €, RollenTicket 4,08 €, PflichtTicket ab 1,49 €) statt der Teamsumme mit falscher "pro Person"-Etikette. Der Rechner ist an den Kopfpreis gekoppelt (PflichtTicket sinkt mit der Teamgröße). Reihenfolge: KomplettTicket · PflichtTicket · RollenTicket.
v1.41.0 – Stundeneinheit korrigiert + Regelwerke je Kurs
Die Kursliste nannte die Stundeneinheit falsch. Der Code verglich hours_unit gegen 'stunden'; in der Datenbank stehen Zeitstunden (176 Kurse) und unterrichtsstunden (5). Der Vergleich traf keinen von beiden — also stand bei allen Kursen "UE". Ein Kurs mit 2 Zeitstunden (120 Min.) erschien damit als "2 UE" (90 Min.). Wir haben unsere Kurse öffentlich kürzer dargestellt, als sie sind; bei Pflichtunterweisungen ist diese Zahl die Nachweisgrundlage.
Neu je Kurs: die Regelwerke mit Fassung — "Grundlage: TRBA 250 (Ausgabe November 2025) · BioStoffV (Fassung 2013)". Bewusst eine Tatsache, keine Prüfbehauptung: Campus Connect v3.171.0 hat "Rechtsstand geprüft" aus 355 Kursinhalten entfernt, weil es ein Stempel war. Wer die Fassung nennt, sagt etwas Nachprüfbares — und ein Wettbewerber auf der 2018er TRBA 250 kann diesen Satz nicht schreiben.
Quelle: public_bundle_courses (Campus Connect v3.175.0). Gepflegt unter Einstellungen → Kurse → Regelwerke und im Kursdialog.
v1.40.0 – Der Preis sagt, worauf er sich bezieht
Auf den Ticket-Seiten stand „348,00 € / Jahr" — direkt neben einem Rechner, der auf 10 Beschäftigte voreingestellt ist, aber ohne einen Halbsatz, der die beiden Zahlen zueinander ins Verhältnis setzt.
Ein Erstbesucher las daraus „348 € pro Kopf" und rechnete sich das PflichtTicket bis zu 15-fach zu teuer. Tatsächlich sind 348 € der Pauschalpreis für bis zu 15 Personen — 1,93 € je Person und Monat. Die Seite versteckte damit ausgerechnet ihr stärkstes Argument. Aufgelöst wurde es bislang nur in einer zugeklappten FAQ am Seitenende, die nicht einmal Zahlen nannte („bis zu einer bestimmten Teamgröße").
Neu
- Faktenbox: „ab 348,00 € / Jahr — für die ganze Einrichtung, bis 15 Beschäftigte" (Grenze aus
max_users, nicht hartkodiert) - Variantenzeile: „Gesamtpreis für alle 10 Beschäftigten · entspricht 29,00 € / Monat" + „das sind 2,90 € pro Person und Monat"
- Staffeltabelle „So rechnet sich das" unter dem Rechner — die Staffel stand vorher nirgends auf der Seite
- Rechner-Hinweis benennt, dass der Preis immer der Gesamtpreis fürs Team ist und nicht mit der Kopfzahl multipliziert wird
Warum alles abgeleitet und nichts hartkodiert ist
Nur das PflichtTicket hat überhaupt eine Pauschale. KomplettTicket (99 €/Person/Jahr) und RollenTicket (49 €/Person/Jahr) rechnen ab der ersten Person pro Kopf — ein hartkodiertes „für die ganze Einrichtung" wäre dort falsch und hätte das gespiegelte Missverständnis erzeugt. Darum liefert livento_cc_scope_note() den Bezug aus dem pricing_mode, und die Staffeltabelle rendert nur, wo es wirklich eine Staffel gibt.
Die neuen Textbausteine kommen wie Netto- und Steuerhinweis fertig formatiert vom Server — im Browser wird weiterhin kein Preis gerechnet.
Der FAQ-Text „Zahle ich pro Person oder pauschal?" ist parallel in
product_families.faqmit den echten Zahlen hinterlegt.
v1.39.0 – Hero-Band randlos ueber die volle Seitenbreite
Das Hero-Band auf den Ticket-Detailseiten (/e-learning/pflicht-ticket/, /komplett-ticket/, /rollen-ticket/) laeuft jetzt randlos ueber die ganze Seitenbreite, statt im 1200-Pixel-Container zu stecken. Der Inhalt im Band bleibt dabei exakt buendig zum Rest der Seite — geprueft von 390 bis 1920 Pixel Breite.
Warum das hier ueberhaupt Arbeit ist: Die Vorbildseite /foerdermoeglichkeiten/ steht auf Astras Full-Width-Template, ihr Container deckelt gar nicht erst — dort ist der Hero gratis randlos. Die Ticket-Seiten stehen auf dem normalen Container (ast-plain-container, 1200 Pixel) und muessen ausbrechen: margin-inline:calc(50% - 50vw) zieht das Band an die Raender, padding-inline:max(1.25rem, calc(50vw - 37.5rem)) holt den Inhalt wieder auf die 1200-Pixel-Spur.
Die Falle: 100vw zaehlt die Scrollbar mit, 100% nicht — auf Windows mit klassischer Scrollbar ragt das Band dadurch rund 15 Pixel ueber den Viewport und erzeugt Querscroll. Dagegen steht html{overflow-x:clip}. Bewusst clip und nicht hidden: hidden macht das Element zum Scroll-Container und bricht damit die klebende Faktenbox (position:sticky) und die Ankersprunge zum Preisrechner; clip kappt nur den Ueberstand. Untergrenze dafuer ist Safari 16 — darunter bleibt der Querscroll, das ist bewusst in Kauf genommen.
Verworfene Alternative: die drei Seiten auf das Full-Width-Template stellen (derselbe Mechanismus wie die Vorbildseite, ohne vw und ohne globale Regel) — haette einen manuellen Handgriff je Seite gebraucht.
Vollstaendiger Changelog: siehe readme.txt.
v1.38.0 – Hero-Band auf den Ticket-Seiten
Der Kopf der Ticket-Detailseiten (/e-learning/pflicht-ticket/, /komplett-ticket/, /rollen-ticket/) traegt jetzt dieselbe Bildsprache wie die Orientierungsseiten /kurse/ und /foerdermoeglichkeiten/: ein Band mit demselben warmen Verlauf, Eyebrow "E-Learning-Ticket", Ueberschrift in Qurova und CI-Gruen, Lead in derselben Groesse. Inhaltlich fehlte hier nichts — Ueberschrift, Claim, Beschreibung, Leistungen und Faktenbox stehen seit 1.36.0 — es fehlte die Fassung: alles lag als nackter Text auf Weiss. Die weisse Faktenbox setzt sich jetzt vom Verlauf ab.
Bewusst anders als die Orientierungsseiten: kein zentrierter, luftiger 80-Pixel-Hero und keine CTA-Buttons im Kopf. Wer auf einer Ticket-Seite landet, kam ueber /e-learning/ und will wissen, was drin ist und was es kostet — ein hoher Hero schoebe Preis und CTA unter die Falz. Die Faktenbox haelt beides schon oben.
Enthaelt ausserdem 1.37.0, das seinerzeit nie als Release ausgeliefert wurde: Die Danke-Seite versprach "gleich zwei E-Mails" — die zweite kam nie, seit Campus Connect v3.169.0 kommt EINE Mail mit Zugangsdaten und Team-Link zusammen. Diese Korrektur war bis jetzt nicht live.
Vollstaendiger Changelog: siehe readme.txt.