15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
22.10.2024

Как отобразить общесайтовое уведомление на сайте WordPress

Общесайтовое уведомление (sitewide notice) в WordPress — это постоянный баннер или панель уведомлений, отображаемая на каждой странице сайта и используемая для трансляции срочных объявлений, акций, предупреждений о согласии на использование файлов cookie или перебоях в работе сервиса всем посетителям одновременно. В отличие от контента, привязанного к конкретной странице, общесайтовое уведомление внедряется на уровне шаблона темы — через хук плагина, functions.php темы, движок условий отображения конструктора страниц или прямое изменение PHP-шаблона — что гарантирует его появление независимо от того, на какой URL попадает посетитель.

В этом руководстве рассматриваются четыре метода производственного уровня, ранжированные от наименьшей к наибольшей сложности реализации, с техническими граничными случаями, соображениями о производительности и подводными камнями кэширования, которые большинство руководств полностью упускают из виду.

Почему общесайтовые уведомления важны не только для маркетинга

Прежде чем выбирать метод реализации, разберитесь, что происходит под капотом. Общесайтовое уведомление отображается при каждом ответе сервера или внедряется через JavaScript после загрузки DOM. Это различие имеет реальные последствия:

  • Серверный рендеринг (SSR) через PHP-хуки шаблонов индексируется Googlebot и отображается до выполнения JavaScript — что критически важно для доступности и SEO.
  • Уведомления, внедряемые через JavaScript (распространено в некоторых плагинах), могут не появляться при первоначальном рендеринге Google и вызывать Cumulative Layout Shift (CLS), напрямую ухудшая показатель Core Web Vitals.
  • Полностраничное кэширование (WP Rocket, LiteSpeed Cache, Nginx FastCGI cache) будет кэшировать HTML уведомления. Если вам нужно показывать уведомление только авторизованным пользователям или на основе геолокации, кэшированная статическая страница полностью проигнорирует эту логику, если не настроить исключения кэша или не использовать фрагментное кэширование.

Здесь важна среда хостинга. На VPS Хостинге, где вы управляете конфигурацией Nginx или Apache, можно реализовать правила обхода кэша для определённых cookie, устанавливаемых плагином уведомлений. На общем хостинге вы ограничены тем уровнем кэша, который предоставляет хостинг-провайдер.

Метод 1: Использование специализированного плагина WordPress

Это самый быстрый путь к готовому к использованию уведомлению и не требует написания кода. Компромисс — накладные расходы плагина и зависимость от стороннего цикла обновлений.

Рекомендуемые плагины

ПлагинАктивных установокКлючевые преимуществаВозможные недостатки
WPFront Notification Bar100 000+Лёгкий, фиксированное позиционирование, скрытие на основе cookieОграниченные возможности дизайна в бесплатной версии
Simple Banner50 000+Минимальный след, поддержка пользовательских CSS/JSНет планирования в бесплатной версии
Hello Bar500 000+A/B-тестирование, геотаргетинг, сбор emailЗагружает внешние скрипты, добавляет задержку
Elementor Hello Theme BarН/Д (встроенный)Нативная интеграция, без дополнительного плагинаТребует Elementor Pro
WP Notification Bars20 000+Планирование, несколько панелей, отслеживание кликовУстаревший интерфейс

Шаг 1: Установка и активация

Войдите в панель администратора WordPress и перейдите в Плагины > Добавить новый. Найдите WPFront Notification Bar, нажмите Установить, затем Активировать.

Шаг 2: Настройка панели уведомлений

