- Admin-tabs: kein rahmen/box/outline in irgendeinem zustand mehr - nur die
untere unterstreichung markiert den aktiven tab (WP-default-borders ueber-
schrieben, auch :focus/:active).
- Scan deckt jetzt ALLE veroeffentlichten seiten/beitraege (alle public post
types) ab statt nur 4. Backend: limit 10 -> 60 URLs und PARALLELE abfrage
(concurrency 12, 8s/seite), plugin-AJAX-timeout 45 -> 90s.
- Platzhalter-button: border-radius in hover/focus/active festgenagelt (3px) ->
theme kann die ecken beim hover nicht mehr veraendern.
+ version 1.5.3. (Backend-redeploy noetig fuer den scan.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Darstellung: neue option "Textausrichtung" (mittig/links/rechts). Setzt
--cb-align (text-align) und --cb-justify (remember-zeile) inline.
- "Diesen Dienst kuenftig immer laden" nutzt jetzt die textfarbe (var(--cb-text),
ohne dimming).
- Datenschutz-link: schriftgroesse/-gewicht/laufweite/transform/decoration in
allen zustaenden festgenagelt -> keine theme-a:hover-aenderung mehr.
- Werbe-badge: dito -> wird beim hover nicht mehr riesig (theme-scaling/
font-size gesperrt).
+ i18n DE/EN (138 strings). version 1.5.2.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CB_Updater::icons() liefert das plugin-icon fuer den Aktualisierungen-screen
und das "Versionsdetails"-popup. Es erkennt automatisch eine icon-datei in
assets/ (icon.svg|png|webp|jpg); ohne datei wird kein icon gesetzt.
Bild wird vom betreiber selbst hinzugefuegt (nicht im repo).
+ version 1.5.1.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Kleines Badge "GDPR Content Blocker" unten rechts im platzhalter, verlinkt
auf die kaufseite (rel=nofollow sponsored). Server- und client-seitig.
- Wird IMMER angezeigt; abschaltbar via checkbox im Darstellung-tab
("Werbe-Badge ausblenden") - die checkbox ist aber nur mit aktiver
Unlimited-lizenz nutzbar (sonst disabled) und greift am render-punkt nur,
wenn is_unlimited() true ist.
- Dafuer speichert das plugin jetzt max_activations aus der backend-antwort
(activate/validate/swap) und bietet is_unlimited().
+ i18n DE/EN (134 strings). version 1.5.0.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Unter jedem dienstnamen wird jetzt die auto-erzeugte ID angezeigt
(z. B. "ID: eigenes-matomo") - kopierbar, fuer den consent-shortcode.
Bei neuen diensten live-vorschau aus dem namen (slugify, spiegelt
sanitize_title); bei gespeicherten die stabile ID.
- Shortcode-tab: [content_blocker_consent] erklaert jetzt id/text/style einzeln
mit beispielen (button vs. link).
+ i18n DE/EN ergaenzt (131 strings). version 1.4.9.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Drittland-hinweis: kein warn-dreieck mehr und gleiche farbe/groesse wie der
restliche text (eigene zeile statt inline). CSS ::before + amber entfernt.
- Der "komische strich" hinter dem empfaenger war mein " — "-trennzeichen vor
dem hinweis (nicht aus den daten). Entfernt in PHP und JS; der hinweis steht
jetzt sauber in der naechsten zeile.
+ version 1.4.8.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1) Das Warn-Emoji "⚠" im platzhalter-text loeste WordPress' wp-emoji aus, das
die grafik von s.w.org nachlud (drittanbieter-request). Emoji aus den texten
entfernt; das warn-dreieck wird jetzt rein per CSS gezeichnet (kein netzwerk).
Hinweis: s.w.org ist der WP-emoji-CDN, NICHT Google.
2) Der platzhalter reservierte die hoehe des eingebetteten elements -> bei
kuerzerem inhalt entstand weissraum darunter. Hoehen-reservierung entfernt
(PHP min-height-style, JS minHeight, CSS min-height:180px) - der content
blocker ist jetzt exakt so hoch wie sein eigener inhalt. Die original-masse
bleiben als data-attribute fuer das iframe nach einwilligung erhalten.
3) Redundante, partielle de_DE-.po/.mo (mit altem emoji) entfernt - deutsche
locales nutzen direkt die deutschen quell-strings.
+ version 1.4.3 (assets cache-busting).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Loest die YouTube/Vimeo-API-Luecke: viele dienste laden ueber <script>
(z. B. youtube.com/iframe_api, www-widgetapi.js, analytics) statt iframes -
oft per JavaScript nachgeladen, daher fuer den scanner unsichtbar.
- Pro dienst aktivierbar ueber das (umbenannte) feld "Zugehoerige Skripte
blockieren (z. B. YouTube-/Vimeo-API)" = das vorhandene loads_script-flag.
Presets (YouTube, Vimeo, Maps) haben es bereits an.
- Server-seitig: passende <script src> werden zu type="text/plain"
(src -> data-cb-src) neutralisiert, laden also nicht.
- Client-seitig: winziger guard ganz frueh im <head> patcht
appendChild/insertBefore/replaceChild und neutralisiert dynamisch
injizierte scripts VOR dem einfuegen -> kein request. Faengt damit auch
die per JS nachgeladene iframe_api ab.
- Einwilligung (per-dienst-consent, z. B. ueber den video-platzhalter)
schaltet die scripts via cbActivateScripts frei und laedt sie nach.
- Neuer shortcode [content_blocker_consent id="…"] als einwilligungs-button
fuer reine skript-dienste ohne sichtbaren platzhalter.
- guard-logik mit DOM-mock getestet (block + reinject), server-regex
isoliert geprueft. i18n DE/EN ergaenzt (127 strings).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Feature "Schriften lokal hosten" komplett zurueckgebaut (class-fonts.php,
tab, ajax-endpunkte, output-buffer, admin-js-handler, optionen).
- Scan: wird fonts.googleapis.com / fonts.gstatic.com erkannt, steht in der
Aktion-spalte jetzt der nicht-klickbare hinweis "Schriftart fuer
DSGVO-konformen Betrieb lokal hosten." statt eines buttons.
- i18n entsprechend bereinigt (123 strings).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Lizenz-Tab: bei vollen Plaetzen erscheint ein "Lizenz upgraden"-Button
(https://lucas-orth.de/wp-plugins/gdpr-content-blocker/) zusaetzlich zur
domain-freigabe.
- Neues Feature "Schriften": Google Fonts lokal hosten (button-modell).
Admin klickt "Jetzt herunterladen & einbinden" -> plugin scannt die seiten,
laedt googleapis-CSS + gstatic-schriftdateien einmalig in den uploads-ordner,
schreibt die pfade lokal um und tauscht sie per output-buffer im quelltext.
Abgedeckt: <link>, inline-@import/url() UND @import/url() in gleicher-origin
externen CSS-dateien (mit absolutierung der restlichen relativen pfade).
preconnect/dns-prefetch zu google-font-hosts werden entfernt (kein IP-leak).
Toggle zum aus/einschalten + "Lokale Schriften loeschen".
- i18n-pipeline robuster: build-en-mo.py nutzt jetzt translations-en.json
(lookup per quell-string, reihenfolge-unabhaengig) und bricht mit liste ab,
falls eine uebersetzung fehlt. Alle neuen strings DE/EN ergaenzt (139).
- version 1.3.0 (header + CB_VERSION).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- scan & releases/from-url: verbindung wird an die bereits validierte IP
gepinnt (node:http/https lookup-option), statt fetch erneut aufloesen zu
lassen. Schliesst DNS-rebinding/TOCTOU, mit dem ein lizenzierter Kunde
ueber die DNS seiner eigenen Domain interne Dienste/Cloud-Metadaten
erreichen koennte.
- releases/from-url folgt redirects jetzt manuell und validiert jeden hop
(protokoll + private-IP-guard); gitea-token nur an den ausgangs-host.
- pinnedRequest: settle-guard + body-cap loesen das promise auch bei
ueberlangen antworten (kein haengen).
- autodetect process(): kein blank-page mehr bei PCRE-fehler (fallback auf
original-HTML statt (string) null = "").
- cleanup: ungenutztes extract_iframe_src() entfernt; redundantes
&-replace in get_src() entfernt (DOMDocument dekodiert bereits).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Dienst-Zeile zeigt/erfordert nur noch den Anbietername.
- Interne ID wird beim Speichern aus dem Namen abgeleitet (sanitize_title),
bestehende IDs bleiben via Hidden-Field stabil; Eindeutigkeit erzwungen.
- Shortcode-Hilfe erklaert: ID = Anbietername in Kleinbuchstaben mit Bindestrichen.
- EN-Uebersetzung (120) aktualisiert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Aufklapp-Pfeil deutlich groesser (26px).
- Tabs: kein Fokus-Kasten mehr, nur untere Linie markiert den aktiven Tab.
- CB_VERSION + Header auf 1.1.0 -> bricht gecachte alte admin.js/frontend.js
(Ursache, dass ein Dienst auf einer Seite nicht aufklappbar war).
- Aufklappen via Event-Delegation (robust gegen Load-Order/dynamische Zeilen).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Bei voller Lizenz werden alle belegten Domains untereinander gelistet, je
mit Papierkorb-Button + Bestaetigungsdialog (statt Dropdown).
- Trash gibt die Domain frei (deaktiviert serverseitig) und aktiviert diese Seite.
- Lizenz-Tab re-validiert den Status live (max alle 5 Min), damit eine an anderer
Stelle freigegebene Domain hier sofort als ungueltig erscheint statt stale aktiv.
- EN-Uebersetzung (122) aktualisiert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Ein-/Ausklappen wieder mit schwarzem Pfeil (>/v) ohne Box.
- Neuer Tab Shortcodes; Darstellung listet keine Funktionen mehr.
- CSS-Klassen-Referenz in den Darstellung-Tab (unter Custom CSS) verschoben.
- EN-Uebersetzung (121 Strings) neu gebaut.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- frontend.js erkennt JS-nachgeladene iframes (Slider etc.) per initialem Scan
+ MutationObserver und ersetzt sie durch den Platzhalter.
- Elementor-Video-Widgets: data-settings (youtube_url/vimeo_url) wird gelesen,
zu Embed-URL konvertiert, Widget neutralisiert und durch Platzhalter ersetzt.
- Service-Daten + i18n werden dafuer ans Frontend lokalisiert (cbConfig).
- readme: Erkennung + Grenzen (Elementor-Vorschaubild) dokumentiert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
UI:
- Ein-/Ausklappen jetzt mit grossem +/- Icon statt kleinem Pfeil.
- "Entfernen" ist ein Papierkorb-Symbol (dashicon).
- Aktiver Tab klar gekennzeichnet (Akzent-Unterstrich + Farbe).
- 20px Abstand zwischen Tabs und Inhalt.
Funktionen:
- Scan erkennt Anbieter, fuer die es eine Vorlage gibt ("Vorlage verfuegbar"),
und "Vorlage uebernehmen" fuellt die komplette Vorlage statt nur Host/Pattern.
- Platzhalter: Checkbox "Diesen Dienst kuenftig immer laden" (Standard AN).
Abgewaehlt -> Inhalt wird nur einmal geladen, keine dauerhafte Einwilligung.
i18n:
- Sprachumschaltung: Deutsch fuer alle de_* Locales, Englisch fuer alle anderen
(plugin_locale-Filter). Vollstaendige englische Uebersetzung (126 Strings,
inkl. Vorlagentexte/Empfaenger) als gdpr-content-blocker-en_US.po/.mo.
- Helper-Skripte (extract/build) in hilfsdaten/.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Eltern-Ordner ist jetzt EIN Git-Repo (statt getrennter Repos).
- root .gitignore haelt Secrets (.env), node_modules, DB und Build-Artefakte raus.
- release.ps1: manueller Release (ZIP bauen + ans Backend laden).
- root README mit Struktur und Release-Ablauf.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>