Files
GDPR-Content-Blocker/gdpr-content-blocker
s4luorth 839c364758 chore: alle versionsangaben einheitlich auf 1.7.0 + readme aktualisiert
- Plugin: Header-Version + CB_VERSION -> 1.7.0
- readme.txt: Stable tag 1.7.0, Features aktualisiert (skript-blockierung,
  consent-shortcode, textausrichtung, ganzseitiger scan, kein weissraum, ...),
  changelog-eintrag 1.7.0 + upgrade notice
- Backend package.json -> 1.7.0
- Doku-beispiele (README.md, SPICKZETTEL.md, license-backend/README.md) auf
  1.7.0 angeglichen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 09:34:25 +02:00
..

=== GDPR Content Blocker ===
Contributors: lucasorth
Tags: dsgvo, gdpr, consent, iframe, datenschutz, gdpr-content-blocker
Requires at least: 6.0
Tested up to: 6.7
Requires PHP: 8.1
Stable tag: 1.7.0
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

DSGVO-konformer Consent-Blocker für externe iframes. Schlanke Alternative zu schweren Consent-Tools.

== Description ==

Content Blocker verhindert, dass externe Dienste (Google Maps, YouTube, OpenStreetMap, Bewerbungsportale etc.)
Daten übertragen, bevor der Nutzer aktiv eingewilligt hat. Kein iframe sendet vor dem Klick eine einzige
Anfrage an den Drittserver.

**Features:**

* Echtes Click-to-Load: vor der Einwilligung keine Verbindung zum Drittanbieter, keine Datenübertragung
* Granulare Einwilligung pro Dienst (localStorage, je ein Key pro Service-ID)
* Art. 13 DSGVO-konformer Platzhalter: Anbieter, Empfänger, Zweck, Drittlandhinweis, Datenschutzlink
* Drittanbieter-Skripte blockieren — auch per JavaScript nachgeladene (z. B. YouTube-/Vimeo-API, Tracking-Skripte), optional auch von der eigenen Domain
* Auto-Erkennung von iframes (server-seitig via DOMDocument) und JS-Einbettungen (Slider, Elementor-Videos inkl. e-youtube-/e-vimeo-Element, Gutenberg-oEmbed)
* Vorlagen für Google Maps, YouTube, OpenStreetMap, Vimeo (Ein-Klick, voll editierbar)
* Webseiten-Scan: durchsucht die gesamte Website (alle Seiten/Beiträge) und listet alle Drittanbieter-Ressourcen samt Fundseiten auf (erfordert Lizenz)
* Widerruf per Shortcode `[content_blocker_revoke]` (Art. 7 Abs. 3); Einwilligungs-Button `[content_blocker_consent]` für reine Skript-Dienste
* Platzhalter exakt so hoch wie sein Inhalt (kein Weißraum); das Element lädt nach der Einwilligung in Originalgröße
* Textausrichtung wählbar (mittig/links/rechts), Farben frei einstellbar, eigenes Custom-CSS; Theme überschreibt nichts
* Manueller Shortcode `[content_blocker id="google-maps"]...[/content_blocker]`
* Lizenz- und Update-Auslieferung über eigenen Server; Sprachen: Deutsch + Englisch
* Keine externen Abhängigkeiten, kein CDN, kein Composer
* PHP 8.1+, WordPress 6.0+

== Shortcodes ==

**Dienst blockieren:**
`[content_blocker id="google-maps"]<iframe src="https://maps.google.com/..." ...></iframe>[/content_blocker]`

**Widerruf für externe Inhalte (für Datenschutzerklärung):**
`[content_blocker_revoke]`
Rendert standardmäßig einen Text-Link. Betrifft nur die Freigabe externer
Einbettungen (nicht die Cookie-Einwilligung eines separaten Cookie-Plugins).
Optionen: `text="…"`, `style="link|button"`, `note="yes|no"`.

**Übersicht aller blockierten Dienste (für Datenschutzerklärung):**
`[content_blocker_services]`

**Einwilligungs-Button (für reine Skript-Dienste ohne sichtbaren Platzhalter):**
`[content_blocker_consent id="dienst-id" text="…" style="button|link"]`
Erteilt die Einwilligung für den angegebenen Dienst und lädt die Seite neu.
Die ID steht im Backend unter jedem Dienst (klein unter dem Namen).

== CSS-Klassen ==

| Klasse | Beschreibung |
|---|---|
| `.cb-blocker` | Wrapper / Platzhalter-Hintergrund |
| `.cb-blocker__inner` | Innerer Container (zentriert) |
| `.cb-blocker__text` | Hinweistext |
| `.cb-blocker__recipient` | Empfänger / Drittlandzeile |
| `.cb-blocker__purpose` | Zweck |
| `.cb-blocker__third-country` | Drittland-Warnhinweis |
| `.cb-blocker__privacy-link` | Link zur Anbieter-DSE |
| `.cb-blocker__button` | Lade-Button |
| `.cb-revoke-btn` | Widerrufs-Button |

