Opens in a new tab
  1. Home
  2. Guides
  3. Backend
Backend guide

Admin Favicon vs WordPress Site Icon

Learn the difference between a WordPress Site Icon and an admin-only favicon, including how WordPress generates Site Icon metadata, handles favicon.ico requests, scopes admin_head output and allows the public website and wp-admin to use separate browser-tab identities.

  • Updated September 22, 2026
  • 25 min read
  • WordPress guide

Admin Favicon vs WordPress Site Icon is an important distinction when you want the WordPress backend to have a different browser-tab identity from the public website.

At first glance, both features appear to solve the same problem:

show a small icon
inside the browser tab

But they operate at different levels.

The WordPress Site Icon is part of the site’s general identity. WordPress stores it as the site’s icon and uses it across several public-facing and platform contexts.

An admin favicon, by contrast, can be deliberately scoped to:

/wp-admin/

so that administrators see one browser-tab icon while public visitors continue to see another.

The practical distinction is:

WordPress Site Icon
→ site identity

Admin favicon
→ administration identity

This guide explains how both systems work, where each icon appears, why the WordPress Site Icon can sometimes appear in wp-admin even though WordPress does not explicitly print it there, how an admin-only favicon overrides that behavior and when it makes sense to use different icons for the public site and backend.

Quick answer: Admin Favicon vs WordPress Site Icon

The shortest useful comparison is:

WordPress Site Icon

Scope:
site-wide identity

Configured through:
WordPress settings

Primary use:
frontend browser tabs,
bookmarks,
application identity

Stored as:
site_icon option


Admin Favicon

Scope:
WordPress administration

Configured through:
custom code or an admin
customization feature

Primary use:
wp-admin browser tabs

Can differ from frontend:
yes

If you simply want one icon representing the complete WordPress website, use the Site Icon.

If you want:

public website
→ public brand icon

WordPress admin
→ backend-specific icon

then you need an administration-specific favicon layer.

TheOneWP Admin Favicon is designed specifically for that second use case.

What is the WordPress Site Icon?

The WordPress Site Icon is the platform’s built-in favicon and application-icon system.

WordPress describes the Site Icon as the image used in locations such as:

  • browser tabs;
  • bookmark bars;
  • mobile applications;
  • other places where the website needs a compact visual identity.

The official WordPress favicon documentation recommends using a square image at least 512 × 512 pixels.

Where is the WordPress Site Icon configured?

For WordPress 6.5 and later, the Site Icon was moved into:

Settings
↓
General
↓
Site Icon

The current WordPress Create a Favicon documentation describes this workflow.

WordPress’s current General Settings implementation also identifies the Site Icon as the image used in browser tabs, bookmark bars and WordPress mobile applications.

Block themes can also expose Site Icon controls

Current block-theme workflows can also expose site identity through the Site Editor.

The official Site Editor Identity documentation includes:

  • Site Title;
  • Site Tagline;
  • Site Logo;
  • Site Icon.

The Site Icon remains a separate identity concept from the Site Logo.

Site Logo and Site Icon are not the same thing

This distinction is worth making before comparing the admin favicon.

A Site Logo is normally a visible page element:

HEADER

[ COMPANY LOGO ]

A Site Icon is much smaller:

[■] Page title
 ↑
browser-tab icon

The official Site Logo block documentation explains that the Site Logo represents the website visually inside page layouts, while the Site Icon is used for browser-tab and application identity.

The Site Logo block can also expose a:

Use as site icon

option.

How WordPress stores the Site Icon

Internally, WordPress stores the Site Icon as an attachment ID in the option:

site_icon

The underlying logic is visible in the official get_site_icon_url() documentation.

Conceptually:

Site Icon setting
↓
Media Library attachment
↓
site_icon option
↓
WordPress retrieves
appropriate image sizes

Check whether a WordPress Site Icon exists

WordPress provides:

has_site_icon()

which returns whether the current site has a Site Icon.

Example:

if ( has_site_icon() ) {
    // A Site Icon is configured.
}

See the official has_site_icon() reference.

Retrieve the Site Icon URL

You can retrieve a specific size with:

$icon_url = get_site_icon_url( 32 );

The first argument specifies the requested image size in pixels.

WordPress can return different generated sizes based on the Site Icon attachment.

WordPress generates Site Icon metadata