Перейдите в Настройки > WPFront Notification Bar. Ключевые поля конфигурации для заполнения:

  • Содержимое сообщения: поддерживает HTML, поэтому можно встраивать теги якорей, теги <strong> или встроенные стили напрямую.
  • Позиция: сверху или снизу. Размещение сверху более заметно, но увеличивает риск CLS, если панель загружается после первоначальной отрисовки. Размещение снизу безопаснее для Core Web Vitals.
  • Фиксированное поведение: включение «фиксированного» позиционирования удерживает панель на экране при прокрутке. Это использует position: fixed в CSS, что убирает элемент из потока документа и может перекрывать шапку темы на мобильных устройствах — проверяйте на нескольких размерах экрана.
  • Условия отображения: ограничьте уведомление определёнными типами записей, страницами или ролями пользователей. Показ уведомления только незарегистрированным пользователям, например, требует от плагина условной проверки is_user_logged_in().
  • Скрытие через cookie: когда пользователь закрывает уведомление, устанавливается cookie браузера. Уведомление не будет появляться снова до истечения срока действия этого cookie. Установите подходящее TTL — для 48-часовой распродажи подойдёт cookie на 2 дня. Для постоянного уведомления GDPR установите значение 0 (никогда не скрывать автоматически).

Шаг 3: Сохранение и проверка

Нажмите Сохранить настройки. Откройте сайт в режиме инкогнито (чтобы исключить влияние административных cookie на логику отображения) и убедитесь, что панель отображается на главной странице, в записи блога и на статической странице.

Важный граничный случай: если вы используете плагин полностраничного кэширования, очистите кэш после сохранения. В противном случае посетители увидят старую кэшированную версию страницы без уведомления.

Метод 2: Использование кастомайзера темы WordPress

Многие современные темы — особенно построенные на фреймворках Genesis, Astra, GeneratePress или OceanWP — включают встроенный компонент Announcement Bar или Top Bar. Этот подход не добавляет накладных расходов плагина и является наиболее чистым вариантом, если ваша тема его поддерживает.

Шаг 1: Доступ к кастомайзеру темы

Перейдите в Внешний вид > Настроить. Ищите разделы с названиями Header Options, Top Bar, Announcement Bar или Utility Bar. Точное название зависит от темы.

Шаг 2: Настройка панели объявлений

В панели кастомайзера вы обычно найдёте:

  • Текстовое поле или поле HTML для содержимого уведомления
  • Палитры цветов для фона и текста
  • Переключатель для глобального включения/отключения панели
  • Необязательное поле ссылки для кнопки CTA

Кастомайзер отображает изменения в iframe с живым предпросмотром. Используйте его, чтобы проверить взаимодействие панели с навигационным меню на десктопных и мобильных брейкпоинтах перед публикацией.

Шаг 3: Публикация

Нажмите Опубликовать. Изменения записываются в параметр базы данных theme_mods для вашей активной темы. Файлы не изменяются, что означает сохранение настроек после обновлений темы (для дочерних тем или тем, хранящих настройки в базе данных, а не в style.css).

Важно: если вы обновляете родительскую тему без использования дочерней темы, и тема хранит логику панели объявлений в файле шаблона, а не в хуке фильтра, ваша конфигурация уведомления может быть перезаписана. Всегда используйте дочернюю тему при изменении поведения темы.

Метод 3: Добавление общесайтового уведомления с помощью пользовательского кода

Прямая реализация на PHP и CSS даёт вам полный контроль над логикой рендеринга, стилизацией и производительностью. Это правильный подход, когда вам нужна условная логика отображения, которую не предоставляет ни один плагин, или когда вы хотите минимизировать HTTP-запросы и выполнение JavaScript.

Шаг 1: Добавление HTML через хук темы

Вместо прямого редактирования header.php — что нарушается при обновлениях темы — используйте хук действия wp_body_open или хук wp_head внутри functions.php вашей дочерней темы. Это идиоматический подход WordPress.

Добавьте следующее в functions.php вашей дочерней темы:

function alexhost_sitewide_notice() {
    // Only display for non-logged-in users
    if ( is_user_logged_in() ) {
        return;
    }
    ?>
    <div class="sitewide-notice" role="alert" aria-live="polite">
        <p>Scheduled maintenance on Saturday 02:00–04:00 UTC.
           <a href="/maintenance-info/">Learn more</a>
        </p>
        <button class="sitewide-notice__close" aria-label="Dismiss notice">×</button>
    </div>
    <?php
}
add_action( 'wp_body_open', 'alexhost_sitewide_notice' );

