{"id":398028,"date":"2026-11-08T06:15:01","date_gmt":"2026-11-08T06:15:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/font-speed-fix\/"},"modified":"2026-11-08T19:54:52","modified_gmt":"2026-11-08T19:54:52","slug":"peakspire-font-loading","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/peakspire-font-loading\/","author":23598265,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.5","stable_tag":"1.0.5","tested":"7.1.4","requires":"6.9","requires_php":"7.4","requires_plugins":null,"header_name":"Peakspire Font Loading Optimizer","header_author":"PeakSpire","header_description":"The complete font-loading toolkit: preloads your local WOFF2 fonts, forces font-display swap everywhere, and can remove external Google Fonts requests. Built from real Core Web Vitals engineering.","assets_banners_color":"39394a","last_updated":"2026-11-08 19:54:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/peakspire.ca","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":102,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.5":{"tag":"1.0.5","author":"peakspire","date":"2026-11-08 19:54:52","revision":3791448}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3790631,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3790530,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3790530,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.5"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings screen - all fixes with sensible defaults.","2":"Preload tags in the page source - local WOFF2 fonts preloaded in the head ahead of stylesheet parsing, on a theme that enqueues fonts from an external stylesheet.","3":"font-display: swap injected into an inline @font-face rule that previously shipped no font-display descriptor."}},"plugin_section":[],"plugin_tags":[2221,3778,247,11676,794],"plugin_category":[52,54],"plugin_contributors":[291457],"plugin_business_model":[],"class_list":["post-398028","plugin","type-plugin","status-publish","hentry","plugin_tags-fonts","plugin_tags-google-fonts","plugin_tags-performance","plugin_tags-preload","plugin_tags-speed","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_contributors-peakspire","plugin_committers-peakspire"],"banners":{"banner":"https:\/\/ps.w.org\/peakspire-font-loading\/assets\/banner-772x250.png?rev=3790530","banner_2x":"https:\/\/ps.w.org\/peakspire-font-loading\/assets\/banner-1544x500.png?rev=3790530","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/peakspire-font-loading\/assets\/icon-256x256.png?rev=3790631","icon_2x":"https:\/\/ps.w.org\/peakspire-font-loading\/assets\/icon-256x256.png?rev=3790631","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Font loading is one of the largest contributors to Largest Contentful Paint (LCP) on real websites. Peakspire Font Loading Optimizer applies the three highest-impact font fixes, built from hands-on Core Web Vitals engineering on production sites:<\/p>\n\n<ol>\n<li><p><strong>Preload local WOFF2 fonts<\/strong> - Scans your enqueued stylesheets for locally hosted WOFF2 files and adds <code>&lt;link rel=\"preload\"&gt;<\/code> tags, capped at 4 fonts. Preloaded fonts arrive before the browser discovers them inside CSS files, removing the font round-trip from the critical path.<\/p><\/li>\n<li><p><strong>Adds <code>font-display: swap<\/code> to eligible inline <code>@font-face<\/code> rules<\/strong> - Rules that already declare an explicit <code>optional<\/code>, <code>block<\/code>, <code>fallback<\/code>, or <code>auto<\/code> value are never touched. Rules without a descriptor get <code>swap<\/code>, so text renders immediately with the fallback font instead of sitting invisible while web fonts download.<\/p><\/li>\n<li><p><strong>Remove external Google Fonts (optional)<\/strong> - Dequeues all fonts.googleapis.com requests for sites that have self-hosted their fonts.<\/p><\/li>\n<li><p><strong>Remove dashicons for visitors (optional)<\/strong> - Dequeues the dashicons stylesheet for logged-out visitors, saving a render-blocking request most themes never use on the front end.<\/p><\/li>\n<\/ol>\n\n<p>Everything is front-end only and safe to use alongside caching plugins (WP Rocket, LiteSpeed Cache, W3 Total Cache, etc.).<\/p>\n\n<h4>Why only local fonts are preloaded<\/h4>\n\n<p>Cross-origin font preloads waste bandwidth when the crossorigin fetch does not match the stylesheet fetch. This plugin deliberately preloads only same-host WOFF2 files, the safe default for virtually all themes that self-host fonts.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>peakspire-font-loading<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install via the Plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open Settings \u2192 Peakspire Font Loading Optimizer. Preload and font-display are on by default; both are recommended.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20fonts%20does%20this%20preload%3F\"><h3>Which fonts does this preload?<\/h3><\/dt>\n<dd><p>WOFF2 files hosted on your own domain that are referenced from enqueued external stylesheets, up to a static maximum of 4 per page. Fonts declared inline in the HTML head are deliberately NOT preloaded: the browser already discovers those at parse time, so preloading them adds bandwidth cost without benefit (measured: a ~0.9s LCP regression on an inline-declaring theme before this rule was enforced). This is a deliberate simplicity tradeoff: the plugin does not measure per-page font relevance (paid performance suites do). For most sites with 2-4 font families, the cap is the right size.<\/p><\/dd>\n<dt id=\"does%20this%20replace%20a%20font-localization%20plugin%20like%20omgf%3F\"><h3>Does this replace a font-localization plugin like OMGF?<\/h3><\/dt>\n<dd><p>No - it complements one. Localization plugins handle fonts sourced from Google\/Bunny CDNs. This plugin handles the other half: the fonts your theme or builder already bundles locally. Use both if you have both.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20caching%20plugins%3F\"><h3>Does this work with caching plugins?<\/h3><\/dt>\n<dd><p>Yes. All changes are front-end output (preload tags and CSS descriptor injection). Nothing modifies your theme files or cache behavior.<\/p><\/dd>\n<dt id=\"which%20fonts%20get%20preloaded%3F\"><h3>Which fonts get preloaded?<\/h3><\/dt>\n<dd><p>Only WOFF2 files hosted on your own domain that are referenced from your enqueued stylesheets, up to a maximum of 4. Preloading more fonts typically hurts more than it helps.<\/p><\/dd>\n<dt id=\"what%20if%20my%20fonts%20come%20from%20google%20fonts%3F\"><h3>What if my fonts come from Google Fonts?<\/h3><\/dt>\n<dd><p>Enable the \"Remove external Google Fonts\" option only after self-hosting your fonts. Sites not ready for that step should leave it off.<\/p><\/dd>\n<dt id=\"is%20the%20font-display%20change%20safe%20for%20my%20design%3F\"><h3>Is the font-display change safe for my design?<\/h3><\/dt>\n<dd><p>font-display: swap shows the fallback font until your web font loads, then swaps. It is the descriptor Google recommends and the default in most modern themes.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Discovery prioritization: same-host stylesheets scanned first; CDN-hosted stylesheets no longer consume scan slots (they cannot yield same-host WOFF2 URLs)<\/li>\n<li>Real-theme tested on Twenty Twenty-Four: external CSS fonts correctly preloaded, inline declarations correctly skipped<\/li>\n<li>PHP 7.4 literal execution verified (Docker php:7.4-cli, lint + token scan)<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Security hardening: SSRF defense (private\/loopback\/link-local IP deny-list before fetch), cache-hit re-validation (same-host + is_string on every cached entry), corrupt-lock-value recovery (stale-reclaimable, not live-forever)<\/li>\n<li>Availability: preg_replace NULL guard on backtrack-limit exhaustion (never blanks a page)<\/li>\n<li>CSS correctness: @font-face rewrite scoped to <\/li>\n<li>Measured: zero LCP regression on inline-font themes; preload timing verified on external-CSS pages<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: WOFF2 preload discovery, global font-display:swap injection, optional Google Fonts removal, optional dashicons removal for guests.<\/li>\n<\/ul>","raw_excerpt":"Speed up WordPress font loading: preloads self-hosted WOFF2 fonts, adds font-display swap, and removes render-blocking requests for faster LCP.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/398028","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=398028"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/peakspire"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=398028"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=398028"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=398028"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=398028"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=398028"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=398028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}