The Core function:

wp_site_icon()

generates the relevant icon metadata.

Current WordPress Core can output entries such as:

<link
    rel="icon"
    href="..."
    sizes="32x32"
/>

<link
    rel="icon"
    href="..."
    sizes="192x192"
/>

<link
    rel="apple-touch-icon"
    href="..."
/>

<meta
    name="msapplication-TileImage"
    content="..."
/>

The official wp_site_icon() reference documents this output.

Where does WordPress automatically output wp_site_icon()?

In current WordPress Core, wp_site_icon() is registered on:

wp_head

at priority:

99

The official wp_head documentation shows that relationship.

This means the Site Icon has an explicit Core output path for normal frontend pages.

WordPress does not register wp_site_icon() on admin_head by default

This is where the difference becomes important.

The backend has its own head action:

admin_head

The official admin_head documentation confirms that it fires inside the head section of administration pages.

Current WordPress Core does not simply register:

add_action(
    'admin_head',
    'wp_site_icon'
);

as the normal Site Icon output path.

So the direct markup model is:

Frontend
wp_head
↓
wp_site_icon()
↓
explicit Site Icon tags


Admin
admin_head
↓
no equivalent default
wp_site_icon() registration

Why can the Site Icon still appear in wp-admin?

This is the detail that makes favicon debugging confusing.

A browser does not necessarily require an explicit:

<link rel="icon">

element before attempting to find a favicon.

When no explicit icon is available, browsers can request the conventional:

/favicon.ico

location.

WordPress has a dedicated favicon request handler:

do_favicon()

WordPress /favicon.ico uses the Site Icon

The current WordPress do_favicon() implementation redirects the favicon request to:

get_site_icon_url( 32, fallback )

where the fallback is a WordPress image when no Site Icon is available.

That means the browser can effectively reach:

/favicon.ico
↓
WordPress
↓
get_site_icon_url( 32 )
↓
configured Site Icon

This creates an important nuance

It would therefore be too simplistic to say:

Site Icon never affects wp-admin

The more accurate explanation is:

WordPress does not normally print
Site Icon link tags in admin_head.

However:

a browser without an explicit
admin favicon may fall back
to /favicon.ico

and WordPress can resolve
/favicon.ico using the Site Icon.

This explains why an administrator may see the public Site Icon in an wp-admin browser tab even though the frontend Site Icon system is not directly being printed through admin_head.

An admin favicon creates an explicit backend identity

An administration-specific favicon avoids depending on browser fallback behavior.

Instead, the backend explicitly contains something like:

<link
    rel="icon"
    href="admin-icon.png"
/>

inside the administration document head.

The browser is therefore given an icon specifically for that admin page.

How an admin-only favicon can be added manually

The simplest conceptual implementation uses:

admin_head

because that hook exists specifically inside administration pages.

For example:

add_action(
    'admin_head',
    'mycompany_admin_favicon'
);

function mycompany_admin_favicon() {

    $favicon_url = plugin_dir_url( __FILE__ )
        . 'assets/admin-favicon.png';

    echo '<link
        rel="icon"
        href="' .
        esc_url( $favicon_url ) .
        '">';
}

The custom tag exists in wp-admin but is not added to normal frontend pages.

Why admin_head provides useful isolation

Consider these WordPress contexts:

Frontend
→ wp_head

Administration
→ admin_head

Login screen
→ login_head

They have different lifecycle hooks.

Using the most specific hook lets you decide exactly where the icon should exist.

The admin favicon does not need to replace the Site Icon setting

A clean architecture can keep both:

Site Icon
→ public brand

Admin Favicon
→ backend brand

No conflict exists at the configuration level because the two concepts have different scopes.

Example: public logo and backend management icon

Imagine an agency manages a client website.

The public Site Icon could be:

[ACME symbol]

while the backend favicon could be:

[ACME management mark]

or:

[agency/client hybrid icon]

The visitor sees the public identity.

The administrator sees an icon optimized for distinguishing the backend.

Example: staging vs production

An admin-specific icon becomes especially useful when developers routinely have several environments open.

For example:

Production admin
→ normal brand icon

Staging admin
→ orange development icon

Local admin
→ different development mark

The public Site Icon can remain identical across all environments while backend tabs are visually distinguishable.

Why this can reduce operational mistakes

