How to add custom fonts to WordPress (without slowing your site)
Four ways to add custom fonts to WordPress, plus how to host them locally for privacy and tune them so they don't wreck your Core Web Vitals.

Editorial opinion based on hands-on experience — not financial, investment, or professional advice. Some links may be affiliate links; see our disclosure.
- There are four ways to add fonts — the theme's own font settings, the Site Editor, a font plugin, or manual @font-face in a child theme. Most people need the first two.
- Loading fonts straight from Google sends every visitor's IP to Google's servers. Hosting the same fonts locally is faster and keeps you on the right side of GDPR.
- Fonts are a quiet Core Web Vitals killer. Each weight and style is a separate download, and a missing font-display rule causes the layout shift that tanks your CLS score.
- Before you install anything, check whether your theme already handles fonts well. Adding a plugin on top of a theme that's already sorted just adds weight.
01The four ways to add a custom font
| Check | Good sign | Fix before moving on |
|---|---|---|
| Backup | You can roll back the site or setting | No restore point exists |
| Staging | Change is tested on a copy first | Live site is the first test |
| Mobile | The result works on a narrow viewport | Layout only works on desktop |
| Performance | No large new asset or plugin is added casually | The change slows every page |
Adding a font to WordPress sounds like one task, but there are four routes to it, and they trade off control against effort. Pick by how much you need to customize, not by which tutorial you read first.
1. Your theme's built-in font settings
Most modern themes ship a typography panel under Appearance → Customize (classic themes) where you pick heading and body fonts from a built-in list. This is the easiest route, and on a well-built theme it's all you need. The catch: many of these panels pull fonts live from Google, which has a privacy cost we cover below.
2. The Site Editor and global styles
On a block theme, go to Appearance → Editor → Styles → Typography. You set fonts globally and they cascade everywhere. WordPress now includes a Font Library here — open the Styles panel, click the fonts manager, and you can install Google Fonts or upload your own .woff2 files directly into the site.
The Font Library is the cleanest native option. Uploading your own files means the font is hosted on your server from the start, which sidesteps the Google privacy problem entirely.
3. A dedicated font plugin
If your theme has no font controls and you're not on a block theme, a plugin fills the gap. The good ones let you add Google Fonts, Adobe Fonts, or custom uploads, and — critically — the better ones download Google's fonts to your own server automatically. Look for that local-hosting feature; it's the whole point.
4. Manual @font-face in a child theme
The most control, the most effort. You drop the font files into your child theme and write the @font-face CSS yourself. This is the right call when you have a licensed commercial font, a brand font, or you need exact control over which weights load. We'll walk through it in the local-hosting section.
02Why where the font loads from matters
Before touching files, understand the choice underneath all four methods: does the font load from Google's servers, or from yours? It sounds like a technical footnote. It's actually a privacy and a speed decision at once.
When a page loads a font straight from fonts.googleapis.com, every visitor's browser connects to Google to fetch it — handing Google their IP address and request headers in the process. A German court has already ruled that doing this without consent breaches GDPR, and similar challenges have followed across the EU.
Hosting the same font on your own server removes that third-party call completely. No visitor IP goes to Google, there's nothing to disclose in a consent banner for fonts, and you've also cut out an extra DNS lookup and connection. Privacy and performance pull in the same direction here, which is rare and worth taking advantage of.
The fonts themselves are mostly open-licensed (Google Fonts are free to self-host), so this isn't about licensing — it's purely about which server delivers the file. Self-hosting wins on both counts for the vast majority of sites.
03How to host fonts locally
Self-hosting a font comes down to three steps: get the files, put them on your server, and point CSS at them. Here's the manual version — plugins automate the same thing.
- Get `.woff2` files. This is the modern, smallest format and is supported by every current browser. For Google Fonts, a self-hosting helper tool gives you the
.woff2files plus ready-made CSS; for a commercial font, the foundry provides them. - Upload into your child theme. Create a
/fonts/folder inside your child theme and put the files there, so they survive theme updates. - Write the `@font-face` rule. In your child theme's stylesheet, declare each font, pointing
srcat your uploaded file.
A minimal rule looks like this: @font-face { font-family: 'Inter'; src: url('fonts/inter.woff2') format('woff2'); font-weight: 400; font-display: swap; }. Then use font-family: 'Inter' in your CSS as normal. Repeat one block per weight you actually need.
If @font-face editing isn't your thing, a self-hosting plugin does all three steps for you — it downloads Google's fonts to your server, generates the CSS, and rewrites your theme's Google calls to point local. That's the fastest path to the same result.
04Limit weights and variants — this is the big speed win
Here's the mistake that quietly costs the most: loading a whole font family when you use a fraction of it. A typeface might ship nine weights, each in regular and italic — that's eighteen separate files, and each one is a download a visitor has to wait for.
Open your design and count what you actually use. Most sites genuinely need three: a regular body weight, a bold, and one heading weight. Italics, light, semibold, black — if they don't appear on screen, every byte they cost is wasted on every page load.
- Pick 2–4 weights, no more. Body regular, body bold, one or two heading weights covers almost everything.
- Skip italics unless you use them. Italic is a separate file per weight; most sites never display real italic body text.
- Subset to your language. A Latin-only subset drops a font's size dramatically versus loading every script's glyphs you'll never show.
- Consider a variable font. One variable file can cover a whole weight range in a single download — often lighter than three static files for a multi-weight design.
Fonts are render-blocking by nature: text can't paint properly until they arrive, so they directly affect your Largest Contentful Paint. Cutting eighteen files to three is one of the cheapest Core Web Vitals wins available, and it costs nothing but a few minutes of pruning.
05font-display and avoiding layout shift
Even a well-chosen font can hurt your scores if the browser doesn't know what to do while it loads. That's what the font-display property controls, and it's the single most important font setting for Core Web Vitals.
Without it, browsers may hide your text entirely until the custom font downloads — the dreaded FOIT, or flash of invisible text. The page looks blank where words should be, which delays the moment a visitor can read anything.
Setting font-display: swap tells the browser to show text immediately in a fallback font, then swap in the custom one when it's ready. Visitors can read instantly. The trade-off is a brief flash of the fallback font (FOUT), which is almost always better than invisible text.
But the swap itself can cause layout shift — your Cumulative Layout Shift score — if the fallback and the real font are different sizes and the text reflows when they swap. The fix is to choose a fallback whose metrics are close to your custom font, and modern CSS descriptors like size-adjust let you match them so nothing jumps. Always declare a sensible font-family fallback stack, never just the custom name alone.
06When the theme already handles it
Before you install a font plugin or hand-write @font-face, check what your theme already does. A good modern theme has often solved this for you, and stacking your own solution on top just adds duplicate work and weight.
Open your browser's developer tools, load a page, and look at the network tab for font requests. If the files are coming from your own domain, the theme is already self-hosting — you may only need to limit the weights it loads. If they're coming from fonts.googleapis.com, that's your cue to switch to local hosting.
Many performance-focused themes and block themes now self-host by default and expose font choices in the Site Editor. In that case the whole job is: pick your fonts in the Styles panel, trim the weights, and confirm font-display is set. No plugin needed. The less you bolt on, the less there is to break on the next update.
07A quick checklist
Run through this before you call the font setup done. It catches the issues that don't show up until you test on a real connection.
- Self-hosted, not Google-served — no live calls to
fonts.googleapis.comin your network tab. - Only the weights you use — 2–4 weights, italics only if they appear on screen.
- `.woff2` format — the smallest modern format, supported everywhere.
- `font-display: swap` set on every
@font-facerule so text never goes invisible. - A real fallback stack so the page stays readable and stable while the font loads.
- Re-test Core Web Vitals in PageSpeed Insights after the change, on mobile, to confirm LCP and CLS held up.
On a managed host, a server-level page cache and CDN make the self-hosted font files even faster to deliver — Cloudways is one we've used where the built-in cache and CDN handle that without an extra plugin. The font lives on your server, and the host serves it quickly and close to the visitor.
08FAQ
Do I have to host fonts locally for GDPR?
If you serve EU visitors and load fonts from Google's servers, you're sending their IP to a third party without clear consent, which a German court found breached GDPR. Self-hosting removes that call entirely and is the simplest way to stay clear of the issue. This is general information, not legal advice — check with a professional if compliance is critical for you.
Will adding a custom font slow my site?
It can, if you load a whole family. Done right — self-hosted, 2–4 weights, .woff2, and font-display: swap — the impact is small and your site stays fast. The slowdown comes from too many weights and third-party calls, not from custom fonts themselves.
What's the difference between .woff2 and .ttf?
.woff2 is compressed specifically for the web and is significantly smaller than a .ttf file, while looking identical. Always use .woff2 for web fonts; it's supported by every current browser. Keep .ttf for desktop software, not for your site.
Can I use any font I download?
Only if its license allows web use. Google Fonts are open-licensed and free to self-host. Commercial fonts from a foundry usually require a web-font license — check before you upload, because embedding a font you're not licensed for is a real legal risk.
This is an honest how-to, not financial, legal, or business advice — your setup, theme, and licensing may differ, so test changes on a staging copy and confirm your font licenses before you rely on anything in production.


