{"id":367792,"date":"2026-09-16T16:05:48","date_gmt":"2026-09-16T16:05:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/wonderful-selfhosted-fonts\/"},"modified":"2026-09-16T16:05:14","modified_gmt":"2026-09-16T16:05:14","slug":"wonderful-selfhosted-fonts","status":"publish","type":"plugin","link":"https:\/\/sv.wordpress.org\/plugins\/wonderful-selfhosted-fonts\/","author":23357214,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.1","requires":"6.9","requires_php":"7.4","requires_plugins":null,"header_name":"Wonderful Selfhosted Fonts","header_author":"Wonderful Plugins","header_description":"GDPR-friendly web fonts: lists every font your site loads from Google, Font Awesome and other third-party hosts, shows which plugin or theme asked for it, and serves the ones you pick from your own server instead.","assets_banners_color":"","last_updated":"2026-09-16 16:05:14","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wonderfulplugins.eu\/wonderful-selfhosted-fonts","header_author_uri":"https:\/\/wonderfulplugins.eu","rating":0,"author_block_rating":0,"active_installs":0,"downloads":46,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"wonderfulplugins","date":"2026-09-16 16:05:14","revision":3698959}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3698959,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3698959,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1-de.jpg":{"filename":"screenshot-1-de.jpg","revision":3698959,"resolution":"1","location":"assets","locale":"de","width":1600,"height":944},"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3698959,"resolution":"1","location":"assets","locale":"","width":1600,"height":944},"screenshot-2-de.jpg":{"filename":"screenshot-2-de.jpg","revision":3698959,"resolution":"2","location":"assets","locale":"de","width":1600,"height":1045},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3698959,"resolution":"2","location":"assets","locale":"","width":1600,"height":1045}},"screenshots":{"1":"Every web font the site loads from a third-party host, with the plugin or theme that asked for it \u2014 before anything is stored locally.","2":"After storing them locally: each stylesheet lists the font files it pulled in, and everything is served from the site's own domain."}},"plugin_section":[],"plugin_tags":[154545,131785,3778,396,274027],"plugin_category":[54],"plugin_contributors":[247385],"plugin_business_model":[],"class_list":["post-367792","plugin","type-plugin","status-publish","hentry","plugin_tags-dsgvo","plugin_tags-gdpr","plugin_tags-google-fonts","plugin_tags-privacy","plugin_tags-self-hosted-fonts","plugin_category-security-and-spam-protection","plugin_contributors-wonderfulplugins","plugin_committers-wonderfulplugins"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wonderful-selfhosted-fonts\/assets\/icon-128x128.png?rev=3698959","icon_2x":"https:\/\/ps.w.org\/wonderful-selfhosted-fonts\/assets\/icon-256x256.png?rev=3698959","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/wonderful-selfhosted-fonts\/assets\/screenshot-1.jpg?rev=3698959","caption":"Every web font the site loads from a third-party host, with the plugin or theme that asked for it \u2014 before anything is stored locally."},{"src":"https:\/\/ps.w.org\/wonderful-selfhosted-fonts\/assets\/screenshot-2.jpg?rev=3698959","caption":"After storing them locally: each stylesheet lists the font files it pulled in, and everything is served from the site's own domain."}],"raw_content":"<!--section=description-->\n<h4>Why self-host fonts at all?<\/h4>\n\n<p>Every web font a page pulls from someone else's server tells that server who is\nvisiting. Before a single letter appears, the browser has to send the visitor's\nIP address, the referring page and the user agent to that provider. Nothing is\ncached away, nothing is anonymous \u2014 it happens on every page view, for every\nvisitor.<\/p>\n\n<p>In the EU that is a data transfer, and it needs a legal basis. A German court\ndecided in January 2022 (LG M\u00fcnchen I, 3 O 17493\/20) that embedding Google Fonts\nwithout consent violates the GDPR, and awarded damages to the plaintiff; a wave\nof warning letters followed. The same reasoning applies to Font Awesome, to icon\nfonts pulled from a CDN, and to any other font host.<\/p>\n\n<p>Serving the fonts from your own domain removes the problem at its source: no\nthird party is contacted, so there is nothing to consent to and nothing to\ndeclare. Your pages also stop depending on someone else's uptime.<\/p>\n\n<p>This plugin removes those requests. Whether your site is compliant overall is a\nlegal question, and no plugin can answer that for you.<\/p>\n\n<h4>Why another font plugin?<\/h4>\n\n<p>Web fonts arrive on a WordPress site in more than one way. A theme may enqueue a\nstylesheet, a page builder may write the font CSS straight into the page, and a\nstylesheet from a CDN may pull in font files of its own. Tools that only filter\nenqueued stylesheets see the first case and miss the rest \u2014 which is why fonts\noften still load from a third party after a font localiser reports success.<\/p>\n\n<p>This plugin looks in all three places, lists what it finds, and tells you where\neach request came from. Nothing is downloaded until you say so.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>Lists every third-party font<\/strong> the site loads, with the family name, the provider and the page it was first seen on.<\/li>\n<li><strong>Names the source.<\/strong> Each entry shows the plugin or theme that requested it and the stylesheet handle behind it, so you can go and fix the cause rather than only the symptom.<\/li>\n<li><strong>Stores fonts locally on request.<\/strong> One setting, \"Store pending fonts locally\": tick it and everything the table lists as waiting is mirrored \u2014 stylesheets together with the font files they reference.<\/li>\n<li><strong>Survives a move.<\/strong> Mirrored files reference each other by name, not by address, so copying the site from staging to the live domain \u2014 or from an IP to a host name \u2014 leaves the fonts working.<\/li>\n<li><strong>Works with page builders.<\/strong> Font CSS written directly into the page is picked up too, not just properly enqueued stylesheets. Divi is supported through its own filter as well.<\/li>\n<li><strong>Removes the leftovers.<\/strong> Preconnect and DNS-prefetch hints for hosts you no longer load from are dropped, because a hint still opens a connection.<\/li>\n<li><strong>Respects font licences.<\/strong> Providers whose terms forbid self-hosting \u2014 Adobe Fonts, Monotype and the like \u2014 are listed with an explanation and never downloaded.<\/li>\n<\/ul>\n\n<h4>What it deliberately does not do<\/h4>\n\n<ul>\n<li><strong>reCAPTCHA cannot be fixed this way.<\/strong> The widget runs inside an iframe served by Google. What happens in there is out of reach for any WordPress plugin. If that matters for you, replace the captcha rather than trying to localise it.<\/li>\n<li><strong>Fonts injected by JavaScript at runtime<\/strong> are not visible to server-side detection.<\/li>\n<li><strong>Icons are not fonts.<\/strong> Recent Font Awesome versions ship SVG plus JavaScript; this plugin mirrors font files, not icon sprites.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin exists to <em>end<\/em> the connections your site makes to third-party font\nhosts. It never loads a script, stylesheet, image or font from a remote server\ninto your pages, and it contacts no service of ours: there is no account, no\nAPI key, no registration and no telemetry.<\/p>\n\n<p>The one thing it does over the network is the localisation itself, and it is\nthe service this plugin provides: it downloads a copy of the font stylesheets\nand font files your site is <strong>already<\/strong> loading from a third party, stores them\nunder <code>wp-content\/uploads\/wonderful-selfhosted-fonts\/<\/code>, and serves them from\nyour own domain from then on. A request happens only after you tick \"Store\npending fonts locally\" in the settings and save, or on the hourly schedule if\nyou switch that on yourself. Nothing is downloaded while a page is rendered.<\/p>\n\n<p>Which hosts are contacted therefore depends entirely on what your own site\nloads, and on nothing this plugin decides. The names below are the detection\nlist \u2014 the hosts the plugin recognises as font providers so that it can offer\nto take their files off your pages. They are not assets it loads:<\/p>\n\n<ul>\n<li>Google Fonts \u2014 fonts.googleapis.com, fonts.gstatic.com, themes.googleusercontent.com \u2014 privacy policy: https:\/\/policies.google.com\/privacy , terms: https:\/\/policies.google.com\/terms<\/li>\n<li>Bunny Fonts \u2014 fonts.bunny.net \u2014 privacy policy: https:\/\/bunny.net\/privacy , terms: https:\/\/bunny.net\/tos<\/li>\n<li>Font Awesome \u2014 use.fontawesome.com, kit.fontawesome.com, ka-p.fontawesome.com, kit-free.fontawesome.com \u2014 privacy policy: https:\/\/fontawesome.com\/privacy , terms: https:\/\/fontawesome.com\/license<\/li>\n<li>jsDelivr \u2014 cdn.jsdelivr.net \u2014 privacy policy: https:\/\/www.jsdelivr.com\/terms\/privacy-policy , terms: https:\/\/www.jsdelivr.com\/terms<\/li>\n<li>BootstrapCDN \u2014 maxcdn.bootstrapcdn.com, stackpath.bootstrapcdn.com \u2014 operated by jsDelivr, privacy policy: https:\/\/www.jsdelivr.com\/terms\/privacy-policy , terms: https:\/\/www.jsdelivr.com\/terms<\/li>\n<li>cdnjs \u2014 cdnjs.cloudflare.com \u2014 privacy policy: https:\/\/www.cloudflare.com\/privacypolicy\/ , terms: https:\/\/www.cloudflare.com\/website-terms\/<\/li>\n<li>unpkg \u2014 unpkg.com \u2014 served on Cloudflare, privacy policy: https:\/\/www.cloudflare.com\/privacypolicy\/ , project page: https:\/\/unpkg.com\/<\/li>\n<\/ul>\n\n<p>Providers whose licence forbids self-hosting are recognised as well, so that\nthey can be reported to you with an explanation. They are listed and never\ndownloaded from: Adobe Fonts (use.typekit.net, p.typekit.net), Monotype\n(fast.fonts.net) and Hoefler &amp; Co. (cloud.typography.com).<\/p>\n\n<p>Any other font host can be added by name in the settings, one per line; those\nare treated exactly the same way and are contacted only by the same explicit\naction. Only the URL of the font resource is requested \u2014 no data about your\nsite or its visitors is transmitted.<\/p>\n\n<p>The \"Check front page now\" button requests a page of your own site, nothing else.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Go to Settings \u2192 Selfhosted Fonts.<\/li>\n<li>Open your site once, or use \"Check front page now\".<\/li>\n<li>Review the list, then tick \"Store pending fonts locally\" under Settings and save.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20of%20my%20plugins%20is%20actually%20loading%20a%20font%20from%20google%3F\"><h3>Which of my plugins is actually loading a font from Google?<\/h3><\/dt>\n<dd><p>That is the first column of the table. The plugin reads the stylesheet handle\nWordPress prints with every asset, and resolves it to the plugin or theme behind\nit \u2014 so you can fix the cause instead of just the symptom, or decide the feature\nis not worth the request at all.<\/p><\/dd>\n<dt id=\"does%20this%20send%20anything%20anywhere%20on%20its%20own%3F\"><h3>Does this send anything anywhere on its own?<\/h3><\/dt>\n<dd><p>No. Detection is entirely local. Files are downloaded only once you tick\n\"Store pending fonts locally\" and save, or on the hourly schedule if you switch\nthat on yourself.<\/p><\/dd>\n<dt id=\"my%20font%20localiser%20said%20everything%20was%20fine%2C%20yet%20fonts%20still%20load%20from%20google.\"><h3>My font localiser said everything was fine, yet fonts still load from Google.<\/h3><\/dt>\n<dd><p>That is the usual case with page builders. They fetch and inline the font CSS\nthemselves, so it never passes through the stylesheet filter other plugins hook\ninto. This plugin also searches the finished page output, which is where that\nCSS ends up. It reads that output through the template output buffer WordPress\n6.9 provides for the purpose, which is why that version is the minimum.<\/p><\/dd>\n<dt id=\"i%20moved%20the%20site%20to%20another%20domain.%20do%20i%20have%20to%20mirror%20everything%20again%3F\"><h3>I moved the site to another domain. Do I have to mirror everything again?<\/h3><\/dt>\n<dd><p>No. The stored files point at each other by file name, and the public address is\nrebuilt on every request, so a move is invisible to them. Copies made by earlier\nversions did contain the old address; opening the settings screen once after the\nmove repairs them and says so.<\/p><\/dd>\n<dt id=\"where%20are%20the%20files%20stored%3F\"><h3>Where are the files stored?<\/h3><\/dt>\n<dd><p>In <code>wp-content\/uploads\/wonderful-selfhosted-fonts\/<\/code>, protected against PHP\nexecution. Deleting the plugin removes the folder again.<\/p><\/dd>\n<dt id=\"can%20i%20add%20my%20own%20font%20host%3F\"><h3>Can I add my own font host?<\/h3><\/dt>\n<dd><p>Yes, one host name per line in the settings. Only stylesheets and font files are\ntaken from additional hosts.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"GDPR: stop sending visitor IPs to Google and other font hosts. See which plugin loads which font, and serve it from your own server.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/367792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=367792"}],"author":[{"embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wonderfulplugins"}],"wp:attachment":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=367792"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=367792"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=367792"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=367792"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=367792"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=367792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}