Consider several browser tabs:

[A] Acme production
[A] Acme staging
[A] Acme local

Identical favicons provide little visual warning.

With admin-specific icons:

[A] Production
[S] Staging
[D] Development

the environments become easier to distinguish at a glance.

This does not replace proper environment labels, access controls or deployment procedures, but it can provide another useful visual cue.

The WordPress Site Icon is still the correct public favicon system

Do not replace the built-in Site Icon with a custom admin favicon if your actual objective is simply to change the public website icon.

The WordPress Site Icon already handles:

  • frontend icon markup;
  • generated image sizes;
  • browser-tab identity;
  • mobile application identity;
  • the conventional favicon route.

For the public website, use the native Site Icon system unless a specific project has a reason to implement something different.

Do not manipulate wp_head to change only wp-admin

This would target the wrong context:

add_action(
    'wp_head',
    'my_admin_favicon'
);

wp_head belongs to the frontend rendering lifecycle.

If the objective is:

admin only

use:

admin_head

The login screen is another separate context

The WordPress authentication page is neither an ordinary frontend theme page nor a normal wp-admin page.

It exposes:

login_head

The official login_head documentation confirms that the hook fires in the login page header.

Therefore:

Admin favicon
added through admin_head

does not automatically mean

login-page favicon
added through login_head

TheOneWP Admin Favicon is intentionally admin-scoped

TheOneWP Admin Favicon is designed specifically for WordPress administration pages.

The current module:

  • lets the administrator select an image from the WordPress Media Library;
  • stores the selected favicon configuration;
  • outputs favicon link elements in admin_head;
  • does not modify the WordPress Site Icon;
  • does not change the public frontend favicon;
  • does not resize or convert the selected image itself.

The configuration therefore creates a separate backend icon rather than replacing WordPress’s global Site Icon setting.

Which tags does TheOneWP Admin Favicon output?

When a valid icon URL is configured, the current implementation outputs:

rel="icon"

and

rel="shortcut icon"

inside the WordPress administration head.

That gives the browser an explicit backend favicon rather than relying on its fallback behavior.

Admin favicon image formats

The current TheOneWP interface recommends:

ICO
PNG
SVG

with a compact image suitable for approximately:

32 × 32px

browser-tab use.

This differs from the built-in WordPress Site Icon workflow, which recommends a square source image of at least:

512 × 512px

Why does WordPress request a much larger Site Icon source?

The Site Icon is not used only as a tiny desktop favicon.

WordPress can generate and reference several sizes.

The current wp_site_icon() implementation can request:

32px
192px
180px
270px

for different icon and application contexts.

That is why WordPress asks for a much larger square source image.

An admin-only favicon has a narrower job

A dedicated admin favicon is primarily intended to identify:

browser tab
+
WordPress administration context

It therefore does not necessarily need the same application-icon infrastructure as the global Site Icon.

Admin favicon vs Site Icon comparison

WORDPRESS SITE ICON

Purpose:
Global site identity

Native WordPress feature:
Yes

Main configuration:
Settings → General

Stored by WordPress:
Yes

Recommended source:
Square, at least 512 × 512

Frontend:
Yes

Browser tabs:
Yes

Bookmarks:
Yes

WordPress mobile apps:
Yes

Admin:
Can appear through browser
favicon fallback behavior

Separate admin control:
No


ADMIN FAVICON

Purpose:
Backend identity

Native independent
admin-only setting:
No

Typical implementation:
admin_head

Frontend:
No, when correctly scoped

wp-admin:
Yes

Login page:
Not automatically

Can differ from Site Icon:
Yes

Useful for:
branding,
multi-site management,
environment recognition

Should the Site Icon and Admin Favicon be identical?

They can be.

There is no requirement that they must differ.

Using the same icon everywhere creates maximum brand consistency:

Frontend
→ Acme icon

Backend
→ Acme icon

That is completely reasonable for many websites.

When should they be different?

A separate admin favicon is particularly useful when the backend represents a different operational context.

Examples include:

  • agency-managed client websites;
  • staging environments;
  • development environments;
  • large multisite networks;
  • teams managing many installations;
  • white-label applications;
  • internal publishing systems.

Use a simplified mark for tiny favicons

A full horizontal logo is rarely suitable for a favicon.

This:

ACME INTERNATIONAL GROUP

