Beschreibung

Ü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_scans mit 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 Klassenname IDF_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 Filter views_edit-{cpt} (Liste) und an der Action edit_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.php ruft erst die Filter auf und danach get_admin_page_parent(), und die setzt $parent_file als 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 auf admin_head mit remove_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-Slug idf-qr-codes-reiter entfällt ersatzlos.
  • Die Filter parent_file und submenu_file bleiben: submenu_file markiert den Eintrag, parent_file deckt die CPT-Liste und den CPT-Editor ab, die get_admin_page_parent() gar nicht erst in $submenu findet. 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, und get_admin_page_parent() liefert dort genau diesen Wert - ein Menü dazu gibt es nicht, also klappt WordPress nichts auf. Die vorhandenen Filter parent_file und submenu_file decken 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 über get_admin_page_parent() den Eltern-Slug, um den Hook-Namen zu bilden. Ohne den Eintrag fällt der Name auf admin_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_qr hat keinen eigenen Menuepunkt mehr (show_in_menu von idf-qr-codes auf false). 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, ohne manage_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) und idf_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_id automatisch geschrieben.
  • Neue Hilfsfunktion idf_qr_codes_resolve_source_for_qr( int $qr_id ): int und Filter idf/qr-codes/resolve_source_for_qr fuer 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() statt idf_master_key_register_plugin(). Dependency-Checker prueft idf_home_register_plugin() und IDF_HOME_VERSION und 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_qr fuer QR-Code-Verwaltung.
  • Pro Eintrag zwei URLs: QR-Ziel-URL (was der Code encodiert) und Weiterleitungs-URL.
  • Request-Interception auf parse_request mit 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_scans mit 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.
Info
  • Version: 1.4.5
  • Version vom: 3. September 2026
  • WordPress-Version: 6.0
  • Getestet bis WP-Version: 6.5
  • PHP-Version: 8.1
  • Kompatible Themes: alle
  • Erforderliche Plugins: keine
  • Mitwirkende: Joerg Martin