CSS Custom Properties (via `:root`):
`--cb-text`, `--cb-bg`, `--cb-btn-bg`, `--cb-btn-text`, `--cb-btn-hover-bg`, `--cb-btn-hover-text`

Hinweis zur Spezifität: Die Plugin-Regeln sind unter `.cb-blocker` verschachtelt
(z. B. `.cb-blocker .cb-blocker__button`), damit Theme-Styles sie nicht überschreiben.
Ihr Custom-CSS wird DANACH geladen und überschreibt alles — verwenden Sie zur
Sicherheit denselben Präfix, z. B. `.cb-blocker .cb-blocker__button { ... }`.

== Updates ==

Updates werden über den eigenen Lizenzserver ausgeliefert und nur an Seiten mit
aktiver Lizenz angeboten. Der Update-Hinweis erscheint wie gewohnt unter
Plugins → Installierte Plugins. Ohne aktive Lizenz wird kein Update angeboten.

Veröffentlichung (für den Betreiber): Plugin-ZIP per Gitea-Actions (Tag `v*`) oder
manuell per curl an den Endpoint `POST /api/v1/releases` des Backends laden. Die
ZIP muss einen Ordner `gdpr-content-blocker/` auf oberster Ebene enthalten.

== Erkennung ==

* Server-seitig: iframes im initialen HTML werden anhand der Erkennungsmuster blockiert.
* Client-seitig (automatisch): per JavaScript nachgeladene iframes (z. B. Slider) sowie
  Elementor-Video-Widgets werden erkannt und durch den Platzhalter ersetzt.

== Bekannte Grenzen ==

* Client-seitige Erkennung ist „best effort": Bei per JS nachgeladenen iframes kann im
  Einzelfall ein bereits gestarteter Request nicht garantiert verhindert werden. Für
  maximale Rechtssicherheit den manuellen Shortcode verwenden.
* Bei Elementor-Videos mit Bild-Overlay kann das Vorschaubild (z. B. von ytimg.com) als
  CSS-Hintergrund bereits beim Laden angefragt werden. Empfehlung: in Elementor das
  Bild-Overlay deaktivieren oder ein eigenes Vorschaubild verwenden.

== Changelog ==

= 1.7.0 =
* Drittanbieter-Skripte blockieren (auch per JavaScript nachgeladene wie die YouTube-/Vimeo-API und Tracking-Skripte; optional auch von der eigenen Domain)
* Neuer Shortcode `[content_blocker_consent]` (Einwilligungs-Button für reine Skript-Dienste)
* Textausrichtung des Platzhalters wählbar (mittig/links/rechts)
* Werbe-Badge mit Link zur Produktseite (mit aktiver Unlimited-Lizenz ausblendbar)
* Verbesserte Elementor-Erkennung inkl. neuem e-youtube-/e-vimeo-Element; Video lädt nach Einwilligung in Originalgröße
* Webseiten-Scan deckt jetzt die gesamte Website ab (alle Seiten/Beiträge), parallele Abfrage
* Platzhalter exakt so hoch wie sein Inhalt (kein Weißraum mehr)
* Kein Nachladen von WordPress-Emoji-Grafiken mehr (s.w.org)
* Dienst-ID im Backend sichtbar; „Lizenz upgraden" öffnet eine vorausgefüllte E-Mail
* Plugin-Icon; diverse Darstellungs- und Hover-Korrekturen (Tabs, Button, Links)

= 1.2.0 =
* Shortcodes in eigenen Tab; „Über das Plugin"-Tab
* Belegte Domains als Liste mit Papierkorb; Lizenz-Status live aktualisiert
* Pfeil-Icon zum Ein-/Ausklappen; diverse UI-Korrekturen
* Cache-Busting der Admin-Skripte

= 1.1.0 =
* Vorlagen für Google Maps, YouTube, OpenStreetMap, Vimeo
* Client-seitige Erkennung (Elementor-Videos, per JS nachgeladene iframes)
* Webseiten-Scan mit Vorlagenerkennung und Quellseiten
* Dienste ein-/ausklappbar mit An-/Aus-Schalter
* Lizenz- und Update-Auslieferung über eigenen Server
* Sprachen: Deutsch + Englisch
* Widerruf als Link; Tab „Über das Plugin"; diverse UI-Verbesserungen

= 1.0.0 =
* Erstveröffentlichung

== Upgrade Notice ==

= 1.7.0 =
Skript-Blockierung (inkl. YouTube-/Vimeo-API), ganzseitiger Scan, kein Weißraum im Platzhalter und diverse Darstellungs-Korrekturen.

= 1.0.0 =
Erstveröffentlichung.