compressed into a tiny browser-tab area becomes visually meaningless.

Prefer:

A

or a compact brand symbol.

Do not treat favicon dimensions like normal image dimensions

A favicon is displayed extremely small.

Fine details disappear.

Thin lines may become invisible.

Small typography can become unreadable.

Complex gradients can lose distinction.

Design for recognition rather than detail.

Transparent backgrounds need testing

A transparent icon may appear against:

  • light browser chrome;
  • dark browser chrome;
  • colored tab groups;
  • different operating-system themes.

A logo that is visible only against white is therefore risky.

Test both light and dark browser environments.

Do not use the admin favicon as the Admin Bar icon

The browser-tab favicon and WordPress Toolbar icon are separate interface elements.

The Toolbar icon exists inside the page interface.

The favicon exists in browser chrome.

For Toolbar branding, see How to Change the WordPress Admin Bar Icon.

TheOneWP Admin Bar Icon handles that separate branding layer.

Do not confuse the admin favicon with the admin menu logo

The left sidebar logo is another independent element.

Admin favicon
→ browser tab

Admin Bar icon
→ top Toolbar

Admin menu logo
→ left navigation

If the objective is to brand the sidebar, see How to Add a Custom Logo to the WordPress Admin Menu.

TheOneWP Admin Menu Logo addresses that location specifically.

Login branding remains independent

The login page can use:

  • a different logo;
  • different colors;
  • different typography;
  • a different background;
  • its own favicon behavior.

For the complete authentication design, see How to Customize the WordPress Login Page and Branding the WordPress Login Screen for Clients.

TheOneWP Custom Login Page handles that separate visual layer.

One WordPress installation can therefore have several brand assets

A complete branding architecture might look like:

Public Site Icon
→ client symbol

Login logo
→ full client logo

Admin favicon
→ compact management symbol

Admin Bar icon
→ small client mark

Admin menu logo
→ compact horizontal logo

Each asset solves a different visual problem.

Use WordPress APIs to inspect the current Site Icon

You can retrieve the active global Site Icon programmatically:

$site_icon = get_site_icon_url( 32 );

if ( $site_icon ) {
    echo esc_url( $site_icon );
}

The official esc_url() documentation covers escaping URLs before HTML output.

Retrieve larger Site Icon sizes

You can request different dimensions:

$icon_32 = get_site_icon_url( 32 );

$icon_192 = get_site_icon_url( 192 );

$icon_512 = get_site_icon_url( 512 );

WordPress selects an appropriate image derived from the configured Site Icon attachment.

site_icon_url() prints instead of returns

WordPress also provides:

site_icon_url()

The distinction is:

get_site_icon_url()
→ returns the URL

site_icon_url()
→ echoes the URL

The official site_icon_url() documentation covers the output helper.

The Site Icon metadata can be filtered

WordPress exposes:

site_icon_meta_tags

for filtering the array of Site Icon meta tags created by wp_site_icon().

The official site_icon_meta_tags reference documents that filter.

That is useful for customizing the global Site Icon metadata.

It is not necessarily the cleanest solution when the requirement is simply:

use a different icon in wp-admin

because the admin has its own head lifecycle.

Do not globally filter get_site_icon_url() for an admin-only favicon

WordPress exposes a:

get_site_icon_url

filter.

You could technically alter its result conditionally.

However, the Site Icon is used by multiple WordPress systems.

Changing the global retrieval API simply to customize one browser context creates unnecessary coupling.

A dedicated:

admin_head

favicon is easier to understand.

Global Site Icon changes can have wider effects

get_site_icon_url() is used by WordPress in several contexts beyond normal frontend favicon markup.

Its official documentation lists usage including:

  • Site Icon metadata;
  • the REST API;
  • feeds;
  • embed templates;
  • the favicon request handler;
  • Admin Bar site menus.

This reinforces the architectural distinction:

Site Icon
→ shared site identity resource

Admin favicon
→ scoped backend presentation

WordPress Site Icon and the REST API

The Site Icon can also be exposed in WordPress REST API site information.

This is another reason not to treat it as merely one:

<link rel="icon">

tag.

It is part of the broader WordPress site-identity model.

Admin Favicon does not need to modify the REST API

A backend-only icon generally has no reason to redefine the site’s public REST identity.

