WordPress Favicon Not Showing? Fix Cache & Icon Conflicts
You upload a new favicon, it looks perfect in the WordPress customizer preview, and then... the browser tab still shows the old icon. Or a blank square. Or the generic WordPress "W" logo you thought you removed months ago. It's a small thing, but it makes a site look unfinished, and it's one of those bugs that resists the usual "just clear your cache" advice because there are actually several caches involved, not one.
Symptom: What You're Actually Seeing
This issue shows up in a few different flavors, and the fix depends slightly on which one you've got:
- The favicon in the browser tab never updates, even after you change it in Appearance → Customize → Site Identity.
- The tab icon is blank or shows a broken-image icon.
- Desktop Chrome shows the new icon, but mobile Safari or a bookmarked shortcut still shows the old one.
- Google Search results show a stale or generic favicon next to your listing, weeks after you changed it.
- The favicon works on the homepage but not on inner pages.
Why This Happens
Favicons are unusually cache-hungry. Browsers, CDNs, and WordPress itself all keep their own copies, and any one of them can be the thing holding the old image hostage.
1. Browser caching (the most common cause by far)
Chrome and Firefox cache favicon.ico aggressively and separately from the rest of the page cache — sometimes for weeks. Clearing normal browsing data doesn't always touch it. This is why a hard refresh (Ctrl+Shift+R / Cmd+Shift+R) often does nothing, but opening the site in an incognito window shows the new icon immediately. If incognito shows it correctly, the fix already worked — it's purely a local cache problem on your machine.
2. Two favicons fighting each other
WordPress's Site Icon feature writes a <link rel="icon"> tag into your <head>. But if your theme (or an old plugin, or a leftover from a previous developer) also has a hardcoded favicon reference in header.php, or there's a stray favicon.ico sitting in your site's root folder, browsers will often default to /favicon.ico regardless of what the customizer says. Root-level favicon.ico beats theme-injected tags in a lot of browsers' fallback logic.
3. Site Icon didn't regenerate all the sizes
When you upload a Site Icon, WordPress generates several cropped sizes (16×16, 32×32, 180×180 for Apple touch icon, and so on) and stores them in the Media Library. If the upload was interrupted, or the image library on the server (Imagick/GD) choked on the file format, some sizes silently fail to generate — so desktop shows the new icon but mobile home-screen shortcuts still show the old apple-touch-icon.
4. A page cache or CDN is serving a stale HTML response
If you're running LiteSpeed Cache, WP Rocket, W3 Total Cache, or sitting behind Cloudflare, the cached HTML page (including the old <head> tags) can keep being served after you've changed the icon in WordPress. The change is live in the database — it just hasn't reached the cached copy of the page yet.
5. Wrong file path or permissions
Less common, but worth ruling out: if someone manually placed a favicon.ico or favicon.png in public_html with restrictive permissions (or it's owned by the wrong user after a migration), the file simply won't load and you'll get the broken-image icon.
The Fix
Step 1 — Rule out your own browser cache first
Open the site in a private/incognito window before doing anything else. If the new favicon shows up there, skip to Step 4 (cache-busting) — everything server-side is already correct.
Step 2 — Check for a conflicting root favicon.ico
In cPanel, open File Manager and navigate to public_html. Look for a file literally named favicon.ico sitting in the root. If it exists and you didn't put it there on purpose, rename it (don't delete yet, in case something depends on it) so you can test without it:
mv public_html/favicon.ico public_html/favicon.ico.bak
Reload the site in incognito. If the correct icon now appears, that stray file was the problem — delete the backup once you've confirmed nothing else references it.
Step 3 — Re-set the Site Icon in WordPress
Go to Appearance → Customize → Site Identity, remove the current Site Icon, save, then upload it again as a fresh image (ideally a 512×512 PNG — WordPress needs the room to crop the smaller sizes cleanly). This forces WordPress to regenerate every icon size instead of reusing a partially-failed set. If you're comfortable with WP-CLI, you can also confirm the icon is actually saved:
wp option get site_icon
wp media list --post_type=attachment --post_mime_type=image | grep -i icon
Step 4 — Bust the cache, in the right order
Work outward from WordPress to the browser:
- Plugin cache: Purge WP Rocket / LiteSpeed Cache / W3 Total Cache from its settings page (or via WP-CLI:
wp cache flushfor object cache, plus the plugin's own purge command). - CDN/Cloudflare: In the Cloudflare dashboard, go to Caching → Configuration → Purge Cache and either purge everything or purge just the favicon URL and homepage.
- Server-side page cache (if your host runs one independently, like LiteSpeed's server cache): clear it from cPanel's LiteSpeed Web Cache Manager if that option is available on your plan.
- Your own browser: now do the hard refresh, or better, just reopen in a fresh incognito window.
Step 5 — Force a cache-busted favicon URL (if it's still stuck)
Browsers key their favicon cache off the exact URL. Appending a version query string forces every visitor to fetch a genuinely new copy instead of reusing whatever they cached before. If you're comfortable editing the theme, add this to your child theme's functions.php:
function getwebup_favicon_cache_bust( $url ) {
return add_query_arg( 'v', '2', $url );
}
add_filter( 'get_site_icon_url', 'getwebup_favicon_cache_bust' );
Bump the version number (v=3, v=4...) each time you change the icon in the future, and remove the filter once you're confident caching isn't an ongoing issue.
Quick Diagnostic Table
| What you see | Likely cause | Fastest fix |
|---|---|---|
| Old icon in your browser, correct everywhere else | Local browser favicon cache | Test in incognito; if correct, ignore it |
| Old icon for every visitor | Stray root favicon.ico or unpurged page cache/CDN | Remove root file, purge Cloudflare + plugin cache |
| Blank/broken icon | File permissions or failed upload | Re-upload Site Icon, check file exists in Media Library |
| Fine on desktop, wrong on mobile home screen | apple-touch-icon size didn't regenerate | Re-upload as 512×512 PNG |
| Fine on the homepage, missing on inner pages | Theme hardcodes favicon only in front-page template | Check header.php / theme template for a hardcoded <link rel="icon"> |
Prevention
- Manage the favicon in exactly one place — WordPress's Site Icon setting — and remove any hardcoded
<link rel="icon">tags from the theme. - Never leave a manually-uploaded
favicon.icoinpublic_htmlalongside the WordPress-managed icon; pick one source of truth. - After any icon change, purge CDN and plugin cache immediately rather than waiting for it to expire naturally.
- Upload icons at 512×512 so WordPress has enough resolution to generate every size cleanly, including the Apple touch icon.
- Always verify changes in an incognito window before assuming a fix didn't work — it usually did, and you're just looking at your own cache.
Favicon problems feel disproportionately annoying because the fix is usually invisible to you (your browser already cached the "wrong" icon) while it's completely broken for new visitors, or the other way around. Working through the cache layers in order — browser, then plugin, then CDN — almost always finds it faster than guessing.
Frequently asked questions
Why does my WordPress favicon still show the old icon after I changed it?
Almost always browser caching. Favicon files are cached separately from the rest of the page, sometimes for weeks. Open the site in an incognito window first — if the new icon shows up there, the change worked and it's only your own browser holding onto the old copy.
I cleared my cache plugin but the favicon still won't update. What's next?
Check for a leftover favicon.ico sitting directly in public_html via cPanel File Manager. Many browsers prioritize a root-level favicon.ico over the icon WordPress injects into the page head, so a stray file will override your Site Icon setting every time.
Do I need a specific image size for the WordPress Site Icon?
Upload at least 512x512 pixels. WordPress crops this down to generate the smaller sizes it needs, including the 180x180 Apple touch icon for mobile home-screen shortcuts. Smaller source images often fail to generate every size cleanly.
Why does the favicon work on my homepage but not on other pages?
This usually means the theme has a favicon link hardcoded into a specific template file rather than relying on WordPress's wp_head() output on every page. Check header.php or any custom front-page template for a manually added <link rel="icon"> tag.
Will purging Cloudflare's cache fix a stuck favicon?
It can, if Cloudflare is serving a cached copy of your page's HTML that still references the old icon. Purge the cache from Caching > Configuration > Purge Cache in the Cloudflare dashboard, then reload in an incognito window to confirm.