Livento Kurskatalog (nativ) releasesself-updates
Nativer Kurskatalog aus Campus Connect fuer WordPress (Liste, Detailseiten, Filter, Suche, Sitemap)
by Livento – Privates Bildungsinstitut für Pflege und Gesundheit UG (haftungsbeschränkt) · github.com/christiankarlconsulting/livento-kurskatalog · website
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/christiankarlconsulting/livento-kurskatalog/releases/download/v1.46.0/livento-kurskatalog.zipShips its own WordPress updater (Plugin Update Checker), so new versions show up under Dashboard → Updates.
Readme
=== Livento Kurskatalog === Contributors: livento Requires at least: 6.0 Tested up to: 6.7 Requires PHP: 7.4 Stable tag: 1.46.0 License: Proprietär
Rendert den oeffentlichen Kurskatalog aus Campus Connect nativ in WordPress.
== Changelog ==
= 1.46.0 =
- 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 Haekchen haengen koennte. Ein Haekchen in der Mediathek bleibt auf Kursbilder folgenlos.
- Gepflegt wird die Kennzeichnung darum in Campus Connect (ab v3.220.0): Oeffentliche Kurse -> Kurs bearbeiten -> Basis, Haekchen unter dem Bild. Das Plugin liest sie ueber 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 haenge der Katalog an einem Stylesheet, das nur geladen wird, solange in der Mediathek mindestens ein Bild angehakt ist.
- Der Text der Plakette laesst sich ueber den Filter livento_cc_ki_text aendern.
= 1.45.1 =
- Eigener Reiter "Dozenten" im Plugin-Backend. Bis hier war der Dozenten-Teil nur ein Einstellungsfeld - wer wissen wollte, WARUM jemand nicht auf der Seite steht, fand im Plugin keinen Anhaltspunkt.
- Der Reiter zeigt: Anzahl freigegebener Profile, Tabelle mit Name, Funktionsbezeichnung, Foto-Status und Stichworten, den Shortcode zum Kopieren, die Einrichtungsschritte - und die vollstaendige Liste der Bedingungen, unter denen ein Profil ueberhaupt erscheint, samt Hinweis, dass die Ursache immer in Campus Connect liegt und nie im Plugin.
- Warnung bei null freigegebenen Profilen, Hinweis bei weniger als drei (eine Personenseite mit einem einzigen Eintrag wird von Suchmaschinen als duenn bewertet).
- [livento_dozenten] steht jetzt in der Shortcode-Uebersicht, und die Anleitung hat einen eigenen Abschnitt 8 dazu.
- Reine Backend-Ergaenzung - an der Ausgabe auf der Website aendert sich nichts.
= 1.45.0 =
- Dozentinnen und Dozenten werden sichtbar. Neuer 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 - er funktioniert auf jeder Seite, auf die er gesetzt wird. Es gibt keine Slug-Konstante, keine Rewrite-Regel und keine Detailseiten je Dozent: einzelne duenne Personenseiten waeren eine SEO-Last, kein Gewinn.
- Die Verlinkung vom Kurs zur Dozentenseite haengt an der neuen Option "Dozentenseite" (Tab Einstellungen). Ist sie leer, wird ohne Link gerendert - ein toter Link entsteht nie, auch nicht zwischen Plugin-Update und Seitenanlage.
- Profile OHNE Foto erscheinen trotzdem, in einer eigenen Textdarstellung mit farbiger Kante statt als Karte mit leerem Bildbereich.
- Wer erscheint, entscheidet allein Campus Connect: Der Dozent muss dort eingewilligt UND die Institutsleitung freigegeben haben. Das Plugin filtert nichts nach; die View public_instructors liefert nur freigegebene Profile und nur sieben Spalten (nie E-Mail, Telefon, Adresse, Bankdaten). Ist niemand freigegeben, gibt der Shortcode nichts aus.
- Schema.org: erstmals stabile Entitaeten. Bis hier trug KEINE Entitaet im Plugin eine @id - jede Nennung war fuer eine Suchmaschine ein eigenes Objekt. Bei Personen ist das folgenreich: Ein Dozent erscheint auf der Dozentenseite UND auf jeder seiner Kursseiten, ohne @id also als ebenso viele verschiedene Menschen. Person und Organisation tragen jetzt feste Kennungen; das id-Attribut der Karte traegt dasselbe Fragment, die @id zeigt also auf ein real vorhandenes Element.
- Auf Kursseiten steht bewusst nur eine schlanke Personen-Referenz ohne Langtext und Fachgebiete - denselben Bio-Text auf mehreren Kursseiten zu wiederholen bringt keinen Aussagewert; die @id verbindet die Nennung mit dem vollstaendigen Knoten.
- Kurs-provider und Dozenten-worksFor zeigen jetzt auf denselben Organisationsknoten statt auf zwei anonyme Objekte.
- Titel, Meta-Description und Canonical der Dozentenseite kommen wie bei jeder normalen WordPress-Seite aus Rank Math - das Plugin greift dort nicht ein, weil es anders als beim Katalog keine virtuellen URLs erzeugt.
= 1.44.0 =
- Mehrtaegige Weiterbildungen zeigen auf der Kursseite jetzt die Unterrichtszeiten und Wochentage. Bisher war nur ein Start-/Enddatum sichtbar - weder Uhrzeiten noch die Wochentage, an denen Unterricht ist. Interessenten konnten dadurch nicht einschaetzen, ob ein Kurs neben Beruf/Alltag machbar ist.
- Neu in der Faktenbox "Auf einen Blick": eine abgeleitete Zusammenfassung (z. B. "Mo & Mi · 17:00-20:15 Uhr, dazu einzelne Sa 08:30-15:30 Uhr"). Im Kurstext ein eigener Abschnitt "Unterrichtszeiten & Termine" mit einer aufklappbaren Liste ALLER konkreten Termine (Datum + Uhrzeit).
- Die Zeiten werden automatisch aus den in Campus Connect hinterlegten Lektionsterminen abgeleitet (neue View-Spalte public_offerings.schedule) - nichts zusaetzlich zu pflegen. Gezaehlt werden nur Live-/Praesenztermine (Ganztag/Halbtag/Abendkurs/Wochenende); flexible Selbstlernphasen und externes Praktikum bleiben bewusst aussen vor.
- Zusaetzlich als schema.org courseSchedule (byDay + Start-/Endzeit) im courseInstance-JSON-LD - hilft Google Rich Results und KI-Suchmaschinen, den Unterrichtsrhythmus zu verstehen.
= 1.43.0 =
- Testzugang ueber die Ticketseite anfragen: interessierte Einrichtungen fordern einen Testzugang direkt auf der Ticketseite an; die Anfrage landet in Campus Connect und wird dort mit einem Klick freigegeben.
= 1.42.0 =
- Die Tarif-Karten auf /e-learning/ nannten den Gesamtpreis fuer 20 Beschaeftigte, hefteten aber "pro Person" darunter — die Teamsumme las sich damit wie ein Kopfpreis, also das 20-Fache des tatsaechlichen. Aus 99 € pro Person und Jahr (KomplettTicket) wurde auf der Karte "1.980 € pro Jahr · pro Person", aus 49 € (RollenTicket) "980 € pro Jahr · pro Person". Jetzt zeigt jede Karte den echten Kopfpreis je Monat: KomplettTicket 8,25 €, RollenTicket 4,08 €, PflichtTicket "ab 1,49 €" (Pauschale/Staffel, haengt an der Teamgroesse).
- Der Rechner ist an die Kopfpreise gekoppelt: der Erstaufbau zeigt den "ab"-Preis, nach Eingabe der Teamgroesse den EXAKTEN Kopfpreis (PflichtTicket sinkt 1,93 → 1,79 → 1,49; Komplett/Rollen bleiben konstant). Die grosse absolute Jahressumme faellt weg — sie schreckte nur ab, statt zu ueberzeugen.
- Reihenfolge der Karten: KomplettTicket links, PflichtTicket in die Mitte (Anker-Position), RollenTicket rechts. Nur die Schaufenster-Reihenfolge; die kanonische Sortierung in der Datenbank bleibt unangetastet.
- Kopfpreis = Teamsumme / Kopfzahl, weiterhin serverseitig gerechnet — im Browser wird kein Preis gerechnet, damit keine zweite Preis-Mathematik entsteht.
= 1.41.0 =
- Die Kursliste nannte die Stundeneinheit falsch: Der Code verglich hours_unit gegen 'stunden', in der Datenbank stehen aber '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 oeffentlich kuerzer dargestellt, als sie sind. Bei Pflichtunterweisungen ist diese Zahl die Nachweisgrundlage.
- Neu je Kurs: die Regelwerke, auf denen er beruht, mit Fassung - z. B. 'Grundlage: TRBA 250 (Ausgabe November 2025) - BioStoffV (Fassung 2013)'. Das ist bewusst eine Tatsache, keine Pruefbehauptung: Campus Connect v3.171.0 hat 'Rechtsstand geprueft' aus 355 Kursinhalten entfernt, weil es ein Stempel war. Wer die Fassung nennt, sagt etwas Nachpruefbares - und ein Wettbewerber auf der 2018er TRBA 250 kann diesen Satz nicht schreiben.
- Quelle ist public_bundle_courses (Campus Connect v3.175.0); gepflegt wird unter Einstellungen > Kurse > Regelwerke und im Kursdialog.
= 1.40.0 =
- Der Preis auf den Ticket-Seiten sagt jetzt, WORAUF er sich bezieht. Bis hier stand dort "348,00 € / Jahr" — direkt neben einem Rechner, der auf 10 Beschaeftigte voreingestellt ist, aber ohne einen Halbsatz, der die beiden Zahlen zueinander ins Verhaeltnis setzt. Ein Erstbesucher las daraus "348 € pro Kopf" und rechnete sich das PflichtTicket bis zu 15-fach zu teuer. Tatsaechlich sind 348 € der Pauschalpreis fuer bis zu 15 Personen, also 1,93 € je Person und Monat — die Seite versteckte damit ausgerechnet ihr staerkstes Argument.
- Die Faktenbox nennt die Bezugsgroesse direkt am Einstiegspreis: "ab 348,00 € / Jahr — fuer die ganze Einrichtung, bis 15 Beschaeftigte".
- Die Variantenzeile bindet den Betrag an die Kopfzahl aus dem Rechner: "Gesamtpreis fuer alle 10 Beschaeftigten · entspricht 29,00 € / Monat", darunter "das sind 2,90 € pro Person und Monat".
- Neue Tabelle "So rechnet sich das" unter dem Rechner mit der vollstaendigen Staffel (bis 15 pauschal, 16-50, 51-150, ab 151 individuell). Die Staffel stand vorher NIRGENDS auf der Seite — die einzige Erklaerung war eine zugeklappte FAQ, die selbst keine Zahlen nannte.
- Der Rechner-Hinweis sagt jetzt ausdruecklich, dass der angezeigte Preis immer der Gesamtpreis fuers ganze Team ist und nicht mit der Kopfzahl multipliziert wird.
- Alles aus den Staffeln abgeleitet, nichts hartkodiert — und das ist keine Kosmetik: Nur das PflichtTicket hat ueberhaupt eine Pauschale. KomplettTicket (99 €/Person/Jahr) und RollenTicket (49 €/Person/Jahr) rechnen ab der ERSTEN Person pro Kopf und bekommen darum "pro Person"; ein hartkodiertes "fuer die ganze Einrichtung" waere dort falsch gewesen. Die Staffeltabelle rendert nur, wo es wirklich eine Staffel gibt.
- Bei genau einer Person entfaellt die Kopfpreis-Zeile: Sie wuerde nur den Monatsbetrag darueber wiederholen und beim PflichtTicket ausgerechnet die hoechste Kopfzahl der Staffel plakatieren, obwohl es bei einer Person keinen Pauschalvorteil zu zeigen gibt.
- Die neuen Textbausteine kommen wie Netto- und Steuerhinweis fertig formatiert vom Server. Im Browser wird weiterhin kein Preis gerechnet — sonst gaebe es eine zweite Preis-Mathematik, die auseinanderlaufen kann.
= 1.39.0 =
- Das Hero-Band auf den Ticket-Detailseiten 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).
- Zur Einordnung, 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 (1200 Pixel) und muessen ausbrechen.
- DIE FALLE dabei: 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 auf jeder Ticket-Seite. Dagegen steht html{overflow-x:clip} — bewusst clip und NICHT hidden: hidden macht das Element zum Scroll-Container und bricht damit die klebende Faktenbox und die Ankersprunge zum Preisrechner. clip kappt nur den Ueberstand und laesst beides heil. 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, ganz ohne vw und ohne globale Regel). Haette einen manuellen Handgriff je Seite gebraucht.
= 1.38.0 =
- Der Kopf der Ticket-Detailseiten 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, statt weiss auf weiss zu stehen.
- BEWUSST ANDERS als die Orientierungsseiten: kein zentrierter, luftiger 80-Pixel-Hero und keine CTA-Buttons im Kopf. /kurse/ und /foerdermoeglichkeiten/ sind Seiten zum Stoebern, dort braucht der Besucher zuerst Einordnung. Die Ticket-Seiten sind Entscheidungsseiten — wer hier 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, ein zweiter CTA im Kopf waere nur eine Dublette daneben.
- Kein Full-Bleed ueber den 100vw-Trick: der bricht in Containern mit overflow und erzeugt bei sichtbarer Scrollbar Querscroll. Das Band fuellt den Theme-Container und ist mit abgerundeten Ecken abgesetzt.
- Die Reihenfolge auf schmalen Schirmen bleibt wie mit 1.36.0 eingerichtet — die Faktenbox steht vor dem Fliesstext, Titel und Claim davor.
= 1.37.0 =
- Die Danke-Seite nach dem Kauf sagte die Unwahrheit: "Sie erhalten gleich zwei E-Mails". Die zweite gab es nie — das Passwort wurde mangels Platzhalter in der Vorlage verworfen. Seit Campus Connect v3.169.0 kommt EINE Mail, die Zugangsdaten und Team-Link zusammen enthaelt; der Text sagt das jetzt auch.
- Dazu der Hinweis, dass jede angelegte Person ihre Zugangsdaten automatisch bekommt und sofort startet: Die Kurse sind E-Learnings, es gibt keine Termine und keine Wartezeit.
- HINWEIS: 1.37.0 wurde seinerzeit nicht als Release ausgeliefert — die Korrektur war also bis 1.38.0 nicht live. Beide Versionen gehen mit 1.38.0 zusammen raus.
= 1.36.0 =
- Die Ticket-Detailseiten bekommen die Struktur der Kursdetailseiten: zweispaltiger Hero mi
Read the full README on GitHub →
Releases
| Tag | Published | Asset | Downloads |
|---|---|---|---|
| v1.46.0 | Aug 31, 2026 | livento-kurskatalog.zip | 1 |
| v1.45.1 | Aug 26, 2026 | livento-kurskatalog.zip | 2 |
| v1.45.0 | Aug 26, 2026 | livento-kurskatalog.zip | 2 |
| v1.44.0 | Aug 1, 2026 | livento-kurskatalog.zip | 2 |
| v1.43.0 | Jul 23, 2026 | livento-kurskatalog.zip | 1 |
| v1.42.0 | Jul 17, 2026 | livento-kurskatalog.zip | 2 |
| v1.41.0 | Jul 17, 2026 | livento-kurskatalog.zip | 2 |
| v1.40.0 | Jul 16, 2026 | livento-kurskatalog.zip | 1 |
| v1.39.0 | Jul 16, 2026 | livento-kurskatalog.zip | 2 |
| v1.38.0 | Jul 16, 2026 | livento-kurskatalog.zip | 2 |
| v1.36.0 | Jul 16, 2026 | livento-kurskatalog.zip | 1 |
| v1.35.0 | Jul 16, 2026 | livento-kurskatalog.zip | 1 |
| v1.34.0 | Jul 16, 2026 | livento-kurskatalog.zip | 1 |
| v1.33.0 | Jul 15, 2026 | livento-kurskatalog.zip | 1 |
| v1.32.0 | Jul 15, 2026 | livento-kurskatalog.zip | 1 |
| v1.29.1 | Jul 14, 2026 | livento-kurskatalog.zip | 3 |
| v1.29.0 | Jul 14, 2026 | livento-kurskatalog.zip | 2 |
| v1.28.0 | Jul 13, 2026 | livento-kurskatalog.zip | 2 |
| v1.27.0 | Jul 1, 2026 | livento-kurskatalog.zip | 1 |
| v1.26.1 | Jun 30, 2026 | livento-kurskatalog.zip | 1 |
| v1.26.0 | Jun 30, 2026 | livento-kurskatalog.zip | 2 |
| v1.25.0 | Jun 24, 2026 | livento-kurskatalog.zip | 1 |
| v1.24.0 | Jun 23, 2026 | livento-kurskatalog.zip | 1 |
| v1.23.0 | Jun 21, 2026 | livento-kurskatalog.zip | 1 |
| v1.22.0 | Jun 18, 2026 | livento-kurskatalog.zip | 2 |