Give your WordPress site its first task.
Connect the site you already have, add your agent to Slack or Telegram, and tell it what you need.
Connect your siteStart with 500 free credits. No credit card needed.
A saved font change that still shows the old typeface is usually one of five things: a cache you did not clear, a setting changed at the wrong scope, theme CSS that outranks yours, a font registered but never loaded on the front end, or a font file that never arrives. Each has a different check. Two minutes in your browser’s developer tools tells you which one you have.
You picked the font, you saved, and the live site still shows the old one. Or half of it changed: headings updated, buttons did not, and product titles are doing something else entirely.
That is not one bug. It is five, and from the outside they look the same. Work through them in order of how often they turn out to be the answer, and stop at the first one that explains what you see. If you are still deciding where the font should be set in the first place, the walkthrough of where to change fonts in WordPress covers the Site Editor, the Customizer and CSS paths.
The block editor and the Site Editor preview render with their own stylesheet. They are close to the front end, not identical to it, so neither a correct preview nor a wrong one is evidence.
Do this first, in this order:
Those two panels split the problem cleanly. If the computed font-family is not your font, the CSS never won. If it is your font but the file did not download, the CSS won and the asset failed. Everything below sits on one side of that line.
This is the most common answer by a wide margin, and the reason people retry the change three times in three different places and make the site worse. A typical WordPress site has four or five independent caches, and clearing one does nothing to the others.
Purge in this order, testing after each step so you learn which layer was holding the file:
Two details save repeat visits. Turn off CSS minification and combining while you debug, because an aggregated stylesheet can be cached under a filename that never changes. And if the builder offers a choice between printing CSS inline and writing it to an external file, the external file is easier to reason about, because you can open it and see whether your font is in it.
The signature of a caching problem: the editor is right, the live page is wrong, and it is right in a private window or on your phone over mobile data.
WordPress applies typography at several levels, and the narrower level wins. A font set on one heading block beats the global heading style. A style set on Links beats the size you set on body text for anything that is a link.
That last one catches people regularly: a header menu that refuses to change size until it is changed under Styles, Typography, Links. WordPress’s Styles overview documentation describes the Styles panel as setting the overall look of the site at a global level, with separate typography sections inside it, so global is the default place to work and per-element settings are the exceptions.
Walk the scopes from narrow to wide:
On WooCommerce stores the same problem wears a different costume. Product titles, prices, breadcrumbs and Add to cart buttons each carry their own classes, and a store theme usually styles them directly. Changing global body text leaves them untouched. Inspect the element, read the class the theme is styling (something like .woocommerce-loop-product__title), and target that.
If the Styles panel shows your font-family with a line through it, the rule loaded and lost. A more specific selector, a rule loaded later, or an inline style from a builder beat it.
Read the winning rule in the Styles panel. It names the file and the selector, which tells you who owns the font on that element: the parent theme, a child theme, the builder, a design plugin, or your own snippet. Then either change the font where the winner sets it, which is almost always the better fix, or write a selector at least as specific as theirs. Prefer .site-content p over a bare p. Keep !important for the case where you have read the winning rule, cannot edit it, and have written down why.
Never fix this by editing the parent theme’s style.css or functions.php. The next theme update overwrites both. Use Additional CSS for small overrides, or a child theme when the change involves template or function code. The guide to editing themes without losing work covers when Additional CSS is enough and when you need the child theme.