Почему wp_body_open вместо wp_head? Хук wp_head срабатывает внутри <head>, что является неправильным местом для видимого HTML. wp_body_open срабатывает сразу после открывающего тега <body>, что семантически корректно и поддерживается всеми темами, вызывающими wp_body_open() в своих шаблонах. Если ваша тема не вызывает эту функцию, используйте хук get_header с буфером вывода или отредактируйте header.php в дочерней теме.

Если вам нужно напрямую редактировать файл шаблона, откройте header.php вашей дочерней темы и вставьте разметку уведомления сразу после тега <body>:

<div class="sitewide-notice" role="alert" aria-live="polite">
    <p>This is an important announcement!
       <a href="https://example.com">Learn more here.</a>
    </p>
</div>

Шаг 2: Добавление CSS через кастомайзер или functions.php

Для небольших фрагментов CSS используйте Внешний вид > Настроить > Дополнительный CSS. Для более сложных случаев подключите таблицу стилей из дочерней темы.

Вставьте следующее в поле дополнительного CSS:

.sitewide-notice {
    background-color: #1a73e8;
    color: #ffffff;
    text-align: center;
    padding: 12px 40px;
    position: sticky;
    top: 0;
    width: 100%;
    z-index: 9999;
    box-sizing: border-box;
    font-size: 0.95rem;
    line-height: 1.5;
}

.sitewide-notice a {
    color: #ffffff;
    text-decoration: underline;
    font-weight: 600;
}

.sitewide-notice a:hover {
    opacity: 0.85;
}

.sitewide-notice__close {
    position: absolute;
    right: 16px;
    top: 50%;
    transform: translateY(-50%);
    background: transparent;
    border: none;
    color: #ffffff;
    font-size: 1.4rem;
    cursor: pointer;
    line-height: 1;
}

@media (max-width: 768px) {
    .sitewide-notice {
        font-size: 0.85rem;
        padding: 10px 36px;
    }
}

position: sticky против position: fixed: использование sticky сохраняет уведомление в потоке документа, предотвращая перекрытие навигации. fixed убирает его из потока, что может привести к рендерингу контента под панелью, если не добавить соответствующий padding-top к элементу <body> или <main>. Для большинства тем sticky является более безопасным вариантом по умолчанию.

Без механизма скрытия уведомление будет появляться при каждой загрузке страницы, что ухудшает пользовательский опыт. Добавьте этот скрипт через Внешний вид > Настроить > Дополнительный CSS (не идеально) или, что лучше, подключите его правильно в functions.php:

function alexhost_notice_dismiss_script() {
    wp_enqueue_script(
        'notice-dismiss',
        get_stylesheet_directory_uri() . '/js/notice-dismiss.js',
        array(),
        '1.0.0',
        true // Load in footer
    );
}
add_action( 'wp_enqueue_scripts', 'alexhost_notice_dismiss_script' );

Создайте /wp-content/themes/your-child-theme/js/notice-dismiss.js со следующим содержимым:

(function () {
    var COOKIE_NAME = 'sitewide_notice_dismissed';
    var COOKIE_TTL_DAYS = 7;

    function getCookie(name) {
        var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
        return match ? match[2] : null;
    }

    function setCookie(name, value, days) {
        var expires = new Date(Date.now() + days * 864e5).toUTCString();
        document.cookie = name + '=' + value + '; expires=' + expires + '; path=/; SameSite=Lax';
    }

    var notice = document.querySelector('.sitewide-notice');
    if (!notice) return;

    if (getCookie(COOKIE_NAME) === '1') {
        notice.style.display = 'none';
        return;
    }

    var closeBtn = notice.querySelector('.sitewide-notice__close');
    if (closeBtn) {
        closeBtn.addEventListener('click', function () {
            notice.style.display = 'none';
            setCookie(COOKIE_NAME, '1', COOKIE_TTL_DAYS);
        });
    }
}());

