{"id":352180,"date":"2026-08-18T11:14:49","date_gmt":"2026-08-18T11:14:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/fepo-image-font-optimizer\/"},"modified":"2026-08-18T11:14:17","modified_gmt":"2026-08-18T11:14:17","slug":"fepo-image-font-optimizer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/fepo-image-font-optimizer\/","author":23507807,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.0.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"fepo \u2014 Image & Font Optimizer","header_author":"fepo","header_description":"Serves modern WebP\/AVIF images and subsetted fonts your site already has \u2014 added safely, originals kept as fallback. Powered by fepo.","assets_banners_color":"e9dad9","last_updated":"2026-08-18 11:14:17","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/fepo.app","rating":0,"author_block_rating":0,"active_installs":0,"downloads":35,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"1.1.0":{"tag":"1.1.0","author":"fepo","date":"2026-08-18 11:14:17"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3652644,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3652644,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3652644,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-3088x1000.png":{"filename":"banner-3088x1000.png","revision":3652644,"resolution":"3088x1000","location":"assets","locale":"","width":3088,"height":1000},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3652644,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3652644,"resolution":"1","location":"assets","locale":"","width":1476,"height":1183},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3652644,"resolution":"2","location":"assets","locale":"","width":1476,"height":1554},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3652644,"resolution":"3","location":"assets","locale":"","width":1476,"height":1408}},"screenshots":{"1":"The optimizer page with the consent box and the free-tier balance (\"Free credits: X of 50\"), in native WP-Admin style.","2":"The Images tab after a Media Library scan \u2014 found, to-optimize and skipped counts.","3":"The Fonts tab \u2014 detected Google Fonts and the download-size saving from subsetting."}},"plugin_section":[],"plugin_tags":[194661,2221,29161,247,15376],"plugin_category":[54],"plugin_contributors":[265332],"plugin_business_model":[],"class_list":["post-352180","plugin","type-plugin","status-publish","hentry","plugin_tags-avif","plugin_tags-fonts","plugin_tags-image-optimization","plugin_tags-performance","plugin_tags-webp","plugin_category-security-and-spam-protection","plugin_contributors-fepo","plugin_committers-fepo"],"banners":{"banner":"https:\/\/ps.w.org\/fepo-image-font-optimizer\/assets\/banner-772x250.png?rev=3652644","banner_2x":"https:\/\/ps.w.org\/fepo-image-font-optimizer\/assets\/banner-1544x500.png?rev=3652644","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/fepo-image-font-optimizer\/assets\/icon-128x128.png?rev=3652644","icon_2x":"https:\/\/ps.w.org\/fepo-image-font-optimizer\/assets\/icon-256x256.png?rev=3652644","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/fepo-image-font-optimizer\/assets\/screenshot-1.png?rev=3652644","caption":"The optimizer page with the consent box and the free-tier balance (\"Free credits: X of 50\"), in native WP-Admin style."},{"src":"https:\/\/ps.w.org\/fepo-image-font-optimizer\/assets\/screenshot-2.png?rev=3652644","caption":"The Images tab after a Media Library scan \u2014 found, to-optimize and skipped counts."},{"src":"https:\/\/ps.w.org\/fepo-image-font-optimizer\/assets\/screenshot-3.png?rev=3652644","caption":"The Fonts tab \u2014 detected Google Fonts and the download-size saving from subsetting."}],"raw_content":"<!--section=description-->\n<p>Serve WebP\/AVIF versions of your images and subsetted (smaller) web fonts, injected additively\ninto the page. Originals are kept as a fallback, so a page can never break. Optimised files live\non your own server \u2014 no CDN, no monthly lock-in, deactivating never breaks the site.<\/p>\n\n<p>Every site starts with 50 free optimizations \u2014 no purchase, no account required. After that, one-time credit packs keep you going, and credits never expire.<\/p>\n\n<p>How it works: <code>&lt;img&gt;<\/code> tags are wrapped in <code>&lt;picture&gt;<\/code> with AVIF\/WebP sources (original kept as\nfallback), CSS <code>background-image<\/code>s are served as AVIF via an injected style block, and web fonts\nare subsetted and served locally \u2014 with the theme's Google Fonts request removed, so no visitor\nIP is sent to Google for fonts.<\/p>\n\n<h4>What gets optimised \u2014 and what doesn't<\/h4>\n\n<p>So you know exactly what to expect \u2014 we'd rather under-promise:<\/p>\n\n<ul>\n<li><strong>Images from 10 KB<\/strong> are converted to WebP\/AVIF (original kept as fallback). Smaller images\nare left unchanged \u2014 the gain isn't worth it.<\/li>\n<li><strong>CSS <code>background-image<\/code>s<\/strong> (raster jpg\/png) are served as AVIF via an injected style block\n(no edits to your CSS).<\/li>\n<li><strong>Fonts from 50 KB<\/strong> are subsetted to the characters your pages actually use and served\nlocally; the matching Google Fonts <code>&lt;link&gt;<\/code> is removed (closing the GDPR concern of visitor\nIPs going to fonts.googleapis.com). Smaller fonts are treated as already optimised.<\/li>\n<li><strong>Already-optimal formats are left untouched:<\/strong> images already served as AVIF, and SVG\n(vector \u2014 stays as-is).<\/li>\n<li><strong>Only assets from your own domain<\/strong> are optimised. Images and fonts embedded from third\nparties (maps, external widgets, etc.) are never touched \u2014 they stay on their original server.<\/li>\n<li><strong>Known limits:<\/strong> images injected by JavaScript after page load (some sliders\/lazy-loaders)\nand background <code>&lt;video&gt;<\/code> are not covered. A font is only replaced when a matching source is\nfound. <strong>Deleting the plugin<\/strong> removes the on-the-fly rewrites (page returns to original) but\nleaves the optimised files in <code>wp-content\/uploads\/fepo\/<\/code> (they belong to you).<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to two external services. Both are described below.<\/p>\n\n<h4>1. portal.fepo.app (fepo optimization service)<\/h4>\n\n<p>Operated by fepo, this service generates the optimized images and fonts. The actual optimization runs on fepo's servers \u2014 it cannot be done locally by the plugin (WebP\/AVIF encoding and font subsetting of your pages).<\/p>\n\n<p><strong>What is sent and when:<\/strong><\/p>\n\n<ul>\n<li>When you optimize images, fonts, or CSS backgrounds: the URLs of the pages or Media Library images being optimized, so fepo's server can fetch and process them.<\/li>\n<li>An anonymous site hash and your site's hostname, so your credit balance is tied to your account.<\/li>\n<\/ul>\n\n<p><strong>What is NOT sent:<\/strong> no personal data of your visitors, no content from posts, pages, or comments, no database contents, and no file contents of images or fonts that are not being optimized.<\/p>\n\n<p>The optimization itself is performed by fepo's server fetching the given page or image URLs (like any browser would) and returning WebP\/AVIF images or subsetted fonts. No private endpoints are accessed. The optimized files are then stored on your own server \u2014 not on a CDN \u2014 and delivered directly from there.<\/p>\n\n<p>You must explicitly consent to this data transmission via a checkbox before the first optimization. The consent is stored locally and can be revoked at any time by deactivating the plugin.<\/p>\n\n<p><strong>Terms of service:<\/strong> <a href=\"https:\/\/fepo.app\/agb\">https:\/\/fepo.app\/agb<\/a>\n<strong>Privacy policy:<\/strong> <a href=\"https:\/\/fepo.app\/datenschutz\">https:\/\/fepo.app\/datenschutz<\/a><\/p>\n\n<h4>2. Google Fonts (fonts.googleapis.com)<\/h4>\n\n<p>To show the real download size of a Google Font on the Fonts tab, the plugin asks Google's Fonts API \u2014 from your WordPress server, in wp-admin \u2014 how large the browser-loaded WOFF2 files for a given font family are.<\/p>\n\n<p><strong>What is sent and when:<\/strong> only the font family name and its weights (e.g. \"Roboto\" with weights 400,700), and only while you are viewing the Fonts tab in the admin. No visitor data, no personal data, and no site content are sent. The request is made server-to-server (from your host to Google), not from your visitors' browsers.<\/p>\n\n<p><strong>Terms of service:<\/strong> <a href=\"https:\/\/policies.google.com\/terms\">https:\/\/policies.google.com\/terms<\/a>\n<strong>Privacy policy:<\/strong> <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a><\/p>\n\n<h3>Disclaimer<\/h3>\n\n<p>This plugin is provided \"as is\", without warranty of any kind. fepo is not liable for any damage, data loss, or downtime arising from its use. Your originals are always kept as a fallback, so an optimization can never break your page.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin ZIP via Plugins \u2192 Add New \u2192 Upload, or copy the folder to wp-content\/plugins\/.<\/li>\n<li>Activate it. Open \"fepo Optimizer\" in the admin menu and optimize your pages.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Die optimierten Bilder und Fonts werden jetzt auf jeder Domain ausgeliefert \u2014 die fr\u00fchere Domain-Bindung der Auslieferung wurde entfernt. Ihre lokal gespeicherten Dateien geh\u00f6ren Ihnen und funktionieren auch nach einem Umzug der Website.<\/li>\n<li>Die eingebettete CSS (@font-face und CSS-Hintergr\u00fcnde) wird jetzt auf dem WordPress-Standardweg \u00fcber wp_add_inline_style() ausgegeben.<\/li>\n<li>Der Front-End-Ausgabepuffer wird am shutdown-Hook ausdr\u00fccklich geschlossen.<\/li>\n<li>Sicherheit: Beim Import einer ZIP-Datei werden ausschlie\u00dflich Bild- und Font-Dateien \u00fcbernommen; unerwartete Dateitypen werden nach dem Entpacken entfernt.<\/li>\n<li>Der Abschnitt \u201eExternal services\" in der readme dokumentiert jetzt zus\u00e4tzlich die Nutzung der Google-Fonts-API (zur Anzeige der Download-Gr\u00f6\u00dfe im Fonts-Tab).<\/li>\n<li>\u00dcbersetzungen werden k\u00fcnftig \u00fcber translate.wordpress.org bereitgestellt; mitgelieferte Sprachdateien wurden entfernt.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Intern: Text-Domain und Plugin-Slug an den WordPress.org-Slug \u201efepo-image-font-optimizer\" angeglichen (behebt die Text-Domain-Warnungen des Plugin-Checks). Keine \u00c4nderung an Funktion oder gespeicherten Daten.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Korrektur: Der Hinweis beim Credit-Kauf ohne Zustimmung nennt keine Richtung mehr (\u201eoben\") \u2014 die Formulierung passt jetzt unabh\u00e4ngig von der Position der Zustimmungs-Box.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Verbessert: Die Zustimmung zur Datenverarbeitung wird jetzt gut sichtbar oben angezeigt (statt in einem Tab versteckt). Die Optimierungs-Tabs erscheinen erst nach der Einwilligung \u2014 so ist klar erkennbar, dass vor der Zustimmung nichts \u00fcbertragen wird.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Behoben: \u201eCredits kaufen\" zeigte vor Ihrer Zustimmung einen leeren Kasten (die Kaufpakete werden erst nach Einwilligung geladen). Jetzt erscheint stattdessen ein Hinweis, dass zuerst die Zustimmung n\u00f6tig ist.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Datenschutz: Vor Ihrer Zustimmung wird jetzt gar kein Kontakt mehr zu portal.fepo.app aufgebaut \u2014 auch der Guthaben-Abruf (der Ihren Site-Hash und Hostnamen \u00fcbertragen w\u00fcrde) wartet auf die Einwilligung. Vorher zeigt das Plugin das Gratis-Kontingent aus statischem Text. Zus\u00e4tzlich wird die Zustimmung jetzt serverseitig erzwungen, nicht nur \u00fcber deaktivierte Schaltfl\u00e4chen.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Behoben: Der Hinweis vor dem Optimieren rechnete nur mit gekauften Credits und ignorierte die Gratis-Credits \u2014 dadurch erschien f\u00e4lschlich \u201eSie haben 0 Credits\". Jetzt z\u00e4hlen Gratis- und gekaufte Credits zusammen (betrifft Bilder- und Fonts-Tab).<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Ge\u00e4ndert: Die Gratis-Kontingent-Anzeige hei\u00dft jetzt \u201eGratis-Credits: X von Y\" (vorher \u201eGratis-Optimierungen \u2026 \u00fcbrig\") \u2014 konsistent mit dem Credit-Wording.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Neu: Das Free-Kontingent betr\u00e4gt jetzt 50 kostenlose Optimierungen pro Domain (vorher 30).<\/li>\n<li>Behoben: Ein frisch installiertes Plugin zeigte \u201eCredit-Guthaben konnte nicht geladen werden\", bis zum ersten Mal optimiert wurde. Jetzt erscheint sofort das Gratis-Kontingent.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Neu: Haftungsausschluss im Plugin und in der readme erg\u00e4nzt (\u201ewie besehen\", ohne Gew\u00e4hr; Ihre Originale bleiben stets als Fallback erhalten).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Stable Release.<\/li>\n<li>Neu: Ihr Free-Kontingent von 50 kostenlosen Optimierungen wird jetzt im Plugin angezeigt \u2014 bisher waren dort nur gekaufte Credits sichtbar.<\/li>\n<li>Neu: Das Free-Kontingent ist jetzt an Ihre Domain gebunden \u2014 eine Neuinstallation des Plugins setzt es nicht mehr zur\u00fcck.<\/li>\n<li>Bild-, Font- und CSS-Hintergrund-Optimierung sind produktionsreif; der Credit-Kauf ist durchg\u00e4ngig (End-to-End) verifiziert.<\/li>\n<\/ul>\n\n<h4>0.18.39<\/h4>\n\n<ul>\n<li>Fix: Nach dem Kauf eines Credit-Pakets landen Sie jetzt wieder direkt im Plugin (mit Erfolgsmeldung) statt auf einer Fehlerseite.<\/li>\n<\/ul>\n\n<h4>0.18.37<\/h4>\n\n<ul>\n<li>Verbessert: Die heruntergeladene Assets-ZIP enth\u00e4lt jetzt Datum und Uhrzeit im Dateinamen (z. B. <code>fepo-optimized-assets-2026-08-04-2305.zip<\/code>), sodass mehrere Downloads sich nicht gegenseitig \u00fcberschreiben.<\/li>\n<\/ul>\n\n<h4>0.18.36<\/h4>\n\n<ul>\n<li>Fix: Der CSS-Hintergrundbilder-Tab zeigt nach dem L\u00f6schen (oder auf einer frischen Installation) wieder \u201enoch nicht gescannt\" statt eines veralteten Scan-Ergebnisses \u2014 der Scan-Cache wird jetzt beim L\u00f6schen und einmalig beim Update bereinigt.<\/li>\n<\/ul>\n\n<h4>0.18.35<\/h4>\n\n<ul>\n<li>Fix: Als CSS-Hintergrund optimierte Bilder erscheinen nicht l\u00e4nger im \u201eBilder\"-Tab (weder in der Z\u00e4hlung noch als \u201eL\u00f6schen\"-Schaltfl\u00e4che) \u2014 sie geh\u00f6ren in den CSS-Hintergrundbilder-Tab.<\/li>\n<\/ul>\n\n<h4>0.18.34<\/h4>\n\n<ul>\n<li>Verbesserung: \u201eOptimierte Dateien l\u00f6schen\"-Buttons benennen jetzt den Asset-Typ pro Tab (\u201eOptimierte Bilder \/ Fonts \/ Hintergrundbilder l\u00f6schen\") und heben sich als L\u00f6schaktion durchg\u00e4ngig durch rote Schrift und roten Rahmen ab (zuvor nur beim \u00dcberfahren mit der Maus).<\/li>\n<\/ul>\n\n<h4>0.18.32<\/h4>\n\n<ul>\n<li>Verbesserung: \u201eOptimierte Dateien l\u00f6schen\"-Buttons an den Stil der \u00fcbrigen Schaltfl\u00e4chen angepasst (grauer Button, rote Beschriftung).<\/li>\n<li>Fix: Nach dem Import werden die neu importierten Optimierungen (inkl. \u201eL\u00f6schen\"-Buttons) zuverl\u00e4ssig sofort angezeigt \u2013 auch hinter einem Edge-\/Proxy-Cache.<\/li>\n<\/ul>\n\n<h4>0.18.31<\/h4>\n\n<ul>\n<li>Fix: Der Button \u201eOptimierte Assets herunterladen (ZIP)\" wird jetzt direkt nach einer Optimierung aktiv \u2013 ohne die Seite neu laden zu m\u00fcssen.<\/li>\n<\/ul>\n\n<h4>0.18.29<\/h4>\n\n<ul>\n<li>Intern: Datei-Operationen (Verschieben\/L\u00f6schen optimierter Assets) auf die WordPress-Filesystem-API umgestellt (Plugin-Check-Konformit\u00e4t).<\/li>\n<\/ul>\n\n<h4>0.18.28<\/h4>\n\n<ul>\n<li>Neu: Optimierte Dateien lassen sich pro Tab (Bilder, Fonts, CSS-Hintergrundbilder) einzeln l\u00f6schen \u2014 die Originale bleiben unangetastet.<\/li>\n<li>Neu: Ein zuvor heruntergeladenes ZIP l\u00e4sst sich wieder importieren und ersetzt den aktuellen Bestand, ohne erneut Credits zu verbrauchen.<\/li>\n<li>Neu: Domain-Lizenzpr\u00fcfung beim Import sowie regelm\u00e4\u00dfig im Hintergrund verhindert, dass optimierte Dateien nach einem Domain-Wechsel oder einer Kopie der Seite weiterverwendet werden.<\/li>\n<li>Neu: Abschnitt \u201eExternal services\" in der readme.txt dokumentiert, welche Daten dabei an den fepo-Server \u00fcbertragen werden.<\/li>\n<\/ul>\n\n<h4>0.18.27<\/h4>\n\n<ul>\n<li>Verbessert: Die Font-Tabelle erscheint erst nach einem Scan (kein leeres Tabellenger\u00fcst mehr) und alle Spalten sind einheitlich linksb\u00fcndig.<\/li>\n<\/ul>\n\n<h4>0.18.26<\/h4>\n\n<ul>\n<li>Neu: Die Font-Ergebnisse erscheinen jetzt als \u00fcbersichtliche Tabelle (Schriftart, von Google geladene Dateien, geladene Gr\u00f6\u00dfe, Gr\u00f6\u00dfe nach dem Subsetting) mit einer Gesamtersparnis-Zeile.<\/li>\n<\/ul>\n\n<h4>0.18.25<\/h4>\n\n<ul>\n<li>Neu: Die Font-Liste zeigt jetzt, wie viele Dateien Google pro Schriftfamilie ausliefert \u2014 z. B. \u201e4 Dateien von Google geladen (337,7 KB WOFF2)\".<\/li>\n<\/ul>\n\n<h4>0.18.24<\/h4>\n\n<ul>\n<li>Korrigiert: Die Font-Ergebnisliste zeigt jetzt die echte Downloadgr\u00f6\u00dfe (Google-WOFF2) und die optimierte Gr\u00f6\u00dfe mit Ersparnis in Prozent \u2014 statt der internen Master-Datei. Die Liste bleibt nach dem Neuladen der Seite sichtbar.<\/li>\n<\/ul>\n\n<h4>0.18.23<\/h4>\n\n<ul>\n<li>Neu: Der Fonts-Tab zeigt jetzt die echte Downloadgr\u00f6\u00dfe der Google-Fonts (das, was der Browser l\u00e4dt) statt der internen Master-Datei \u2014 gemessen direkt in Ihrer Installation.<\/li>\n<\/ul>\n\n<h4>0.18.22<\/h4>\n\n<ul>\n<li>Fix: Der Button \u201eOptimierte Assets herunterladen (ZIP)\" ist jetzt auch dann aktiv, wenn nur Fonts (oder nur CSS-Hintergr\u00fcnde) optimiert wurden \u2014 bisher blieb er in diesem Fall ausgegraut, obwohl die optimierten Dateien im ZIP lagen.<\/li>\n<\/ul>\n\n<h4>0.18.21<\/h4>\n\n<ul>\n<li>Verbesserung: Das Credit-Guthaben aktualisiert sich jetzt direkt nach einem Optimierungslauf \u2014 ohne die Seite neu laden zu m\u00fcssen.<\/li>\n<\/ul>\n\n<h4>0.18.20<\/h4>\n\n<ul>\n<li>Font-Optimierung verbraucht jetzt Credits (1 Familie = 1 Credit); Hinweis bei zu wenig Guthaben vor dem Start.<\/li>\n<\/ul>\n\n<h4>0.18.19<\/h4>\n\n<ul>\n<li>Hinweis zur Datenspeicherung korrigiert\/pr\u00e4zisiert: Ein einmaliger Credit-Kauf h\u00e4lt Ihre Verbindung dauerhaft aktiv (auch bei 0 verbleibenden Credits). Ohne gekaufte Credits wird eine 60 Tage inaktive Installation automatisch gel\u00f6scht (DSGVO-Datenminimierung).<\/li>\n<\/ul>\n\n<h4>0.18.18<\/h4>\n\n<ul>\n<li>Neu: Wenn Ihr Guthaben nicht f\u00fcr alle ausgew\u00e4hlten Bilder reicht, weist Sie das Plugin vor dem Start darauf hin, wie viele Bilder jetzt optimiert werden und wie viele f\u00fcr sp\u00e4ter \u00fcbrig bleiben \u2014 Sie entscheiden dann, ob Sie trotzdem starten.<\/li>\n<\/ul>\n\n<h4>0.18.17<\/h4>\n\n<ul>\n<li>Neu: Sehr gro\u00dfe Bilder (\u00fcber 10 MB) werden beim Scan \u00fcbersprungen und im Ergebnis als \u201ezu gro\u00df\" ausgewiesen \u2014 daf\u00fcr wird kein Credit verbraucht. Solche Dateien sind fast immer unkomprimierte Originale; bitte komprimieren Sie sie zuerst.<\/li>\n<\/ul>\n\n<h4>0.18.16<\/h4>\n\n<ul>\n<li>Verbesserung: Bilder werden jetzt in kleineren Paketen (20 statt 50) verarbeitet. Das macht die Fortschrittsanzeige fl\u00fcssiger und die Wiederaufnahme nach einer Unterbrechung robuster \u2014 ohne die Geschwindigkeit zu ver\u00e4ndern.<\/li>\n<\/ul>\n\n<h4>0.18.15<\/h4>\n\n<ul>\n<li>Fix: Die deutschen Texte erscheinen jetzt auch, wenn die WordPress-Sprache auf \u201eDeutsch (Sie)\" (formelle Anrede) steht \u2014 bisher wurde in diesem Fall Englisch angezeigt. Die \u00dcbersetzung ist ohnehin durchg\u00e4ngig in der Sie-Form gehalten.<\/li>\n<\/ul>\n\n<h4>0.18.14<\/h4>\n\n<ul>\n<li>Intern: Vorbereitung f\u00fcr die Ver\u00f6ffentlichung im WordPress.org-Plugin-Verzeichnis \u2014 die \u00dcbersetzungen werden k\u00fcnftig automatisch von WordPress geladen (wie bei den \u00fcbrigen fepo-Plugins). Keine funktionalen \u00c4nderungen.<\/li>\n<\/ul>\n\n<h4>0.18.13<\/h4>\n\n<ul>\n<li>Neu: Ein kurzer Hinweis zur Datenspeicherung erkl\u00e4rt, wie lange Ihr Zugang bestehen bleibt (mit Guthaben dauerhaft, ohne Guthaben und ohne Nutzung 3 Monate) und dass Ihre optimierten Dateien davon unber\u00fchrt sind (DSGVO-Transparenz).<\/li>\n<\/ul>\n\n<h4>0.18.12<\/h4>\n\n<ul>\n<li>Fix: Die deutsche \u00dcbersetzung wird jetzt tats\u00e4chlich geladen. In 0.18.11 war die \u00dcbersetzung zwar im Paket enthalten, wurde aber nicht angezeigt \u2014 WordPress l\u00e4dt mitgelieferte \u00dcbersetzungen nur, wenn das Plugin sie ausdr\u00fccklich anfordert. In einer deutschsprachigen Installation erscheint die Oberfl\u00e4che nun auf Deutsch.<\/li>\n<\/ul>\n\n<h4>0.18.11<\/h4>\n\n<ul>\n<li>Neu: Das Plugin ist jetzt auf Deutsch verf\u00fcgbar. In einer deutschsprachigen WordPress-Installation erscheinen alle Texte automatisch auf Deutsch; in anderen Sprachen bleibt es beim englischen Original. Der Produktname \u201efepo \u2014 Image &amp; Font Optimizer\" bleibt unver\u00e4ndert.<\/li>\n<\/ul>\n\n<h4>0.18.10<\/h4>\n\n<ul>\n<li>Fix: Der Tab \u201eCSS-Hintergr\u00fcnde\" holt seinen Stand jetzt beim \u00d6ffnen frisch vom Server. Wer im selben Aufruf zuerst Bilder optimiert und dann in den Tab wechselt, sieht die neuen Zahlen sofort \u2014 bisher war daf\u00fcr ein Neuladen der Seite n\u00f6tig.<\/li>\n<\/ul>\n\n<h4>0.18.9<\/h4>\n\n<ul>\n<li>Fix: Der Tab \u201eCSS-Hintergr\u00fcnde\" zeigt den aktuellen Stand jetzt sofort beim \u00d6ffnen an. Bisher konnte dort \u201e0 bereits optimiert\" stehen, obwohl das Hintergrundbild l\u00e4ngst optimiert ausgeliefert wurde \u2014 die Anzeige wurde erstellt, bevor der Abgleich mit den optimierten Bildern lief.<\/li>\n<li>Verbesserung: Das zuletzt ermittelte Ergebnis des Hintergrund-Scans wird gespeichert. Der Tab ist damit nach dem ersten Scan nie wieder leer, und die Zahlen werden bei jedem Aufruf frisch gegen Ihre optimierten Bilder abgeglichen. Ist das Ergebnis \u00e4lter als eine Stunde, wird im Hintergrund einmal nachgesehen \u2014 ohne Wartezeit f\u00fcr Sie.<\/li>\n<\/ul>\n\n<h4>0.18.8<\/h4>\n\n<ul>\n<li>Verbesserung: Hintergrundbilder aus Ihrem CSS werden jetzt automatisch mit ausgeliefert, sobald das zugeh\u00f6rige Bild im Bilder-Tab optimiert wurde \u2014 ein erneuter Lauf im Tab \u201eCSS-Hintergr\u00fcnde\" ist daf\u00fcr nicht mehr n\u00f6tig. Bisher blieb ein solches Hintergrundbild unoptimiert, obwohl die AVIF-\/WebP-Datei bereits vorlag.<\/li>\n<li>Hinweis: Einmal muss \u201eCSS-Hintergr\u00fcnde scannen\" weiterhin ausgef\u00fchrt werden, damit das Plugin Ihre Hintergrundbilder \u00fcberhaupt kennt. Danach gen\u00fcgt das Optimieren im Bilder-Tab. Es entstehen dabei keine zus\u00e4tzlichen Credits und keine weiteren Umwandlungen \u2014 es wird nur auf die bereits vorhandenen Dateien verwiesen. Von Ihnen deaktivierte Hintergrundbilder bleiben deaktiviert.<\/li>\n<\/ul>\n\n<h4>0.18.7<\/h4>\n\n<ul>\n<li><strong>Verhaltens\u00e4nderung:<\/strong> Auf Staging- und Entwicklungsumgebungen ist das Optimieren jetzt gesperrt. Damit verbraucht eine Kopie Ihrer Website (Testsystem, Klon) keine Credits mehr. Ma\u00dfgeblich ist die WordPress-Umgebungsangabe (<code>WP_ENVIRONMENT_TYPE<\/code>): Alles au\u00dfer \u201eproduction\" ist gesperrt. Wenn Sie dort trotzdem optimieren m\u00f6chten, tragen Sie <code>define( 'FEPO_IO_ALLOW_NON_PRODUCTION', true );<\/code> in Ihre wp-config.php ein.<\/li>\n<li>Fix: Optimierte Dateien, die auf dem Server nicht (mehr) vorhanden sind, werden nicht mehr ausgeliefert. Nach einem Umzug oder dem Einspielen eines Backups konnten dadurch leere Bilder erscheinen; jetzt wird in solchen F\u00e4llen automatisch das Originalbild angezeigt.<\/li>\n<li>Fix: Ein zweiter Klick auf \u201eOptimieren\" startet keinen konkurrierenden zweiten Lauf mehr, sondern zeigt den Fortschritt des bereits laufenden an.<\/li>\n<li>Fix: Nach Abschluss eines Batch-Laufs wird die Scan-Anzeige jetzt zuverl\u00e4ssig zur\u00fcckgesetzt.<\/li>\n<li>Verbesserung: Klarere Meldung, wenn die Domain nicht zu dem bei fepo registrierten Zugang passt (etwa nach einem Umzug) \u2014 inklusive dem ausdr\u00fccklichen Hinweis, den Zugang <strong>nicht<\/strong> zu l\u00f6schen, da Ihre Credits daran h\u00e4ngen.<\/li>\n<\/ul>\n\n<h4>0.18.6<\/h4>\n\n<ul>\n<li>Fix: Ein bereits im CSS-Hintergr\u00fcnde-Tab optimiertes Bild wurde im Bilder-Tab-Scan wieder als \u201ezu optimieren\" gez\u00e4hlt (z. B. \u201e31 zu optimieren\" statt \u201e30 \u00b7 1 optimiert\") und h\u00e4tte beim Optimieren einen zweiten Credit gekostet. Der Bilder-Scan erkennt jetzt auch schon-im-CSS-Hintergrund-Modus optimierte Bilder als bereits optimiert (Gegenst\u00fcck zum umgekehrten Abgleich, den der CSS-Hintergr\u00fcnde-Scan schon macht).<\/li>\n<\/ul>\n\n<h4>0.18.5<\/h4>\n\n<ul>\n<li>Aufr\u00e4umen: Der Code des fr\u00fcheren seitenbasierten Optimize-Modus wurde entfernt (seit der Umstellung auf die Tabs Bilder \/ Fonts \/ CSS-Hintergr\u00fcnde ohne Funktion). Keine Verhaltens\u00e4nderung f\u00fcr die drei aktiven Modi.<\/li>\n<\/ul>\n\n<h4>0.18.4<\/h4>\n\n<ul>\n<li>Hinweis: Die \u201eDid You Know?\"-Karte weist jetzt auf die weiteren fepo-WordPress-Plugins hin.<\/li>\n<\/ul>\n\n<h4>0.18.3<\/h4>\n\n<ul>\n<li>Verbesserung: Nach Abschluss eines Batch-Jobs aktualisiert sich die Scan-Zeile automatisch (zeigt dann \u201e0 zu optimieren \u00b7 X optimiert\" statt des Stands von vor dem Lauf) \u2014 ohne manuelles erneutes Scannen.<\/li>\n<\/ul>\n\n<h4>0.18.2<\/h4>\n\n<ul>\n<li>Fix: Scan-Ergebnis bleibt jetzt auch w\u00e4hrend eines laufenden Batch-Jobs erhalten, wenn man die Seite verl\u00e4sst und zur\u00fcckkehrt (vorher verschwand die Liste nach dem ersten Batch-H\u00e4ppchen).<\/li>\n<\/ul>\n\n<h4>0.18.1<\/h4>\n\n<ul>\n<li>Fix: Bilder-Tab merkt sich das Scan-Ergebnis \u00fcber Reloads; ein laufender Batch-Job zeigt seinen Fortschritt nach erneutem \u00d6ffnen wieder an (statt leerer Anzeige).<\/li>\n<\/ul>\n\n<h4>0.18.0<\/h4>\n\n<ul>\n<li>Batch: Die Batch-Gr\u00f6\u00dfe (Standard 50) ist jetzt \u00fcber den Filter <code>fepo_io_batch_size<\/code> anpassbar \u2014 praktisch zum Testen mit kleinen Mengen, ohne den Code zu \u00e4ndern.<\/li>\n<\/ul>\n\n<h4>0.17.1<\/h4>\n\n<ul>\n<li>Batch (intern, Geld-Pfad-H\u00e4rtung): Ein Batch wird nur als erledigt gez\u00e4hlt, wenn das Speichern ins Manifest wirklich klappt (bei einem \u00dcbertragungsfehler wird er automatisch erneut versucht \u2014 keine verlorenen Bilder). Zus\u00e4tzlich ein Mutex, damit JS-Anschieber und WP-Cron denselben Batch nie doppelt starten (kein doppelter Credit-Verbrauch).<\/li>\n<\/ul>\n\n<h4>0.17.0<\/h4>\n\n<ul>\n<li>Gro\u00dfe Bild-Mengen (&gt; 50) laufen jetzt als Hintergrund-Batch in 50er-Schritten: kein Tab-offen-Zwang mehr, WP-Cron \u00fcbernimmt weiter, wenn der Tab geschlossen wird. Fortschrittsanzeige \u201eX \/ Y done\", Kauf-Hinweis wenn die Credits f\u00fcr die gesamte Menge nicht reichen, Abschluss-Banner nach Fertigstellung.<\/li>\n<\/ul>\n\n<h4>0.16.21<\/h4>\n\n<ul>\n<li>Einheitliche Abschluss-Meldung in allen Tabs (Bilder \/ Fonts \/ CSS-Backgrounds): \u201eDone \u00b7 Y assets optimized \u00b7 X KB saved\".<\/li>\n<\/ul>\n\n<h4>0.16.20<\/h4>\n\n<ul>\n<li>CSS-Backgrounds: Nach dem Optimieren aktualisiert sich die Zusammenfassung (found \/ to optimize \/ already optimized \/ skipped) sofort \u2014 ohne dass man erneut auf \u201eScan\" klicken muss.<\/li>\n<\/ul>\n\n<h4>0.16.19<\/h4>\n\n<ul>\n<li>CSS-Backgrounds: Fix \u2014 der Scan las seinen eigenen injizierten Style-Block (das ausgelieferte CSS-Background-Override) als Quelle wieder ein. Weil dessen Selektoren mit \u201ebody.fepo\" beginnen, wurde ein bereits optimiertes Bild nicht als \u201ealready optimized\" erkannt. Der Scan l\u00e4sst die plugin-eigenen Style-Bl\u00f6cke jetzt aus.<\/li>\n<\/ul>\n\n<h4>0.16.18<\/h4>\n\n<ul>\n<li>CSS-Backgrounds: Fix \u2014 ein bereits als CSS-Background optimiertes Bild wurde beim erneuten Scan wieder als \u201eto optimize\" gezeigt (statt \u201ealready optimized\") und h\u00e4tte beim Optimieren einen zweiten Credit gekostet. Der Abgleich erkennt jetzt auch schon-als-CSS-Background optimierte Bilder (\u00fcber den Selektor), nicht nur die im Bild-Modus optimierten.<\/li>\n<\/ul>\n\n<h4>0.16.17<\/h4>\n\n<ul>\n<li>CSS-Backgrounds: Fix \u2014 bereits im Bild-Modus optimierte Backgrounds bekamen eine doppelt geprefixte AVIF-URL (\u2026\/optimized\/images\/https:\/\/\u2026\/optimized\/images\/\u2026), die 404 lieferte. Die Datei-URL wird jetzt genau einmal gesetzt. Der fehlerhafte Eintrag heilt beim n\u00e4chsten Scan von selbst.<\/li>\n<\/ul>\n\n<h4>0.16.16<\/h4>\n\n<ul>\n<li>CSS-Backgrounds: Der Scan pr\u00fcft jetzt die Dateigr\u00f6\u00dfe (HEAD-Request) und \u00fcberspringt Bilder unter 10 KB (wie der Bild-Modus) \u2014 sie verbrauchen keinen Credit mehr. Bilder ohne ermittelbare Gr\u00f6\u00dfe werden konservativ \u00fcbersprungen (im Bild-Modus optimierbar).<\/li>\n<\/ul>\n\n<h4>0.16.15<\/h4>\n\n<ul>\n<li>CSS-Backgrounds: Bilder, die bereits im Bild-Modus optimiert wurden und zugleich als CSS-Background dienen, erhalten jetzt beim Scan sofort einen -Override (Wiederverwendung der vorhandenen AVIF\/WebP-Dateien, kein zweiter Credit).<\/li>\n<\/ul>\n\n<h4>0.16.14<\/h4>\n\n<ul>\n<li>CSS-Backgrounds: \"Optimize CSS backgrounds\"-Button optimiert jetzt tats\u00e4chlich (start \u2192 poll \u2192 finalize), site-weiter Manifest-Pool wie bei Fonts.<\/li>\n<\/ul>\n\n<h4>0.16.13<\/h4>\n\n<ul>\n<li>CSS-Backgrounds: gefundene Hintergrundbilder werden mit den bereits optimierten Media-Library-Bildern abgeglichen \u2014 schon optimierte werden wiederverwendet (kein doppelter Credit). Scan zeigt jetzt \"X to optimize \/ Y already optimized\".<\/li>\n<\/ul>\n\n<h4>0.16.12<\/h4>\n\n<ul>\n<li>Intern: CSS-Background-Scan erfasst jetzt Selektor + Media-Query (Klammern-Tiefe-Parser) \u2014 Vorbereitung fuer die crawl-freie CSS-Background-Optimierung.<\/li>\n<\/ul>\n\n<h4>0.16.11<\/h4>\n\n<ul>\n<li>Neu: On\/Off-Schalter pro Tab (Bilder\/Fonts\/CSS-Backgrounds). \"Aus\" pausiert nur die Auslieferung \u2014 die optimierten Dateien bleiben auf dem Server und k\u00f6nnen weiter als ZIP heruntergeladen werden. \"An\" reaktiviert sofort.<\/li>\n<\/ul>\n\n<h4>0.16.10<\/h4>\n\n<ul>\n<li>Performance: Das in die Seite injizierte Rewrite-Script wird minifiziert ausgeliefert (6.6 \u2192 2.7 KB). Lesbare Source bleibt im Plugin.<\/li>\n<\/ul>\n\n<h4>0.16.9<\/h4>\n\n<ul>\n<li>Fix: Nach dem Font-Optimieren verschwindet die veraltete Scan-Warnung (\"\u2026 loaded from Google \u2026\") \u2014 die Fonts werden ja jetzt lokal ausgeliefert.<\/li>\n<\/ul>\n\n<h4>0.16.8<\/h4>\n\n<ul>\n<li>Neu: \"Optimize CSS backgrounds\"-Button im CSS-Background-Tab (wird nach dem Scan aktiv). Optimier-Funktion folgt.<\/li>\n<\/ul>\n\n<h4>0.16.7<\/h4>\n\n<ul>\n<li>Konsistenz: Fonts-Tab wie Images\/CSS-Background \u2014 Ergebnis \u00fcber den Buttons, \"Scanning\u2026\"-Status darunter.<\/li>\n<li>Konsistenz: Im Fonts-Tab stehen \"Scan\/Optimize fonts\" jetzt UNTER dem Ergebnis (wie Images- und CSS-Background-Tab).<\/li>\n<\/ul>\n\n<h4>0.16.5<\/h4>\n\n<ul>\n<li>Fix: \u201eCSS Background-Images\"-Tab \u2014 Scan-Button, Warning behoben, Download\/Tipp global unter allen Tabs; Scan erfasst auch Page-Builder-CSS (uploads\/, z.B. Elementor).<\/li>\n<\/ul>\n\n<h4>0.16.4<\/h4>\n\n<ul>\n<li>Neu: Tab \u201eCSS Background-Images\" (vorher \u201ePages\") mit crawl-freiem \u201eScan CSS backgrounds\" \u2014 findet background-image\/background url()-Rasterbilder (JPG\/PNG) durch Scan des Theme-CSS (verlinkte Stylesheets + Inline-Styles + registrierte Stylesheets), ohne die Seite zu crawlen. Nur das eigene Theme wird gescannt; Plugin- und WordPress-Core-CSS werden bewusst ausgelassen (fepo fasst diese Assets nicht an).<\/li>\n<\/ul>\n\n<h4>0.16.3<\/h4>\n\n<ul>\n<li>Verbessert: Intro- und Credit-Karte zu einer Karte zusammengefasst; Guthaben zeigt jetzt \"You have left: X credits\" mit einem \"Add Credits\"-Button daneben.<\/li>\n<li>Verbessert: Credit-Hinweis pr\u00e4zisiert (\"1 asset (image or font) = 1 credit\"); der CDN-Tipp sitzt jetzt beim Guthaben.<\/li>\n<\/ul>\n\n<h4>0.16.2<\/h4>\n\n<ul>\n<li>Neu: Credit-Karte im Adminbereich zeigt Ihr Paid-Credit-Guthaben und bietet Kauf-Packs an, sobald diese konfiguriert sind.<\/li>\n<li>Neu: Wird eine Optimierung mangels Guthaben abgelehnt (Kontingent ersch\u00f6pft oder Paid-only-Feature), zeigt das Plugin jetzt eine Upgrade-Box mit Kauf-Button statt nur einer Fehlermeldung.<\/li>\n<\/ul>\n\n<h4>0.16.1<\/h4>\n\n<ul>\n<li>Neu: Fonts-Tab zeigt nach dem Optimieren eine Detail-Liste je Font (Original \u2192 optimierte Gr\u00f6\u00dfe, gesparte KB) inkl. \u00fcbersprungener Fonts mit Grund.<\/li>\n<li>Neu: Lade-Spinner w\u00e4hrend \u201eOptimizing\u2026\" im Fonts-Tab.<\/li>\n<li>Fix (Server): umbenannte Google-Fonts (z. B. \u201eSource Sans Pro\" \u2192 \u201eSource Sans 3\") werden jetzt gefunden und subsettet statt \u00fcbersprungen.<\/li>\n<\/ul>\n\n<h4>0.16.0<\/h4>\n\n<ul>\n<li>Neu: Fonts-Tab \u201eOptimize fonts\" \u2014 Google-Fonts werden serverseitig auf Latin-Ext subsettet, lokal gehostet und der Google-Link bei der Auslieferung entfernt (DSGVO).<\/li>\n<\/ul>\n\n<h4>0.15.2<\/h4>\n\n<ul>\n<li>Clearer Fonts-tab wording: fepo subsets the Google Fonts (smaller files) and serves them from your own server \u2014 not just \"self-hosting\".<\/li>\n<\/ul>\n\n<h4>0.15.1<\/h4>\n\n<ul>\n<li>The Fonts tab now lists only Google Fonts \u2014 the ones that leak visitor IPs and that fepo can self-host for you. Fonts you already serve locally (including icon fonts like Font Awesome) are no longer shown as noise.<\/li>\n<\/ul>\n\n<h4>0.15.0<\/h4>\n\n<ul>\n<li>New \"Fonts\" tab: scans your CSS (no crawl) and shows which web fonts your site uses and where they load from \u2014 flagging Google Fonts that send visitor IPs to Google. (Optimising them comes next.)<\/li>\n<\/ul>\n\n<h4>0.14.3<\/h4>\n\n<ul>\n<li>The \"Download optimized assets (ZIP)\" button now works across both tabs and is available whenever any images or pages have been optimised \u2014 handy for keeping a copy before uninstalling.<\/li>\n<\/ul>\n\n<h4>0.14.2<\/h4>\n\n<ul>\n<li>While an optimization run is in progress, all action buttons across both tabs are now disabled so a second run can't be started by accident. The \"Optimizing\u2026\" status now shows a spinner.<\/li>\n<\/ul>\n\n<h4>0.14.1<\/h4>\n\n<ul>\n<li>The skipped-images list is now styled to match the rest of the panel (framed, clearer group headings) instead of the plain browser default.<\/li>\n<\/ul>\n\n<h4>0.14.0<\/h4>\n\n<ul>\n<li>The image scan now lists every image in your Media Library and explains skipped ones by reason \u2014 already-modern (WebP\/AVIF), vector (SVG), too small, or other formats. Nothing hidden anymore.<\/li>\n<\/ul>\n\n<h4>0.13.3<\/h4>\n\n<ul>\n<li>The Optimize action now skips images that are already optimized, so it no longer re-submits finished images \u2014 this prevents a false \"limit reached\" when the scan still shows images left to optimize. When everything is already done, a neutral note is shown instead of an error.<\/li>\n<\/ul>\n\n<h4>0.13.2<\/h4>\n\n<ul>\n<li>Image scan now reports already-optimised images as their own \"optimized\" category instead of counting them again as \"to optimize\". Matches by URL path (www\/non-www safe).<\/li>\n<\/ul>\n\n<h4>0.13.1<\/h4>\n\n<ul>\n<li>Improved: Image mode UI cleaned up \u2014 general notes moved above the tabs, \"Did you know?\" is now its own card. Clearer scan summary (names the optimized formats) plus the real savings shown after the run.<\/li>\n<\/ul>\n\n<h4>0.13.0<\/h4>\n\n<ul>\n<li>New: Image mode \u2014 optimizes the entire Media Library (WooCommerce product images including rotating related products), independent of individual pages. Images are converted to WebP\/AVIF and served across all pages.<\/li>\n<\/ul>\n\n<h4>0.12.1<\/h4>\n\n<ul>\n<li>loading=\"lazy\" \/ fetchpriority=\"high\" jetzt nach DOM-Position statt nach gemessener Pixel-H\u00f6he: zweites Bild der Seite bekommt fetchpriority=\"high\" (LCP), ab dem dritten loading=\"lazy\". Robuster auf Mobile, keine Messung n\u00f6tig.<\/li>\n<\/ul>\n\n<h4>0.12.0<\/h4>\n\n<ul>\n<li>New: Below-the-fold images now get loading=\"lazy\" so they load only when scrolled into view \u2014 the above-the-fold\/LCP image is never lazy-loaded (measured position, fetchpriority-safe).<\/li>\n<\/ul>\n\n<h4>0.11.0<\/h4>\n\n<ul>\n<li>New: Images loaded by JavaScript (e.g. WooCommerce block-based related products, sliders, lightboxes) are now rewritten to the optimized AVIF\/WebP in the browser \u2014 coverage that server-side HTML rewriting cannot reach.<\/li>\n<\/ul>\n\n<h4>0.10.18<\/h4>\n\n<ul>\n<li>Improved: Product-gallery and related-product images (loaded via srcset on mobile) now use the optimized AVIF\/WebP instead of the full-size original JPEG.<\/li>\n<\/ul>\n\n<h4>0.10.17<\/h4>\n\n<ul>\n<li>Fix: WooCommerce product-zoom now loads the optimized WebP (the zoom reads data-src, which is now rewritten too).<\/li>\n<\/ul>\n\n<h4>0.10.16<\/h4>\n\n<ul>\n<li>Improved: JavaScript-loaded zoom\/lightbox images (e.g. WooCommerce product zoom) now use the optimized WebP instead of the original JPEG.<\/li>\n<\/ul>\n\n<h4>0.10.15<\/h4>\n\n<ul>\n<li>Fix: Page-builder header\/footer templates and other non-page items (e.g. Elementor Header &amp; Footer Builder, media, forms) no longer appear in the list \u2014 now filtered generically, not just by name.<\/li>\n<\/ul>\n\n<h4>0.10.14<\/h4>\n\n<ul>\n<li>Fix: On WooCommerce sites, each product now optimizes its own page correctly \u2014 a regression in 0.10.13 caused all products to share one entry (and pull the wrong page's images).<\/li>\n<\/ul>\n\n<h4>0.10.13<\/h4>\n\n<ul>\n<li>Fix: Page-builder template parts (Elementor templates\/kits, block templates, etc.) no longer appear in the page list \u2014 only real, optimizable pages are shown.<\/li>\n<li>Improved: WooCommerce products are now sorted by best-sellers using the official WooCommerce API.<\/li>\n<\/ul>\n\n<h4>0.10.12<\/h4>\n\n<ul>\n<li>New: The page list now includes all public content types \u2014 WooCommerce products &amp; product categories, plus any custom post types \u2014 so you can optimize them too (not just pages and blog posts).<\/li>\n<\/ul>\n\n<h4>0.10.11<\/h4>\n\n<ul>\n<li>New: Notice when a page was analyzed via the fallback crawler (your server blocked fepo) \u2014 with a link explaining how to allow fepo for faster, more complete optimization.<\/li>\n<\/ul>\n\n<h4>0.10.10<\/h4>\n\n<ul>\n<li>Kleiner UI-Feinschliff: die \u201eDid you know?\"-Karte hat jetzt einen dezenten Rahmen\n(statt Schatten) \u2014 konsistent zum \u201eWas wird optimiert\"-Block.<\/li>\n<\/ul>\n\n<h4>0.10.9<\/h4>\n\n<ul>\n<li>\u201eDid you know?\"-Tipps zeigen keine Quellenangabe mehr \u2014 schlanker, die Aussagen\nstehen f\u00fcr sich.<\/li>\n<\/ul>\n\n<h4>0.10.8<\/h4>\n\n<ul>\n<li>Neue \u201eDid you know?\"-Karte unter den Buttons mit rotierenden Performance- und\nOptimierungs-Tipps (alle paar Sekunden ein neuer; respektiert reduced-motion).<\/li>\n<\/ul>\n\n<h4>0.10.7<\/h4>\n\n<ul>\n<li>\u201eDownload optimized assets (ZIP)\" und \u201eUndo optimizations\" sind jetzt deaktiviert,\nsolange noch nichts optimiert wurde (es gibt dann nichts zu herunterladen\/r\u00fcckg\u00e4ngig).<\/li>\n<li>Kleiner UI-Feinschliff: der \u201eWas wird optimiert\"-Hinweis hat jetzt einen dezenten Rahmen.<\/li>\n<\/ul>\n\n<h4>0.10.6<\/h4>\n\n<ul>\n<li>Fix: Eine bereits optimierte Seite erneut optimieren zeigte \u201eDownload failed\u201c, obwohl\nalles in Ordnung war (es gab schlicht nichts Neues zu optimieren). Jetzt wird das als\nerfolgreicher Lauf angezeigt \u2014 die bestehende Optimierung bleibt erhalten.<\/li>\n<\/ul>\n\n<h4>0.10.5<\/h4>\n\n<ul>\n<li>Neuer Admin-Hinweis \"Was wird optimiert \u2014 und was nicht\" (aufklappbar): Gr\u00f6\u00dfen-Schwellen\n(Bilder ab 10 KB, Fonts ab 50 KB), bereits optimale Formate (AVIF\/SVG bleiben unber\u00fchrt),\nnur eigene Domain, Originale als Fallback.<\/li>\n<li>readme\/Beschreibung auf den aktuellen Stand gebracht (CSS-Backgrounds als AVIF, echtes\nFont-Ersetzen + Google-Fonts-Entfernung \u2014 war veraltet als \"noch nicht\" beschrieben).<\/li>\n<\/ul>\n\n<h4>0.10.4<\/h4>\n\n<ul>\n<li>Plugin-Check: translators-Kommentar f\u00fcr die Total-Vorlage erg\u00e4nzt (Internationalisierung).<\/li>\n<\/ul>\n\n<h4>0.10.3<\/h4>\n\n<ul>\n<li>Fix: Einzelne Fonts lie\u00dfen sich in der Detail-Liste nicht abw\u00e4hlen (interner\nSchl\u00fcssel-Fehler) \u2014 jetzt per Font-Familie schaltbar wie Bilder.<\/li>\n<li>Die \"Total\"-Ersparnis aktualisiert sich jetzt sofort, wenn ein Asset ab- oder\nzugew\u00e4hlt wird (z\u00e4hlt nur noch die aktiven Assets).<\/li>\n<\/ul>\n\n<h4>0.10.2<\/h4>\n\n<ul>\n<li>Fix: Beim Optimieren mehrerer Seiten wurde die zweite Seite manchmal als \"Skipped\"\n\u00fcbersprungen, obwohl Kontingent frei war (ein vorheriger Lauf war gerade fertig, aber\nder Server-Slot noch belegt). Das Plugin wartet jetzt kurz und versucht es erneut,\nstatt sofort abzubrechen. \"Skipped\" erscheint nur noch bei wirklich ersch\u00f6pftem Kontingent.<\/li>\n<\/ul>\n\n<h4>0.10.1<\/h4>\n\n<ul>\n<li>Fix: literales \"$1\" vor dem @font-face-Block entfernt (preg_replace-Backreference).<\/li>\n<li>Auch dns-prefetch\/preconnect-Hints auf fonts.googleapis.com\/gstatic.com werden entfernt,\nwenn Fonts lokal ausgeliefert werden \u2014 kein Google-Kontakt mehr.<\/li>\n<\/ul>\n\n<h4>0.10.0<\/h4>\n\n<ul>\n<li>Fonts werden jetzt wirklich ersetzt: Google-Fonts-Links werden entfernt, subsetted Fonts\nper @font-face injiziert. DSGVO-Leak (IP an Google) damit geschlossen.<\/li>\n<\/ul>\n\n<h4>0.9.6<\/h4>\n\n<ul>\n<li>Deutlicherer Pfeil (\u2794) in der Ersparnis-Anzeige statt des d\u00fcnnen \u2192 (war mit \u2014 verwechselbar).<\/li>\n<\/ul>\n\n<h4>0.9.5<\/h4>\n\n<ul>\n<li>\"Undo optimizations\" l\u00e4dt die Seite neu (Detail-Zeilen, Schalter, Total\nverschwinden sauber). Total zeigt \"(\u2212X% saved)\".<\/li>\n<\/ul>\n\n<h4>0.9.4<\/h4>\n\n<ul>\n<li>\"Undo optimizations\" setzt jetzt alle Auswahl-Checkboxen zur\u00fcck.<\/li>\n<\/ul>\n\n<h4>0.9.3<\/h4>\n\n<ul>\n<li>CSS-Background-Eintrag in der Liste klarer beschriftet: \"(CSS background image)\" statt\ndes kryptischen langen Selektors.<\/li>\n<\/ul>\n\n<h4>0.9.2<\/h4>\n\n<ul>\n<li>CSS-Background: body.fepo wird vor JEDEN Teil einer komma-getrennten Selektor-\nGruppe gesetzt (vorher nur der erste \u2192 Rest verlor die Spezifit\u00e4t).<\/li>\n<\/ul>\n\n<h4>0.9.1<\/h4>\n\n<ul>\n<li>Plugin-Check: $_POST[enabled] im Asset-Switch sanitized (ValidatedSanitizedInput).<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>CSS-Background-Bilder werden als AVIF ausgeliefert (additiv per Style-Block, kein CSS-Eingriff); pro Background ein An\/Aus-Schalter.<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li>Asset-Switch: einzelne optimierte Bilder\/Fonts pro Seite an\/aus schalten\n(Schalter in der Detail-Liste). Aus = Original wird ausgeliefert; reversibel, nichts\nwird gel\u00f6scht. \u00dcberlebt Re-Optimierung.<\/li>\n<\/ul>\n\n<h4>0.7.1<\/h4>\n\n<ul>\n<li>decoding=\"async\" wird an optimierten Bildern erg\u00e4nzt (asynchrones Dekodieren,\nblockiert das Rendering nicht) \u2014 nur wo noch kein decoding gesetzt ist.<\/li>\n<\/ul>\n\n<h4>0.7.0<\/h4>\n\n<ul>\n<li>Mehr Erkl\u00e4rtext im Admin (was das Plugin macht) + CDN-Tipp mit Link zu YouTube-Guides.<\/li>\n<li>Total-Zeile vereinfacht: \"Total: X \u2192 Y (\u2212Z%)\" (ohne redundantes \"saved\").<\/li>\n<\/ul>\n\n<h4>0.6.6<\/h4>\n\n<ul>\n<li>Gesamt-Ersparnis konsistent zum Datei-Format: \"Total: 3.6 MB \u2192 1.1 MB (\u221270%, 2.5 MB saved)\".<\/li>\n<\/ul>\n\n<h4>0.6.5<\/h4>\n\n<ul>\n<li>Gesamt-Ersparnis unter der Tabelle: \"Total saved: X MB (\u2212Y%)\" \u00fcber alle Seiten.<\/li>\n<\/ul>\n\n<h4>0.6.4<\/h4>\n\n<ul>\n<li>Quota-Zeile aus dem Admin entfernt (Seiten-Quota war nur Platzhalter).<\/li>\n<\/ul>\n\n<h4>0.6.3<\/h4>\n\n<ul>\n<li>Zeilen-Checkbox vertikal sauber (margin-top entfernt).<\/li>\n<\/ul>\n\n<h4>0.6.2<\/h4>\n\n<ul>\n<li>Header-Checkbox feiner ausgerichtet.<\/li>\n<\/ul>\n\n<h4>0.6.1<\/h4>\n\n<ul>\n<li>Optimierte Seiten: dezent gr\u00fcner Zeilen-Hintergrund (auf einen Blick erkennbar).<\/li>\n<\/ul>\n\n<h4>0.6.0<\/h4>\n\n<ul>\n<li>Eigenes Consent-Gate (DSGVO Art. 7): Einwilligung zur Daten\u00fcbertragung an fepo,\nbevor optimiert werden kann \u2014 mit Datenschutz-Link, nachweisbar gespeichert\n(Timestamp + Text-Hash). Macht das Plugin eigenst\u00e4ndig (vorher auf fepo-audit angewiesen).<\/li>\n<\/ul>\n\n<h4>0.5.3<\/h4>\n\n<ul>\n<li>Datei-Ersparnis zeigt jetzt das Zielformat: \"46 KB \u2192 19.8 KB \u00b7 AVIF (\u221257%)\",\nFonts mit WOFF2.<\/li>\n<\/ul>\n\n<h4>0.5.2<\/h4>\n\n<ul>\n<li>Checkbox-Spalte kompakter.<\/li>\n<\/ul>\n\n<h4>0.5.1<\/h4>\n\n<ul>\n<li>Sanfte \u00dcberg\u00e4nge: Status-Vierecke (Farbwechsel) + Overlay (Einblenden) 0.333s.\nTabelle: Scrollbar immer sichtbar (kein Layout-Sprung).<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Datei-Ersparnis klarer: \"Original \u2192 Optimiert (\u2212%)\" statt nur der gesparten KB\n(z.B. 744 KB \u2192 23 KB (\u221297%)). Gro\u00dfe Werte als MB.<\/li>\n<\/ul>\n\n<h4>0.4.9<\/h4>\n\n<ul>\n<li>Plugin-Check: tr-class \u00fcber esc_attr ausgegeben (Escaping).<\/li>\n<\/ul>\n\n<h4>0.4.8<\/h4>\n\n<ul>\n<li>Status-Spalte als farbiges Viereck: gr\u00fcn (optimiert, klickbar f\u00fcr Details +\/\u2212),\nrot bei Fehler (Tooltip mit Meldung). Fehlgeschlagene L\u00e4ufe werden pro Seite gemerkt.<\/li>\n<\/ul>\n\n<h4>0.4.7<\/h4>\n\n<ul>\n<li>Detail-Aufklapper zeigt pro optimierter Datei die Ersparnis (Dateiname \u2014 % \u00b7 KB).<\/li>\n<li>Bilder unter 10 KB werden nicht mehr optimiert (lohnt nicht).<\/li>\n<\/ul>\n\n<h4>0.4.6<\/h4>\n\n<ul>\n<li>Optimierte Seiten in der Liste hervorgehoben (Seitenname fett + gr\u00fcn).<\/li>\n<\/ul>\n\n<h4>0.4.5<\/h4>\n\n<ul>\n<li>Fix: Optimizing-Overlay war IMMER sichtbar (CSS display:flex \u00fcberschrieb das\nhidden-Attribut). Jetzt korrekt nur w\u00e4hrend der Optimierung. Das war die\neigentliche Ursache der blockierten Tabelle.<\/li>\n<\/ul>\n\n<h4>0.4.4<\/h4>\n\n<ul>\n<li>Fix: Overlay blieb h\u00e4ngen, wenn ein Run in der Warteliste dem Backend nicht\nmehr bekannt war (404). Solche Eintr\u00e4ge werden jetzt entfernt statt ewig behalten.<\/li>\n<\/ul>\n\n<h4>0.4.3<\/h4>\n\n<ul>\n<li>Beim Deaktivieren\/L\u00f6schen des Plugins werden wartende Optimierungs-L\u00e4ufe im\nfepo-Backend sofort abgebrochen (keine sinnlose Queue-Arbeit mehr).<\/li>\n<\/ul>\n\n<h4>0.4.2<\/h4>\n\n<ul>\n<li>Fix: Overlay erschien sofort beim Seitenaufruf (alte\/erledigte Runs in der\nPending-Liste). Jetzt wird die Liste VOR dem Anzeigen aufger\u00e4umt \u2014 Overlay nur\nbei wirklich laufendem Lauf.<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>Plugin-Check sauber: translators-Kommentare, Datei-Operationen \u00fcber WP_Filesystem\n(Download + uninstall), pr\u00e4fixierte Variablen in uninstall.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Optimizing-Overlay: w\u00e4hrend der Optimierung legt sich ein Spinner-Overlay\n\"Optimizing\u2026\" \u00fcber die Tabelle, Buttons sind gesperrt. Erscheint auch beim\nZur\u00fcckkehren auf die Seite, wenn noch ein Lauf offen ist (Tab verlassen + zur\u00fcck).<\/li>\n<li>Seitentabelle: max. ~10 Zeilen sichtbar, dann scrollbar (Sticky-Header).<\/li>\n<\/ul>\n\n<h4>0.3.6<\/h4>\n\n<ul>\n<li>Detail-Zeile zeigt \"(N new)\" jetzt immer \u2014 auch \"(0 new)\" bei Re-Runs ohne\n\u00c4nderung (zeigt: Lauf erfolgt, nichts Neues optimiert).<\/li>\n<\/ul>\n\n<h4>0.3.5<\/h4>\n\n<ul>\n<li>Re-Optimieren verschlechtert das Manifest nicht mehr: sieht ein erneuter Lauf\ndurch Timing\/Lazy-Load weniger Assets, bleiben die bereits optimierten erhalten\n(Merge statt \u00dcberschreiben). Verhindert verschwundene  bei Re-Runs.<\/li>\n<\/ul>\n\n<h4>0.3.4<\/h4>\n\n<ul>\n<li>Nach dem Optimieren l\u00e4dt die Seite neu (Status + Detail-Aufklapper erscheinen).\nDetail-Zeile: \"x fonts (a new), y images (b new)\" \u2014 \u00c4nderung jetzt pro Asset-Typ.<\/li>\n<\/ul>\n\n<h4>0.3.3<\/h4>\n\n<ul>\n<li>Status-Spalte: + zum Aufklappen pro optimierter Seite (Detail-Zeile mit\n\"Last optimized: Datum\/Uhrzeit \u2014 x Fonts, y Bilder\" + \u00c4nderung). Zebra-Streifen.<\/li>\n<\/ul>\n\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>Status-Spalte klarer: zeigt Datum + \"X Bilder, Y Fonts\" (statt verwirrendem\nnew\/replaced\/removed) und ist breiter. Visueller Feinschliff folgt.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Plugin-Version im Admin angezeigt (wie die anderen fepo-Plugins). Beim L\u00f6schen\ndes Plugins werden jetzt die eigenen Dateien (uploads\/fepo\/optimized\/, manifest.json)\n\n<ul>\n<li>Optionen aufger\u00e4umt \u2014 geteilte fepo-Daten bleiben unangetastet.<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Robuster Abschluss: optimierte Assets werden auch dann \u00fcbernommen, wenn die\nPlugin-Seite w\u00e4hrend der Optimierung verlassen wird (WP-Cron + beim \u00d6ffnen).<\/li>\n<li>Status-Anzeige: \"Zuletzt optimiert\" + pro Seite Datum + \u00c4nderungs-Diff\n(neu\/ersetzt\/entfernt). Download-Button f\u00fcr die optimierten Assets (ZIP).<\/li>\n<\/ul>\n\n<h4>0.2.4<\/h4>\n\n<ul>\n<li>\"Reset all\" umbenannt in \"Undo optimizations\" (klarer) + Best\u00e4tigungsdialog.<\/li>\n<\/ul>\n\n<h4>0.2.3<\/h4>\n\n<ul>\n<li>Nonce-Pr\u00fcfung (check_ajax_referer) inline in jeden AJAX-Handler \u2014 Plugin-Check\nerkennt sie jetzt. K\u00fcrzere optimierte Font-Dateinamen (Family..woff2).\nVersionsangaben (Header\/Stable tag) synchronisiert.<\/li>\n<\/ul>\n\n<h4>0.2.2<\/h4>\n\n<ul>\n<li>Plugin-Check-Konformit\u00e4t: i18n-Platzhalter geordnet, Doku der bekannten Grenzen\n(Fonts werden vorerst nur vorgeladen, nicht ersetzt; CSS-Hintergr\u00fcnde\/JS-Bilder\/\nHintergrund-Videos werden nicht optimiert).<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Free-Kontingent ist jetzt ein Gesamt-Limit (3 Seiten total) statt monatlich \u2014 wie beim Audit.\nPaid-Pl\u00e4ne bleiben monatlich. Vorab-Pr\u00fcfung: bei mehr gew\u00e4hlten Seiten als Kontingent warnt\ndas Plugin und optimiert nur die erlaubte Anzahl (statt mitten im Lauf zu scheitern).<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Optimierungs-Flow funktionsf\u00e4hig: Slim-Run starten, Status pollen bis fertig,\noptimierte Assets laden + entpacken (WP-natives unzip_file, PHP-7.4-sicher),\nManifest mit echtem Mapping schreiben. Output-Filter rendert  + Font-Preload.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Skeleton: plugin structure, hooks, class stubs. No optimisation logic yet.<\/li>\n<\/ul>","raw_excerpt":"Modern WebP\/AVIF images and subsetted fonts your site already has \u2014 added safely, originals kept as fallback. Powered by fepo.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/352180","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=352180"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/fepo"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=352180"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=352180"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=352180"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=352180"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=352180"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=352180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}