It represents an interface environment rather than the website as a whole.

What happens when no Site Icon is configured?

has_site_icon() returns false when WordPress cannot resolve a Site Icon.

For the conventional favicon route, current WordPress Core uses a WordPress logo image as the fallback in do_favicon().

This means a default-looking WordPress favicon in the backend does not necessarily indicate that explicit favicon markup exists on every administration page.

What happens when no custom admin favicon is configured?

With TheOneWP Admin Favicon, if no valid admin favicon has been selected, the module does not print its custom icon link elements.

The browser and WordPress therefore continue using their existing favicon behavior.

This creates a simple fallback model:

Custom Admin Favicon exists
↓
explicit admin favicon

No custom Admin Favicon
↓
normal WordPress/browser behavior

Changing the Site Icon does not change a custom admin favicon

Once wp-admin contains an explicit independent favicon configuration, changing:

Settings → General → Site Icon

should not be expected to update that separately configured admin asset.

The two settings represent different identities.

Changing the admin favicon does not change the public Site Icon

The reverse is equally important.

An admin-only implementation attached to:

admin_head

does not alter:

wp_head
site_icon option
wp_site_icon()
public favicon metadata

This isolation is exactly what makes an admin favicon useful.

Why does my frontend still show the old favicon?

If you changed only the admin favicon, the frontend is supposed to remain unchanged.

To change the public icon, update the WordPress Site Icon instead.

For an admin-specific troubleshooting process, see WordPress Admin Favicon Not Updating.

Why does my admin still show the public Site Icon?

Possible reasons include:

  • no admin-specific favicon has been configured;
  • the custom favicon output is missing;
  • the selected URL is invalid;
  • the browser is using cached favicon data;
  • another plugin is outputting competing favicon markup;
  • the browser has fallen back to the site’s conventional favicon request.

Again, the distinction between explicit admin markup and browser fallback matters.

Favicons are aggressively cached

Browser favicon caching can make testing unusually confusing.

You may update:

admin-icon-old.png

to:

admin-icon-new.png

and still see the previous icon for some time.

Do not immediately assume WordPress failed to save the setting.

Inspect the HTML head before blaming the setting

For wp-admin, inspect the document head and search for:

rel="icon"

rel="shortcut icon"

If the correct admin URL appears there, the server-side output is probably working and browser caching becomes a stronger suspect.

Check the actual favicon URL directly

Copy the URL from the generated:

<link rel="icon">

element and open it directly.

Verify that:

  • the URL loads;
  • the image is correct;
  • there is no authentication error;
  • there is no 404;
  • the response is actually an image;
  • the file has not been replaced by a cached redirect.

Use different filenames when debugging stubborn caches

If the browser keeps using:

admin-favicon.png

after the contents of that file have changed, using a new asset URL such as:

admin-favicon-v2.png

can help distinguish an application problem from a cached resource.

Do not repeatedly replace the WordPress Site Icon while troubleshooting wp-admin

If the project has a separate admin favicon, changing the public Site Icon repeatedly adds another variable to the investigation.

Debug one layer at a time:

1. Inspect admin head

2. Verify admin favicon URL

3. Check browser cache

4. Check conflicting icon tags

5. Only then inspect
global Site Icon behavior

Multiple favicon tags can create confusing results

Plugins, themes or custom snippets may output additional:

<link rel="icon">

elements.

If several different URLs appear in the same document head, browser selection can become difficult to reason about.

Before adding another favicon implementation, inspect the markup already being generated.

Do not add an admin favicon through the frontend theme header

Adding:

<link rel="icon">

to:

header.php

normally affects frontend theme output.

It does not provide a clean admin-only solution.

Do not edit wp-admin Core files

Avoid modifying:

wp-admin/admin-header.php

to insert favicon markup directly.

WordPress already provides:

admin_head

for administration head output.

Core files can be replaced by updates.

Keep backend branding outside the frontend theme when possible

If the administration favicon should survive a theme change, it generally belongs in:

  • a functionality plugin;
  • a site-specific plugin;
  • a must-use plugin;
  • a dedicated admin-customization plugin.

This keeps:

public theme presentation

separate from:

backend operational branding

Admin favicon and multisite

WordPress’s Site Icon API supports a blog ID when retrieving an icon:

get_site_icon_url(
    $size,
    $fallback,
    $blog_id
);

