Что такое динамический favicon и зачем он нужен
Favicon это маленький значок рядом с названием вашего сайта во вкладке браузера. Казалось бы, мелочь но именно такие детали создают ощущение профессионально сделанного сайта.
Современные операционные системы (Windows, macOS, Android, iOS) умеют переключаться между светлой и тёмной темой. Браузер знает, какую тему выбрал пользователь, и может передать эту информацию вашему сайту. Задача сделать так, чтобы favicon тоже реагировал на эту смену: тёмный значок на светлом фоне и светлый на тёмном.
Существует несколько способов это реализовать. В этой статье разберём самый элегантный из них один SVG-файл, который сам меняет цвета в зависимости от темы. Никакого JavaScript, никаких двух отдельных файлов.

Почему SVG, а не PNG или ICO
Традиционные форматы favicon .ico и .png это обычные растровые изображения. Они хранят пиксели, и менять в них что-либо «на лету» невозможно.
SVG это совсем другой формат. Это текстовый файл с описанием графики через код (похоже на HTML). Внутри SVG можно писать самый настоящий CSS, в том числе медиазапросы. Это и есть ключ к нашему решению.
Сравнение форматов:
- ICO/PNG: фиксированное изображение, один размер, нет адаптации к теме
- SVG: масштабируется без потери качества, поддерживает CSS и медиазапросы, один файл вместо нескольких
Шаг 1 Создаём SVG-файл favicon
Создайте файл favicon.svg и поместите его в папку вашей темы, например по пути wp-content/themes/ваша-тема/images/favicon.svg.
Вот шаблон с объяснением каждой части:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<style>
/* Цвет по умолчанию — для светлой темы */
:root {
--icon-color: #1a1a1a;
}
/* Если у пользователя тёмная тема — меняем цвет */
@media (prefers-color-scheme: dark) {
:root {
--icon-color: #ffffff;
}
}
/* Применяем переменную к элементам иконки */
.icon {
fill: var(--icon-color);
}
</style>
<!-- Ваша иконка. Здесь для примера — простой круг -->
<circle class="icon" cx="16" cy="16" r="14"/>
</svg>
Разберём, что здесь происходит:
:root { --icon-color: #1a1a1a; } задаём CSS-переменную с тёмным цветом. Это цвет для светлой темы пользователя.@media (prefers-color-scheme: dark) этот медиазапрос срабатывает, когда у пользователя включена тёмная тема. Внутри мы меняем переменную на белый цвет.fill: var(--icon-color) все элементы с классомiconиспользуют эту переменную. Когда переменная меняется меняется и цвет иконки.
Браузер читает этот CSS-файл точно так же, как CSS на обычной странице. Всё происходит автоматически, без единой строчки JavaScript.
Шаг 2 Разрешаем загрузку SVG в WordPress
По умолчанию WordPress блокирует загрузку SVG-файлов через медиабиблиотеку из соображений безопасности. Если вы собираетесь загружать SVG через Медиафайлы → Добавить новый, добавьте этот код в functions.php вашей темы.
Если же вы просто кладёте файл вручную через FTP или файловый менеджер хостинга этот шаг можно пропустить.
// Разрешаем загрузку SVG через медиабиблиотеку
function allow_svg_upload( $mimes ) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}
add_filter( 'upload_mimes', 'allow_svg_upload' );
// Без этого WordPress иногда отклоняет SVG даже после разрешения выше
function fix_svg_mime_check( $data, $file, $filename, $mimes ) {
$filetype = wp_check_filetype( $filename, $mimes );
return [
'ext' => $filetype['ext'],
'type' => $filetype['type'],
'proper_filename' => $filename,
];
}
add_filter( 'wp_check_filetype_and_ext', 'fix_svg_mime_check', 10, 4 );
Шаг 3 Подключаем favicon в WordPress
Теперь нужно сообщить браузеру, где находится наш favicon. Добавьте в functions.php:
function custom_svg_favicon() {
$favicon_url = get_template_directory_uri() . '/images/favicon.svg';
echo '<link rel="icon" href="' . esc_url( $favicon_url ) . '" type="image/svg+xml">';
}
add_action( 'wp_head', 'custom_svg_favicon' );
Что делает этот код:
get_template_directory_uri() возвращает URL папки вашей активной темы. Удобно: если вы переименуете тему или переедете на другой домен путь обновится автоматически.esc_url() функция безопасности WordPress, которая очищает URL от потенциально опасных символов. Хорошая практика использовать её всегда при выводе URL.wp_head хук, который добавляет наш тег<link>в секцию<head>каждой страницы.
Шаг 4 Добавляем поддержку старых браузеров (опционально)
SVG favicon поддерживается во всех современных браузерах: Chrome, Firefox, Edge. Safari добавил поддержку в версии 17 (2023 год). Если для вас важна совместимость с совсем старыми браузерами добавьте .ico-файл как запасной вариант:
function custom_svg_favicon() {
$theme_uri = get_template_directory_uri();
?>
<!-- Современные браузеры: SVG с адаптацией к теме -->
<link rel="icon" href="<?php echo esc_url( $theme_uri . '/images/favicon.svg' ); ?>" type="image/svg+xml">
<!-- Запасной вариант для старых браузеров -->
<link rel="icon" href="<?php echo esc_url( $theme_uri . '/images/favicon.ico' ); ?>">
<?php
}
add_action( 'wp_head', 'custom_svg_favicon' );
Браузер просматривает теги <link rel="icon"> сверху вниз и выбирает первый подходящий. Современный браузер выберет SVG, старый пройдёт мимо непонятного ему type="image/svg+xml" и возьмёт ICO.
Устранение конфликтов с темой
WordPress и многие темы имеют встроенную настройку favicon. Если вы видите, что ваш код не работает скорее всего, другая настройка его перекрывает.
Стандартная настройка WordPress
Перейдите в Внешний вид → Настроить → Идентификация сайта и удалите иконку сайта, если она там установлена. Встроенная настройка WordPress имеет приоритет.
Elementor
В панели Elementor перейдите в Elementor → Настройки → Стиль и убедитесь, что поле favicon там пустое.
Проверка в исходном коде
Откройте любую страницу сайта и нажмите Ctrl + U (исходный код). Найдите через Ctrl + F слово favicon или rel="icon". Вы сразу увидите, сколько тегов favicon присутствует и какой из них стоит первым.
Проверка результата
После того как всё настроено:
- Очистите кэш браузера (Ctrl + Shift + Delete)
- Если используете кэширующий плагин (WP Rocket, W3 Total Cache) очистите кэш там тоже
- Откройте сайт и посмотрите на вкладку браузера
- Переключите тему системы (светлая/тёмная) favicon должен поменяться
На macOS переключение темы: Системные настройки → Основные → Внешний вид. На Windows: Параметры → Персонализация → Цвета.
Итог
Мы реализовали динамический favicon с помощью одного SVG-файла. Вся логика смены темы находится внутри самого файла это делает решение чистым и простым в поддержке.
Если вам в будущем понадобится изменить цвета достаточно открыть favicon.svg в любом текстовом редакторе и поменять два значения в CSS-переменных. Больше ничего трогать не нужно.