Here the CSS applies correctly and the browser still renders something else, because the font it was asked for was never delivered. Three versions of this are common.
@import in Additional CSS. Pasting a Google Fonts @import line into Appearance, Customize, Additional CSS frequently fails to take effect on the front end. Load the font properly instead: register the font family in a block theme’s theme.json, or declare @font-face in a child theme, or enqueue the stylesheet with wp_enqueue_style. The WordPress theme handbook’s typography page covers custom font families and registering web fonts as font faces in theme.json, which keeps the editor preview and the front end in agreement.
Registered in the Font Library, not printed on the front end. A font can appear in the font picker and still fall back to a system font on the live site, because registration and front-end loading are separate steps and the integration between a theme, a font plugin and core is not always complete. Update the plugin, then check the page source for a @font-face rule naming your font. If there is none, nothing was ever loaded.
The weight is missing. You applied a family that ships 400 and 700 and asked for 300. The browser substitutes or synthesises, and the text looks subtly wrong rather than obviously wrong. Confirm the weights and styles you use are among the faces you actually loaded.
When the Network panel shows the font request failing, read the status and the console message. Each one points at a specific fix.
| What you see | What it means | Fix |
|---|---|---|
404 (Not Found) on a font URL | The path in src is wrong, or the file is not in that directory | Open the font URL directly, correct the path, re-upload the file |
| A CORS message about a font on another domain | The CDN or other domain is not sending an Access-Control-Allow-Origin header for fonts | Add the header at the CDN or server, or self-host the font on the same domain |
| A mixed content warning | An http:// font URL on an https:// page | Change the URL to https or a protocol-relative path |
| The file downloads but nothing renders | The server sends the wrong MIME type, or the file is corrupt | Re-export as woff2, confirm the server serves font types correctly |
Site migrations and domain changes cause a burst of these, because absolute font URLs in CSS still point at the old host. The durable setup is self-hosting: put .woff2 files in a folder inside your child theme, declare each weight in @font-face with font-display: swap;, and reference the family by name.
If none of the five explains it, stop changing settings and start removing variables. Switch to a recent bundled theme such as Twenty Twenty-Five and reload the page. If the font behaves, the problem is in your theme or its options. Then deactivate design-related plugins one at a time: builders and styling suites ship their own typography presets and overwrite theme styles by design. The isolation method in the guide to fixing WordPress plugins that are not working applies here unchanged.
Then fix the structural cause, not just the symptom. Decide which layer owns typography on this site: theme global styles, the builder’s global fonts, or your own CSS. Set it there, clear the settings in the other layers, and write down the decision somewhere the next person will find it. Sites where three layers all set a font are the ones where the old typeface comes back after an update.
If you would rather hand the tracing over, SiteSelf works on your connected WordPress site through chat and can track down and fix a change that is not taking effect, then report what it changed and what it checked. Content and settings work needs the SiteSelf Connector plugin from the WordPress.org directory; theme files, font assets and server configuration need hosting access over SSH. Pages owned by a visual page builder are refused at the moment of work, with the reason.
A font that finally works can introduce a new problem: text renders in the fallback, the web font arrives, and the layout shifts. Three things reduce it.
Load less. Every extra family, weight and italic is another file. Two or three weights of one or two families covers most sites, and the hierarchy you wanted usually comes from size, weight and colour rather than a third typeface.
Preload the fonts that appear above the fold and let the rest wait. web.dev’s best practices for fonts is written around optimising web fonts for Core Web Vitals and is the reference worth reading before you add a second family.
Match the fallback’s metrics to the web font so the swap does not move anything. MDN describes the size-adjust descriptor as a multiplier for the glyph outlines and metrics of a font, and alongside ascent-override, descent-override and line-gap-override it lets a local fallback occupy the same space as the real font:
@font-face {
font-family: "brand-fallback";
src: local("Verdana");
size-adjust: 87.6%;
ascent-override: 95.2%;
descent-override: 24.1%;
line-gap-override: 0%;
}
h1 { font-family: "Brand Sans", "brand-fallback", sans-serif; }
The percentages are specific to that pair of fonts. Compute yours for your own font and fallback rather than copying these.
Stop and bring in a developer when the fix requires editing server configuration you do not control, when the font is licensed and the licence restricts self-hosting, or when the only rule that works is a page-wide !important and you cannot tell what it is fighting. Stop sooner on a store: if product pages are rendering inconsistently across browsers, the cost of guessing is orders, not tidiness.
Also stop if you have changed the same font in three places. At that point the site has accumulated overrides rather than a font setting, and the work is to remove two of them, not to add a fourth.
Probably not. The block editor has its own appearance settings, reachable from the three-dot menu at the top right under Preferences, Appearance. They affect the editing interface only. If the live page is correct in a private window, the site is correct.
For current browsers, woff2 alone is enough and it is the smallest format. Some font uploader plugins and builders ask for more formats in their upload screens, and older browsers are the only real reason to supply them. Start with woff2 and add formats only if a specific tool refuses the upload.
It often fails to render on the front end, which is why the same fix keeps getting reported as not working. Register the family in theme.json, declare @font-face in a child theme, or enqueue the stylesheet instead.
Reset typography in Styles or the Customizer to the theme default, remove any font rules from Additional CSS and from child theme stylesheets, and deactivate font plugins you no longer need. Then purge caches and check the live page. Default theme fonts load fast and are a reasonable place to stay.
Design plugins and page builders ship their own typography presets and apply them site-wide by design. Configure that tool’s global typography to match, or switch off its style output if it offers the option. Running two styling suites at once produces font behaviour nobody can predict.
Occasionally, when a builder writes inline styles you cannot edit. Use it on the narrowest selector that works, and add a comment saying which rule it is overriding. Applying it across body and every heading hides the conflict and makes the next change harder.
Troubleshooting
A white screen is not an error. It is a fatal PHP error with the message switched off, which is why guessing at fixes takes longer than reading a log. Work the sequence instead: note what is blank, check for the recovery email, turn on logging, read the file path in the error, then isolate the plugin or theme it names.
Read article ›Troubleshooting
A plugin that stopped working almost never stopped on its own. Something changed first: an update, a PHP version, a cache rule, a snippet pasted into a theme file. The fastest route back is to find what changed, test one variable at a time, and resist the urge to fix three things at once.
Read article ›How-to Tutorials
Editing a page in WordPress is four clicks until it isn’t. The hard part is knowing whether the thing you want to change lives in the page, in a template, in a pattern, in a page builder’s own data, or in WooCommerce. This walks through the edit itself, then the checks that tell you whether your change actually reached the live site.
Read article ›Connect the site you already have, add your agent to Slack or Telegram, and tell it what you need.
Connect your siteStart with 500 free credits. No credit card needed.