This allows WordPress to resolve icons for individual sites in a Multisite network.

An admin-specific favicon system may similarly need to decide whether configuration belongs:

per site
or
network-wide

depending on the intended administration model.

Use separate admin icons to identify Multisite sites

On a large network, several administration tabs can be visually similar.

Site-specific admin favicons can provide an extra recognition layer:

[A] Acme
[B] Brand Two
[C] Corporate Portal

while the public Site Icons continue following each site’s public branding strategy.

Agency use case

An agency managing many client sites may want:

Public Site Icon
→ client's public brand

Admin favicon
→ client's compact backend mark

Admin menu logo
→ client or agency identity

Admin footer
→ agency support information

This provides useful context without changing the public brand.

For a broader system, see How to Brand the WordPress Admin Dashboard.

Standardize favicon rules across a team

If several developers manage the same collection of websites, define a consistent rule.

For example:

Production
→ client mark

Staging
→ client mark + orange variation

Development
→ monochrome development mark

Consistency makes the visual cue easier to learn.

See Standardizing the WordPress Admin for Teams for the wider administration strategy.

Do not over-brand the backend

An admin favicon is useful partly because it is unobtrusive.

Backend branding becomes less useful when every available surface competes for attention.

A restrained system may include:

favicon
+
small admin menu logo
+
support link
+
coherent colors

without reconstructing the entire WordPress interface.

For client-focused usability, see Reducing WordPress Admin Confusion for Clients.

The favicon does not affect permissions

Changing browser-tab identity has no effect on:

  • roles;
  • capabilities;
  • authentication;
  • admin URLs;
  • REST API permissions;
  • filesystem access;
  • security headers.

It is purely an interface and branding concern.

The favicon does not hide WordPress

A custom backend icon is not a security or fingerprinting defense.

The site can still expose WordPress through many normal behaviors and endpoints.

Use an admin favicon because it improves recognition, not because it supposedly conceals the platform.

Common mistake: assuming Site Icon means frontend only

The Site Icon’s explicit metadata output is primarily tied to frontend wp_head.

However, the global icon can still influence conventional favicon fallback through WordPress’s /favicon.ico handling.

Therefore:

Site Icon
is global identity

not merely
one frontend HTML tag

Common mistake: assuming Site Icon gives you independent admin branding

It does not provide a separate:

Frontend Icon

Admin Icon

pair of settings.

If you need separate assets, introduce an admin-specific favicon layer.

Common mistake: changing the Site Icon when only wp-admin should change

This modifies the site’s wider icon identity and is therefore broader than necessary.

Use an admin-scoped implementation instead.

Common mistake: changing admin_head when the public site should change

The opposite error is equally possible.

If your public website needs a new favicon, update the WordPress Site Icon.

An admin_head callback is intentionally scoped too narrowly for that task.

Common mistake: treating the login page as wp-admin

The login interface uses a different lifecycle.

An icon added through:

admin_head

does not automatically produce the same markup through:

login_head

Common mistake: uploading a complex horizontal logo

A browser-tab favicon should be recognizable at tiny dimensions.

Use:

  • a symbol;
  • a monogram;
  • a compact mark;
  • a simple geometric identity.

Do not compress a full corporate wordmark into a square.

Common mistake: forgetting browser caching

Favicons are among the assets most likely to make a correct implementation appear broken during testing.

Inspect the generated source and actual resource URL before rewriting working code.

Common mistake: using several favicon plugins simultaneously

Multiple systems can produce competing:

rel="icon"

tags.

Choose one clear owner for each scope:

Site Icon
→ WordPress global identity

Admin favicon
→ backend identity

Common mistake: storing unsafe raw markup

If administrators select a favicon through a settings interface, store a controlled value such as:

attachment ID
or
sanitized URL

rather than arbitrary HTML.

Then generate the favicon markup yourself.

Use the Media Library for configurable admin icons

A settings-based implementation can store an attachment ID and retrieve the image through:

wp_get_attachment_image_url()

The official wp_get_attachment_image_url() reference documents the attachment-image API.

A simple custom admin favicon implementation

For a controlled plugin, the core concept can be as small as:

add_action(
    'admin_head',
    'project_admin_favicon',
    1
);

