Über dieses Plugin
IDF QR-Codes löst zwei miteinander verwobene Aufgaben: Aus einer frei wählbaren URL wird ein QR-Code als SVG erzeugt, der sich problemlos drucken oder digital weiterverwenden lässt. Gleichzeitig wird die im QR-Code codierte Ziel-URL zur Laufzeit auf eine Landingpage, ein PDF oder eine externe Seite umgeleitet: änderbar, ohne dass der gedruckte Code neu erstellt werden muss.
So bleibt das Werbemittel gleich, die Weiterleitung ist jederzeit flexibel anpassbar. Jeder Scan wird mit Zeitstempel DSGVO-konform (ohne IP) protokolliert, sodass sich der Kampagnen-Erfolg ohne externes Tracking messen lässt.
Features
- Custom Post Type
idf_qr: Jeder QR-Code ist ein eigener Eintrag mit Titel, Beschreibung und Revisionen. - Zwei URLs pro Eintrag: QR-Ziel-URL (was der Code encodiert) und Weiterleitungs-URL (wohin geleitet wird). Die Weiterleitung lässt sich jederzeit ändern, ohne den gedruckten Code neu erstellen zu müssen.
- SVG-QR-Code-Generator: Vollständig server-seitig in PHP implementiert, ohne externe Abhängigkeiten. Unterstützt Byte-Mode, Versionen 1-10 und alle vier Fehlerkorrektur-Level (L/M/Q/H) mit penalty-basierter Maskenwahl.
- Live-Vorschau + Download: Im QR-Code-Editor steht eine Vorschau-Meta-Box mit direktem Download-Button. Der SVG-Dateiname entspricht dem Post-Slug.
- Farben und Formen: Globale Standardfarben und drei Formen in den Einstellungen: das Muster der Datenpunkte (Quadrat, Punkt, abgerundet, fließend, Raute), die Eckrahmen und die Eckpunkte (eckig, abgerundet, Tropfen, Außenecke, Kreis). Jeder QR-Code kann sie überschreiben; ohne eigene Wahl folgt er der Basis.
- Logo in der Mitte: Ein Logo aus der Mediathek in drei Größen, zentral als Standard und je QR-Code überschreibbar. Das Plugin stellt dafür die Fehlerkorrektur auf H und lässt rund um das Logo Platz; der SVG-Download bleibt eine einzige Datei.
- Request-Interception + 302-Redirect: Das Plugin hängt sich früh in die WordPress-Request-Verarbeitung und leitet die codierte URL per 302 auf die Weiterleitungs-URL um.
- Scan-Log mit Zeitstempel: Jeder Scan wird in der Tabelle
{prefix}idf_qr_scansmit UTC-Zeitstempel, User-Agent und Referrer erfasst (ohne IP-Adressen, DSGVO-konform ohne zusätzliche Einwilligung). - Statistik im Editor: Meta-Box pro QR-Code mit Gesamt/Heute/7 Tage/30 Tage, 30-Tage-Balkendiagramm und Liste der letzten 20 Scans.
- Dashboard: Übersicht aller QR-Codes, Gesamt-Scan-Zahlen und Quick-Access zu Liste und Neuanlage.
- Einstellungen: Standard-Farben, -Formen und -Logo, Fehlerkorrektur-Level, Modulgröße, Quiet-Zone, Scan-Log-Aufbewahrung in Tagen.
- Hilfe- und Deinstallations-Seite: Nach IDF-Standard mit optionaler Komplett-Datenlöschung beim Deinstallieren.
- Master-Key-Anbindung: Non-blocking Dependency-Check und automatische Update-Registrierung beim IDF Master-Key.
- Automatische Bereinigung: Täglicher Cron löscht Scan-Log-Einträge gemäß der konfigurierten Aufbewahrungsdauer (Default: 365 Tage).
Changelog
v1.11.0
Geändert
- Lange Inhalte bekommen einen Code statt der Fehlergrafik. Der Encoder reicht jetzt bis QR-Version 40 statt bis Version 10. Bei Fehlerkorrektur M passen damit 2331 Bytes statt 213. Bis hierher zeigte jeder längere Text die rote Grafik „QR-Fehler: Text zu lang“, auf thueringer-landkost.de 9 von 12 Team-Seiten, deren vCard-QR (IDF vCard) zwischen 217 und 301 Bytes hat.
- Codes, die schon in Version 10 passten, bleiben Modul für Modul gleich: gewählt wird weiter die kleinste passende Version.
- Ein Logo erscheint jetzt auch bei längeren Adressen, solange der Text mit Fehlerkorrektur H in Version 40 passt (1273 Bytes).
v1.10.0
Geändert
- Design-Box am Code zeigt erst den Standard. Folgt ein Code ganz den Einstellungen, steht dort nur „Standard verwenden“ mit Link zu den Einstellungen und der Knopf „Diesen QR-Code individualisieren“. Erst der Knopf zeigt Farben, Formen und Logo. Hat ein Code schon eigene Werte, ist das Panel gleich offen; „Wieder Standard verwenden“ klappt es zu.
- Wird zugeklappt gespeichert, fallen alle eigenen Design-Werte des Codes weg. Bis zum Speichern bleiben die Felder gefüllt, Auf- und Zuklappen verliert also nichts.
- Den Link zu den Einstellungen sieht nur, wer sie öffnen darf; die anderen lesen denselben Satz ohne Link.
Hinzugefügt
- Hinweis auf ungespeicherte Arbeit im Code-Editor. Ist etwas geändert und nicht gespeichert, steht unter dem Link zu den Einstellungen ein Hinweis, und beim Verlassen der Seite fragt der Browser nach. Gezählt wird, was beim Speichern ankäme: Aufklappen ohne eigene Wahl oder Zuklappen nach einer Wahl gilt nicht als Änderung.
v1.9.0
Hinzugefügt
- Logo in der Mitte des QR-Codes. Standard-Logo aus der Mediathek in den Einstellungen; am einzelnen Code „Standard“, „Eigenes Logo“ oder „Kein Logo“. Drei Größen, Klein, Mittel und Groß, für 15, 20 und 25 % der Code-Breite, Standard Mittel, am Code überschreibbar.
- Das freie Feld folgt dem Seitenverhältnis des Logos, mit einem Modul Abstand rundum in der Hintergrundfarbe. Ausrichtungsmuster darunter entfallen ganz; bei sehr kleinen Codes wird das Logo kleiner, statt Eckmarken oder Taktlinien zu berühren.
- Mit Logo steht die Fehlerkorrektur auf H. Passt die Adresse dafür nicht mehr in den Code, erscheint er ohne Logo, und die Vorschau sagt das.
- Das Logo steckt als data:-URI in der SVG-Datei, der Download bleibt eine einzige Datei. Erlaubt sind PNG, JPG, GIF, WebP, AVIF und SVG.
Geändert
- Codes ohne Logo zeichnen Byte für Byte wie in v1.8.0.
v1.8.0
Hinzugefügt
- Form „Außenecke“ für Eckrahmen und Eckpunkt: das Gegenstück zu „Tropfen“. Eckig, nur die Ecke, die vom Code nach außen zeigt, ist abgerundet; die drei übrigen bleiben eckig. Die Ausrichtungsmuster größerer Codes haben keine Richtung und bleiben bei „Außenecke“ ganz eckig.
Geändert
- Alle bisherigen Formen zeichnen Byte für Byte wie in v1.7.0.
v1.7.0
Hinzugefügt
- Form „Tropfen“ für Eckrahmen und Eckpunkt: außen abgerundet wie „Abgerundet“, nur die Ecke zur Mitte des Codes bleibt eckig. Bei jeder der drei Eckmarken zeigt sie nach innen. Die Ausrichtungsmuster größerer Codes haben keine Richtung und sind bei „Tropfen“ rundum abgerundet.
v1.6.0
Hinzugefügt
- Formen für Muster, Eckrahmen und Eckpunkt. Muster: Quadrat, Punkt, Abgerundet, Fließend, Raute. Eckrahmen außen und Eckpunkt innen: Eckig, Abgerundet, Kreis. Auswahl als Kacheln mit Vorschaubild, wie die Farben zentral in den Einstellungen und am einzelnen Code überschreibbar; „Standard“ folgt der Einstellung.
- Bei Punkt und Raute hebt das Plugin die Fehlerkorrektur von L oder M auf Q an. Die Ausrichtungsmuster größerer Codes zeichnet es geschlossen in der Form der Eckrahmen. Beides hält die Codes für Decoder lesbar.
Geändert
- Im Standard (alles eckig) ist das SVG Byte für Byte dasselbe wie bisher.
Behoben
- QR-Codes ab Version 7 waren unlesbar, bei Fehlerkorrektur M also Adressen ab rund 105 Zeichen, bei H schon ab gut 60. Die Zählung der Funktionsmodule zog die Überschneidung von Ausrichtungsmuster und Taktlinie doppelt ab; daraus ergab sich ein Codewort zu viel. Codes bis Version 6 bleiben unverändert.
v1.5.0
Hinzugefügt
- Öffentliche Methode
IDF_QR_Codes_Source::create_for_post( $source_id ). Legt zu einer Seite einen QR-Code an, genau wie der Knopf „QR-Code erzeugen“ in der Bearbeiten-Ansicht: Pfad/q/{slug}, Weiterleitung auf den Permalink, Verknüpfung zur Seite, Titel mit laufender Nummer ab dem zweiten Code. Rückgabe ist die ID des QR-Codes oder einWP_Error, wenn die Seite fehlt, noch nicht gespeichert ist oder zu einem Inhaltstyp ohne QR-Box gehört. Berechtigungen prüft der Aufrufer.
Geändert
- Der Knopf in der Bearbeiten-Ansicht nutzt dieselbe Methode. Am Ergebnis ändert sich nichts.
IDF_QR_Codes_Sourcewird jetzt auf jedem Request geladen, nicht nur im Admin. Ein Aufruf über REST, wie ihn der MCP-Adapter macht, fand die Klasse vorher nicht. Ihre Hooks (Meta-Box, AJAX, Hinweise) hängen weiter nur im Admin.
Warum
- Der IDF MCP-Adapter soll QR-Codes anlegen können, ohne die Logik nachzubauen (idf-mcp-adapter #73). Anlass waren elf neue Team-Einträge auf thueringer-landkost.de, für die es nur den Weg über elf Klicks im Backend gab.
v1.4.5
Behoben
- Der Dependency-Checker heisst jetzt
IDF_QR_CODES_Dependency_Checker. Der geteilte KlassennameIDF_Dependency_Checker, den fast alle IDF-Plugins mitbringen, wird nicht mehr angefasst. Die eigene Kopie war durch ihre bedingte Deklaration selbst geschuetzt, wirkte aber als Ausloeser: sobald sie die geteilte Klasse zuerst deklarierte, starb die frueh gebundene Kopie eines anderen IDF-Plugins. Sobald ein zweites IDF-Plugin dieselbe Klasse deklarierte, starb jeder Request mit "Cannot declare class IDF_Dependency_Checker" - auf k1.de hat das am 03.09.2026 zweimal die ganze Website lahmgelegt, weil die Aktivierung durchlief und der Fehler erst im Folge-Request entstand. Die Installationsreihenfolge der IDF-Plugins ist damit ohne Bedeutung.
v1.4.4
Behoben
- Die Reiterleiste auf der QR-Code-Liste und im QR-Code-Editor stand ueber der Ueberschrift statt darunter - sie hing an
all_admin_notices, und der Hook rendert oberhalb der<h1>. Dort sieht sie aus wie eine Systemmeldung. Sie haengt jetzt am Filterviews_edit-{cpt}(Liste) und an der Actionedit_form_top(Editor); beide laufen unterhalb des Seitenkopfs.
v1.4.3
Behoben
- Die Seitenleiste blieb auf den Tiefseiten weiterhin zugeklappt. Der
parent_file-Filter aus v1.4.2 kann das nicht leisten:menu-header.phpruft erst die Filter auf und danachget_admin_page_parent(), und die setzt$parent_fileals Nebeneffekt neu. Das Ausblenden läuft jetzt über den einzigen Mechanismus, der alle drei Anforderungen erfüllt - unsichtbar, per URL erreichbar, Menü aufgeklappt: die Tiefseiten werden unter dem echten Eltern-Menü registriert und aufadmin_headmitremove_submenu_page()wieder aus der Navigation genommen. Zu diesem Zeitpunkt ist der Hook-Name bereits aufgelöst und die Seitenleiste noch nicht gerendert. Der versteckte Eltern-Slugidf-qr-codes-reiterentfällt ersatzlos. - Die Filter
parent_fileundsubmenu_filebleiben:submenu_filemarkiert den Eintrag,parent_filedeckt die CPT-Liste und den CPT-Editor ab, dieget_admin_page_parent()gar nicht erst in$submenufindet. An deren Verhalten ändert sich nichts. - URLs, Berechtigungen und die Reiterleiste bleiben unverändert.
v1.4.2
Behoben
- Auf den Reiter-Seiten blieb die Seitenleiste zugeklappt und kein Eintrag war markiert. Man sah beim Arbeiten nicht mehr, in welchem Plugin man gerade ist. Ursache: die Tiefseiten hängen am versteckten Eltern-Slug
idf-qr-codes-reiter, undget_admin_page_parent()liefert dort genau diesen Wert - ein Menü dazu gibt es nicht, also klappt WordPress nichts auf. Die vorhandenen Filterparent_fileundsubmenu_filedecken jetzt zusätzlich die eigenen Plugin-Seiten ab: aufgeklappt wird IDF Home (ohne IDF Home das eigene Top-Level-Menü), markiert der Eintrag "QR-Codes". Auf der Einstiegsseite und auf den CPT-Screens ändert sich nichts.
v1.4.1
Behoben
- Die Tiefseiten waren per URL nicht mehr aufrufbar und antworteten mit „Sie haben nicht die Berechtigung, auf diese Seite zuzugreifen". Ursache war
remove_submenu_page(): es löscht den Eintrag aus$submenu, und genau dort sucht WordPress beim Direktaufruf überget_admin_page_parent()den Eltern-Slug, um den Hook-Namen zu bilden. Ohne den Eintrag fällt der Name aufadmin_page_...zurück und passt nicht mehr zu dem, unter dem der Callback hängt. Die Seiten hängen jetzt an einem Eltern-Slug, den es als Menü gar nicht gibt (idf-qr-codes-reiter) - dadurch stehen sie nirgends in der Navigation und bleiben trotzdem erreichbar. - Gefunden beim Smoke-Test: die Reiter selbst funktionierten, der Aufruf einer Seite über ihre eigene URL nicht.
v1.4.0
Geaendert
- Ein Menueeintrag statt fuenf. Das Plugin haengt jetzt unter IDF Home; Dashboard, QR-Code-Liste, Einstellungen, Hilfe und Deinstallation sind Reiter. Die URLs bleiben unveraendert, alte Lesezeichen funktionieren weiter. Grund: 43 Plugins mit eigenem Top-Level-Menue hatten die WordPress-Seitenleiste unbenutzbar gemacht.
- Der CPT
idf_qrhat keinen eigenen Menuepunkt mehr (show_in_menuvonidf-qr-codesauffalse). WordPress haengt CPT-Menues nur an Top-Level-Slugs; nach dem Umbau waere die Liste lautlos verschwunden. Sie ist jetzt ein Reiter. - Ohne IDF Home macht das Plugin weiterhin sein eigenes Top-Level-Menue auf. Gleiche Oberflaeche, nur die Aufhaengung wechselt.
Hinzugefuegt
- Reiterleiste auch auf QR-Code-Liste und Editor. Ohne sie waere die Liste nach dem Umbau eine Sackgasse ohne Rueckweg.
- Die Reiterleiste blendet Seiten aus, fuer die dem Benutzer die Berechtigung fehlt.
Beachten
- Redakteure (
edit_posts, ohnemanage_options) sehen in der Seitenleiste "IDF Home" und landen beim Klick direkt auf den QR-Codes. Das ist WordPress-Standardverhalten: ein Top-Level-Menue bleibt sichtbar, sobald ein Untereintrag zugaenglich ist, und der Parent-Link zeigt dann dorthin. Die Berechtigungen selbst sind unveraendert.
v1.3.0
Hinzugefuegt
- Self-Target: Ein QR-Code darf jetzt auf seine eigene Seite zeigen (QR-Ziel-Pfad identisch mit der Weiterleitungs-URL). Beim Scan wird der Aufruf geloggt und die Seite direkt gerendert - keine Weiterleitung, kein Loop. Bisher war das blockiert bzw. fuehrte zum Umleitungsfehler.
- Neue Action
idf/qr-codes/self_target_scan(Parameter: Post-ID, Ziel-URL), die nach dem Scan-Logging eines Self-Target-QR feuert.
Geaendert
- Der Endlosschleifen-Schutz blockiert kollidierende Pfade nicht mehr. Speichern (CPT-Maske und Inline-Editor) uebernimmt den Pfad und zeigt nur einen Info-Hinweis. Der Loop wird zur Laufzeit verhindert (Seite rendern statt weiterleiten).
- Self-Target-QR-Codes loggen jeden Aufruf ihrer Adresse als Scan (auch organischen Traffic), da QR-Ziel und Seite dieselbe URL sind. Hinweis dazu in Box, Hilfe und beim Speichern. Fuer getrennte Scan-Zahlen weiterhin einen eigenen
/q/-Pfad nutzen (bleibt der Default beim Erzeugen).
v1.2.0
Behoben
- Umleitungsfehler (ERR_TOO_MANY_REDIRECTS) beim Erzeugen eines QR-Codes aus einer Seite heraus. Der per Button angelegte QR-Code bekam bisher den Pfad der Seite selbst als QR-Ziel-Pfad - identisch mit dem Weiterleitungsziel. Dadurch leitete die Seite auf sich selbst weiter (Endlosschleife). Neu angelegte QR-Codes bekommen jetzt einen eindeutigen, kollisionsfreien
/q/{slug}-Pfad. Der Erzeugen-Pfad durchlaeuft denselben Kollisions-Schutz wie das manuelle Speichern. - Laufzeit-Schutz im Redirect-Handler: zeigt eine Weiterleitung auf denselben On-Site-Pfad wie der Aufruf, wird NICHT weitergeleitet. Dadurch werden bereits gespeicherte, kollidierende Alt-QR-Codes entschaerft - die betroffene Seite ist sofort wieder erreichbar, ohne dass der QR-Code manuell korrigiert werden muss.
Hinzugefuegt
- Mehrere QR-Codes pro Seite. Die 1:1-Beschraenkung ist aufgehoben - pro Seite koennen jetzt beliebig viele QR-Codes erzeugt werden (z. B. je Kampagne, Flyer oder Medium), jeder mit eigenem Pfad und eigener Scan-Statistik.
- Die "QR-Code"-Box auf der Seite listet jetzt ALLE verknuepften QR-Codes mit Titel, Vorschau, Pfad-Editor und Statistik. Ein Button "Weiteren QR-Code erzeugen" legt zusaetzliche Codes an.
- Neue Hilfsfunktionen
idf_qr_codes_path_in_use()(Pfad-Belegung pruefen) undidf_qr_codes_generate_unique_path()(eindeutigen/q/-Pfad erzeugen). - Neue Methode
IDF_QR_Codes_Source::find_qrs_for_source()(1:n).find_qr_for_source()bleibt als BC-Wrapper erhalten.
Geaendert
- Permalink-Aenderungs-Notice und das Loesen der Verknuepfung beim Loeschen einer Seite beruecksichtigen jetzt alle verknuepften QR-Codes statt nur des ersten.
- Hilfe- und Dashboard-Texte an das neue Verhalten (mehrere Codes, vorbelegter
/q/-Pfad) angepasst.
v1.1.2 - 2026-04-30
Hinzugefuegt
- Self-Healing-Lookup zwischen Quell-Seite und QR-Code: Auch QR-Codes, die manuell ueber die CPT-Maske angelegt wurden (ohne
_idf_qr_source_post_id), werden in der "QR-Code"-Box auf der Quell-Seite und in der CPT-Spalte "Quell-Seite" jetzt korrekt erkannt - anhand der Weiterleitungs-URL. Beim ersten erfolgreichen Lookup wird die Verknuepfung als Meta nachgetragen, damit kuenftige Aufrufe den schnellen Pfad gehen. - Auto-Link beim Speichern eines QR-Codes: Zeigt die Weiterleitungs-URL auf eine Seite dieser Website und ist noch keine Verknuepfung gesetzt, wird
_idf_qr_source_post_idautomatisch geschrieben. - Neue Hilfsfunktion
idf_qr_codes_resolve_source_for_qr( int $qr_id ): intund Filteridf/qr-codes/resolve_source_for_qrfuer eigene Aufloesungs-Logik (z. B. externe Domains, die intern gemappt werden).
v1.1.1 - 2026-04-30
Geaendert
- Master-Key-Referenzen auf IDF Home / IDF Key-Server umgestellt: Bootstrap ruft
idf_home_register_plugin()stattidf_master_key_register_plugin(). Dependency-Checker prueftidf_home_register_plugin()undIDF_HOME_VERSIONund zeigt "IDF Home" in der Admin-Notice. Mindestversion: IDF Home 2.0.0. - README, ARCHITECTURE und Dependency-Checker-Doku auf neue Namen aktualisiert.
v1.1.0 - 2026-04-30
Hinzugefuegt
- Meta-Box "QR-Code" auf jedem oeffentlichen Post-Type (Seiten, Beitraege, eigene CPTs). Mit "QR-Code erzeugen"-Button legt sie einen verknuepften QR-Code an, der auf diese Seite weiterleitet.
- Inline-Editor fuer den codierten Pfad direkt aus der Source-Box (AJAX, Live-SVG-Update).
- Verknuepfung Quell-Seite zu QR-Code via Post-Meta
_idf_qr_source_post_id. Sidebar-Box im QR-Editor zeigt verknuepfte Seite, neue Spalte "Quell-Seite" in der CPT-Liste. - Link-Health-Check: taeglicher Cron prueft alle Weiterleitungs-URLs per HEAD-Request. Spalte "Status" in der CPT-Liste mit OK / Nicht erreichbar / Ungeprueft. On-Demand-Button pro Eintrag und Bulk-Aktion "Status pruefen".
- Endlosschleifen-Schutz: Speichert keinen Pfad, der mit der Pfad-Komponente der Weiterleitungs-URL identisch ist (nur bei gleicher Domain). Admin-Notice mit Loesungsvorschlag.
- Admin-Notice bei Permalink-Aenderung der Quell-Seite mit Hinweis auf den verknuepften QR-Code.
- Neue Hooks:
idf/qr-codes/source_post_types(Filter),idf/qr-codes/source_qr_created(Action),idf/qr-codes/health_check_url(Filter),idf/qr-codes/health_check_result(Action). - Neuer Cron
idf_qr_codes_daily_health_check, registriert bei Aktivierung.
Geaendert
- Admin-Assets (CSS/JS) werden zusaetzlich auf Editor-Screens oeffentlicher CPTs geladen, damit die Source-Box funktioniert.
v1.0.0
Hinzugefuegt
- Custom Post Type
idf_qrfuer QR-Code-Verwaltung. - Pro Eintrag zwei URLs: QR-Ziel-URL (was der Code encodiert) und Weiterleitungs-URL.
- Request-Interception auf
parse_requestmit 302-Weiterleitung und Scan-Logging. - Server-seitiger QR-Code-Generator (Byte-Mode, Versionen 1-10, alle EC-Level, Penalty-basierte Maskenwahl) mit SVG-Ausgabe.
- Meta-Box "QR-Code" im Editor mit Live-Vorschau und Download-Button (SVG).
- Farbsteuerung: globale Standardfarben in den Einstellungen, pro QR-Code ueberschreibbar via WP-Color-Picker.
- Scan-Log in eigener Tabelle
{prefix}idf_qr_scansmit Zeitstempel, User-Agent und Referrer (keine IP, DSGVO-konform). - Dashboard mit Gesamtzahlen, Statistik-Meta-Box pro QR-Code (Gesamt/Heute/7 Tage/30 Tage), 30-Tage-Balkendiagramm, Liste der letzten 20 Scans.
- Settings-Seite: Standard-Farben, EC-Level, Modulgroesse, Quiet-Zone, Scan-Log-Aufbewahrung.
- Hilfe-Seite und Deinstallations-Seite nach IDF-Standard.
- Master-Key-Anbindung (non-blocking) fuer automatische Updates.
- Taeglicher Cron zur Bereinigung alter Scan-Log-Eintraege.
- Custom-Spalten in der CPT-Liste: QR-Ziel, Weiterleitung, Scans.