Этот скрипт самодостаточен, не зависит от jQuery и выполняется после загрузки DOM, поскольку подключается в подвале страницы.

Шаг 4: Проверка в различных контекстах

  • Откройте сайт в режиме инкогнито, чтобы убедиться, что уведомление отображается.
  • Нажмите кнопку скрытия и перезагрузите страницу — уведомление должно быть скрыто.
  • Вручную удалите cookie через DevTools браузера (Application > Cookies) и перезагрузите — уведомление должно появиться снова.
  • Проверьте на мобильном экране (минимальная ширина 320px), чтобы убедиться в работоспособности адаптивного CSS.

Метод 4: Использование конструктора страниц (Elementor, Bricks, Oxygen)

Конструкторы страниц с модулем Theme Builder позволяют визуально создать уведомление и назначить его всем страницам через условия отображения. Это лучший вариант для команд, управляющих контентом визуально и нуждающихся в точном дизайне без написания кода.

Elementor Pro: подход через Theme Builder

Шаг 1: Перейдите в Шаблоны > Theme Builder > Header (или создайте новый шаблон Custom Header).

Шаг 2: Добавьте новый Section в самом верху шаблона шапки. Внутри разместите виджет Text Editor или Heading с содержимым вашего объявления. Стилизуйте его с помощью панели Elementor — доступны цвет фона, типографика, отступы и виджеты кнопок.

Шаг 3: В разделе Publish > Display Conditions установите условие Entire Site. Это гарантирует отображение секции на каждой странице, использующей данный шаблон шапки.

Шаг 4: Опубликуйте шаблон. Elementor записывает вывод шаблона в собственные таблицы базы данных и отображает его через свой движок шаблонов при каждой загрузке страницы.

Примечание о производительности: Theme Builder Elementor Pro загружает дополнительные CSS и JavaScript ресурсы. На сайте, чувствительном к производительности, измерьте влияние с помощью Lighthouse до и после. Если накладные расходы неприемлемы, метод пользовательского кода (Метод 3) более эффективен.

Подход через Bricks Builder

В Bricks > Templates создайте новый шаблон Header. Добавьте контейнер в верхней части шапки, создайте дизайн уведомления и установите Conditions шаблона для применения ко всем страницам. Bricks генерирует чистый минималистичный HTML по сравнению с Elementor, что делает его лучшим выбором для сборок, ориентированных на производительность.

Сравнение всех четырёх методов

МетодТребуемые технические навыкиВлияние на производительностьСовместимость с кэшированиемПоддержка планированияПоддержка скрытия
Плагин (WPFront и др.)НизкийНизкое–СреднееТребует очистки кэшаДа (Pro)Да (на основе cookie)
Кастомайзер темыНизкийМинимальноеПолностью совместимоНетНет
Пользовательский PHP/CSS/JSСредний–ВысокийМинимальноеПолностью совместимоЧерез пользовательскую логикуДа (пользовательский cookie)
Конструктор страниц (Elementor Pro)СреднийСреднее–ВысокоеТребует очистки кэшаЧерез условия отображенияЗависит от плагина

Соображения о производительности и кэшировании

В этом разделе рассматривается наиболее распространённый сбой в производственной среде: уведомление, которое отлично работает при разработке, но ведёт себя непоследовательно на живом кэшированном сайте.

Полностраничное кэширование сохраняет полный HTML-вывод страницы. Если ваше уведомление отображается на стороне сервера, а затем страница кэшируется, каждый посетитель — независимо от того, скрыл ли он уведомление — получит один и тот же кэшированный HTML. JavaScript скрытия на основе cookie всё равно скроет уведомление на стороне клиента, но HTML всегда будет присутствовать в исходном коде.