function project_admin_favicon() {

    $icon_url = plugin_dir_url( __FILE__ )
        . 'assets/admin-favicon.png';

    if ( ! $icon_url ) {
        return;
    }

    ?>

    <link
        rel="icon"
        href="<?php echo esc_url( $icon_url ); ?>"
    >

    <?php
}

The important architectural property is not the number of lines.

It is the scope:

admin_head
→ administration only

If you want the same custom icon on login too

That should be an explicit second decision.

You could attach a shared renderer to both:

admin_head

and

login_head

if that is what the project requires.

Do not assume one context includes the other.

If you want one icon everywhere

Use the native Site Icon unless there is a specific reason not to.

The simple architecture is:

one website identity
↓
WordPress Site Icon
↓
frontend icon metadata
+
favicon fallback
+
other WordPress contexts

If you want separate public and backend identity

Use:

WordPress Site Icon
+
Admin Favicon

That architecture creates explicit separation without interfering with the global Site Icon system.

How TheOneWP fits into the distinction

TheOneWP keeps these responsibilities separate.

Admin Favicon controls the browser-tab icon used in WordPress administration pages.

Admin Bar Icon controls branding in the WordPress Toolbar.

Admin Menu Logo handles branding inside the left wp-admin navigation.

Custom Login Page handles visual identity around authentication.

The WordPress Site Icon remains a native WordPress site-identity setting rather than being replaced by those backend modules.

Admin Favicon vs Site Icon checklist

  • Use the WordPress Site Icon for the public site’s general icon identity.
  • Configure the Site Icon through WordPress rather than manually editing theme files where possible.
  • Use a square Site Icon source of at least 512 × 512 pixels as recommended by WordPress.
  • Remember that WordPress stores the Site Icon through the site_icon option.
  • Use has_site_icon() to test whether a Site Icon exists.
  • Use get_site_icon_url() when retrieving its URL programmatically.
  • Remember that wp_site_icon() creates several icon-related tags.
  • Remember that Core hooks wp_site_icon() into frontend wp_head.
  • Do not assume WordPress outputs the same function through admin_head.
  • Remember that browsers can still use the conventional /favicon.ico fallback.
  • Remember that WordPress’s do_favicon() can resolve that request through the Site Icon.
  • Use an explicit admin favicon when wp-admin needs a different icon.
  • Use admin_head for administration-only favicon markup.
  • Use login_head separately if the authentication screen also needs a custom favicon.
  • Do not modify WordPress Core files.
  • Do not use the global Site Icon filter merely to solve an admin-only requirement without considering its wider effects.
  • Use compact artwork that remains recognizable at favicon sizes.
  • Test light and dark browser chrome.
  • Inspect the generated document head when debugging.
  • Test the favicon URL directly.
  • Account for aggressive browser caching.
  • Check for duplicate or competing favicon tags.
  • Use different backend icons for staging and production when that helps operational recognition.
  • Do not treat favicon branding as a security mechanism.
  • Keep browser favicon, Admin Bar icon, admin menu logo and login branding conceptually separate.

Related guides

Final recommendation

The WordPress Site Icon and an admin favicon should be treated as two different layers of site identity.

The Site Icon is WordPress’s global icon system. It is stored as a site setting, exposed through APIs such as get_site_icon_url(), rendered into frontend icon metadata through wp_site_icon() and used by other WordPress systems including the conventional favicon request.

An admin favicon has a narrower purpose:

identify wp-admin

without changing the identity shown to public visitors.

The architectural distinction is therefore:

WordPress Site Icon
→ website identity

Admin Favicon
→ administration identity

Do not replace the Site Icon when all you need is backend differentiation. Do not build a separate admin favicon system when one global site icon is already sufficient.

If a website should display one icon everywhere, the native WordPress Site Icon is the simplest solution.

If the public website and administration interface need separate visual identities, keep the Site Icon unchanged and add an explicit favicon through admin_head.

This approach is particularly useful for agencies, staging environments, development workflows and teams that manage many WordPress installations at the same time.

TheOneWP Admin Favicon implements exactly that separation by outputting the selected favicon only inside WordPress administration pages, while leaving the site’s native Site Icon and public frontend favicon unchanged.

Simplify your WordPress stack

A modular WordPress toolkit. 104 focused tools.

Ultimately, you can build cleaner workflows, maintain fewer plugins and enable only the features each website actually needs.