Ü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.
- Farbsteuerung: Globale Standardfarben in den Einstellungen, pro QR-Code überschreibbar via WordPress-Color-Picker.
- 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, 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.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.