Если вам нужно, чтобы сервер пропускал рендеринг уведомления для пользователей, которые его скрыли (например, для уменьшения HTML-нагрузки или предотвращения мгновенного появления уведомления при загрузке), необходимо настроить плагин кэша на обход кэширования при наличии cookie скрытия.

В WP Rocket добавьте имя cookie в Настройки > Расширенные правила > Никогда не кэшировать cookies:

sitewide_notice_dismissed

В LiteSpeed Cache перейдите в Cache > Excludes > Do Not Cache Cookies и добавьте то же значение.

На серверном уровне Nginx FastCGI cache добавьте условие обхода кэша в конфигурацию Nginx:

map $http_cookie $skip_cache {
    default 0;
    "~*sitewide_notice_dismissed=1" 1;
}

fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;

Это гарантирует, что пользователи, скрывшие уведомление, получат динамически сгенерированную страницу без HTML уведомления, тогда как все остальные посетители будут обслуживаться кэшированной версией с уведомлением.

Если вы запускаете WordPress на VPS с cPanel или полностью управляемом выделенном сервере, у вас есть прямой доступ к файлам конфигурации Nginx или Apache для реализации правил обхода кэша на уровне сервера — что невозможно на стандартных планах общего хостинга.

Требования к доступности

Общесайтовое уведомление, не соответствующее стандартам доступности, может подвергнуть ваш сайт юридическому риску в рамках WCAG 2.1 и ADA. Применяйте эти требования независимо от выбранного метода реализации:

  • Добавьте role="alert" и aria-live="polite" к контейнеру уведомления. Это заставит программы чтения с экрана объявлять содержимое уведомления при его появлении.
  • Убедитесь, что контрастность между текстом уведомления и фоном соответствует минимальному соотношению 4,5:1 для обычного текста (WCAG AA). Используйте инструмент, например WebAIM Contrast Checker, для проверки.
  • Кнопка скрытия должна быть доступна с клавиатуры и активироваться клавишами Enter и Space. Нативный элемент <button> обрабатывает это автоматически — не используйте <div> или <span> в качестве цели клика.
  • Не полагайтесь только на цвет для передачи срочности уведомления. Используйте явный текст (например, «Важно:» или «Уведомление:») в качестве префикса.

SEO-последствия общесайтовых уведомлений

Фиксированное или прикреплённое уведомление, отображаемое в HTML каждой страницы, индексируется Googlebot как часть содержимого страницы. Учитывайте следующие моменты:

  • Избегайте перегруженного ключевыми словами текста уведомления. Google может интерпретировать повторяющийся идентичный текст на тысячах страниц как низкокачественный шаблонный контент.
  • Используйте aria-hidden="true" для чисто декоративных уведомлений (например, баннер cookie, не несущий информационной ценности), чтобы текст не учитывался в расчётах SEO на странице.
  • Влияние CLS: уведомление, загружающееся после первоначальной отрисовки и сдвигающее контент вниз, создаст показатель CLS. Смягчите это, зарезервировав место для уведомления в CSS с помощью min-height на body, или отображая уведомление на стороне сервера, чтобы оно присутствовало в исходном HTML-коде.
  • Структурированные данные: если ваше уведомление анонсирует событие или акцию, рассмотрите добавление разметки схемы Event или Offer на страницу, а не полагайтесь только на текст баннера для видимости в поиске.

Практическая матрица принятия решений

Используйте этот контрольный список для выбора подходящего метода в вашей конкретной ситуации:

  • Вам нужно опубликовать уведомление менее чем за 10 минут без написания кода: используйте плагин (Метод 1). Установите WPFront Notification Bar, настройте его, очистите кэш.
  • В вашей теме есть встроенная панель объявлений и вам не нужна пользовательская логика: используйте кастомайзер темы (Метод 2). Нулевые накладные расходы, переживает обновления плагинов.
  • Вам нужна условная логика отображения (роль пользователя, тип записи, geo-IP, состояние cookie) или максимальная производительность: используйте пользовательский PHP/CSS/JS (Метод 3). Подключитесь к wp_body_open, правильно подключайте скрипты, реализуйте скрытие на основе cookie.
  • Ваша команда нетехническая и управляет сайтом визуально: используйте Elementor Pro Theme Builder или Bricks (Метод 4). Установите условия отображения на Entire Site.
  • Вы работаете на кэшированном VPS или выделенном сервере: независимо от выбранного метода, настройте правила обхода кэша для вашего cookie скрытия. Невыполнение этого является единственной наиболее распространённой причиной обращений в поддержку, связанных с уведомлениями.
  • Вам нужно, чтобы уведомление соответствовало WCAG 2.1: используйте Метод 3 (пользовательский код) или Метод 1 с плагином, поддерживающим role="alert". Проверяйте коэффициенты контрастности вручную.

Для команд, управляющих WordPress на подконтрольной им инфраструктуре — будь то план VPS Хостинга или выделенный сервер — подход с пользовательским кодом в сочетании с правилами обхода кэша на уровне сервера даёт наиболее надёжный и производительный результат. Для небольших сайтов на общем веб-хостинге хорошо настроенный плагин с поддержкой очистки кэша является прагматичным выбором.

Если ваш сайт обрабатывает транзакционные коммуникации наряду с общесайтовыми уведомлениями — например, подтверждения заказов или рекламные письма — убедитесь, что ваша инфраструктура почтового хостинга настроена с правильными записями SPF, DKIM и DMARC, чтобы письма, инициированные уведомлениями, не попадали в спам.

FAQ

В: Повредит ли общесайтовое уведомление моему SEO или показателю Core Web Vitals?

О: Может, если реализовано небрежно. Уведомление, внедряемое через JavaScript после первоначальной отрисовки, вызывает Cumulative Layout Shift (CLS), который является метрикой Core Web Vitals. Уведомления, отображаемые на стороне сервера, полностью избегают CLS. Делайте текст уведомления кратким и неповторяющимся, чтобы Google не воспринимал его как шаблонный контент на всём сайте.

В: Как показать общесайтовое уведомление только незарегистрированным пользователям?

О: В пользовательском PHP-коде оберните вывод уведомления в условную проверку: if ( ! is_user_logged_in() ) { ... }. В WPFront Notification Bar используйте условие отображения «User Role». В Elementor Pro установите условие отображения, исключающее авторизованных пользователей. Всегда очищайте кэш страниц после изменения этой логики.

В: Моё уведомление исчезает после обновления темы. В чём причина?

О: Скорее всего, вы редактируете header.php родительской темы напрямую, вместо использования дочерней темы или хука functions.php. Перенесите код уведомления в functions.php дочерней темы, используя хук действия wp_body_open. Обновления темы никогда не перезапишут functions.php в дочерней теме.

В: Можно ли запланировать автоматическое появление и исчезновение общесайтового уведомления?

О: Бесплатные версии большинства плагинов уведомлений не поддерживают планирование. WPFront Notification Bar Pro и WP Notification Bars Pro предлагают планирование по диапазону дат. В пользовательском коде можно реализовать планирование с помощью простого сравнения дат в PHP: проверьте current_time('timestamp') относительно временных меток начала и окончания перед выводом HTML уведомления.

В: Почему моё общесайтовое уведомление не отображается на кэшированных страницах?

О: Полностраничное кэширование сохраняет HTML-снимок страницы на момент первого запроса. Если кэш был создан до добавления вашего уведомления, посетители получают старый кэшированный HTML. Немедленно очистите весь кэш страниц после публикации нового уведомления. При использовании cookie скрытия настройте плагин кэша или сервер на обход кэширования для запросов, содержащих cookie скрытия, чтобы возвращающиеся посетители не видели мгновенного появления уведомления до его скрытия JavaScript.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать