01О плагине
Nymbl Cookie Sentinel — плагин для WordPress, который управляет согласием посетителей на использование cookie: показывает баннер, ведёт настройки по категориям, блокирует аналитику и рекламу до получения согласия и хранит выбор посетителя.
Плагин создан для сайтов, работающих по законодательству Республики Беларусь (Закон № 99-З, НЦЗПД, cpd.by) и Российской Федерации (152-ФЗ, Роскомнадзор): гранулярное согласие, реестр cookie, прозрачность обработки.
- Баннер согласия — не блокирует контент, адаптивен, три действия: «Принять все», «Отклонить все», «Настроить».
- Модальное окно настроек — четыре категории с переключателями и списком конкретных cookie; список раскрывается кнопкой «Показать cookie (N)», чтобы окно оставалось компактным.
- Блокировка до согласия — счётчики и реклама не загружаются; после выбора категорий скрипты активируются без перезагрузки страницы.
- Вкладка «Интеграции» — 7 служб подключаются по идентификатору, без вставки кода: официальный сниппет плагин генерирует сам.
- Реестр cookie — таблица с названиями, целями, сроками хранения, доменами и третьими лицами; шаблоны сервисов, импорт CSV, массовые операции.
- Вкладка «Соответствие» — чек-лист из 7 проверок с подсказками, что именно исправить.
- Виджет повторного доступа — иконка в углу экрана появляется после того, как посетитель сделал выбор, и открывает настройки в один клик.
- Лёгкость — JS 18 КБ (5,6 КБ gzip), CSS 14 КБ (3,8 КБ gzip), без jQuery и внешних CDN.
02Установка
- Скачайте плагин из официального репозитория WordPress.
- Установите. В админке откройте Плагины → Добавить новый, найдите «Nymbl Cookie Sentinel» — или загрузите ZIP-архив кнопкой «Загрузить плагин».
- Активируйте. После активации в меню появится раздел «Cookie Consent», а баннер сразу начнёт показываться новым посетителям.
- Настройте. Пройдите по вкладкам «Общие настройки» → «Cookie» → «Интеграции» → «Соответствие» (быстрый порядок — в следующем разделе).
03Быстрый старт
Минимальный порядок действий, чтобы плагин приносил пользу сразу:
- Укажите ссылки на политики — «Общие настройки» → поля «Страница политики cookie» и «Страница политики конфиденциальности».
- Проверьте текст баннера. В описании можно использовать плейсхолдеры
{policy}и{privacy}— ссылки встраиваются прямо в предложение. - Заполните реестр cookie — вкладка «Cookie»: примените шаблоны сервисов и добавьте собственные записи.
- Подключите счётчики — вкладка «Интеграции»: выберите службу и введите только её идентификатор.
- Пройдите чек-лист — вкладка «Соответствие» покажет, что осталось заполнить.
04Вкладка «Общие настройки»
Здесь задаётся всё, что видит посетитель:
| Параметр | Что делает |
|---|---|
| Включение плагина | Глобальный выключатель — баннер и блокировка скриптов отключаются полностью. |
| Позиция баннера | Внизу или вверху экрана. |
| Тема оформления | Светлая, тёмная или автоматическая — по настройкам системы посетителя. |
| Акцентный цвет | Цвет кнопок, тумблеров, индикаторов и иконки виджета. По умолчанию #2563EB. |
| Ссылки на политики | Страница политики cookie и страница политики конфиденциальности. В описании баннера используйте плейсхолдеры {policy} и {privacy}: ссылки встраиваются в предложение. Если URL не указан — плейсхолдер остаётся обычным текстом. Если плейсхолдеров нет, ссылки добавляются после текста. |
| Тексты баннера | Заголовок, описание и четыре надписи: «Принять все», «Отклонить все», «Настроить», «Сохранить настройки». |
| Виджет управления | Иконка повторного открытия настроек: включение, выключение и положение — правый или левый нижний угол. |
| Версионирование согласия | Показывает текущую версию и кнопку «Показать баннер заново всем» — она нужна, если требуется запросить согласие немедленно. |
05Категории cookie
Гранулярность — ключевое требование регуляторов: посетитель сам решает, какие категории разрешить. В плагине их четыре:
| Категория | Назначение | Можно отключить | Примеры |
|---|---|---|---|
| necessary Необходимые | Базовая работа сайта: сессия, язык, CSRF-защита | Нет — всегда включены | PHPSESSID, CSRF-токен, язык |
| functional Функциональные | Запоминают предпочтения посетителя | Да | Тема, версия для слабовидящих |
| statistics Статистические | Аналитика посещаемости | Да | Яндекс.Метрика, GA4, Matomo |
| marketing Маркетинговые | Персонализация рекламы | Да | Facebook Pixel, VK Pixel |
06Реестр cookie
Законы требуют открыто рассказывать, какие cookie использует сайт. Вкладка «Cookie» — это реестр, который виден посетителям в окне настроек и закрывает требование прозрачности.
Поля записи
| Поле | Описание |
|---|---|
| Название | Техническое имя cookie, например _ga. Сохраняется как введено: регистр, точки, слэши и * для wildcard-имён (wordpress_logged_in_*). |
| Описание | Человеческое описание — зачем нужна cookie. |
| Категория | Одна из четырёх: necessary / functional / statistics / marketing. |
| Срок хранения | Число и единица: секунды, минуты, часы, дни, месяцы, годы или «сессионная». |
| Домен | На каком домене устанавливается cookie. |
| Третьи лица | Флаг «сторонняя» и название сервиса, который её устанавливает. |
| Активна | Выключенная запись остаётся в базе, но не показывается посетителям. |
Как заполнить реестр
- Откройте вкладку «Cookie» и в блоке «Шаблоны сервисов» выберите нужный шаблон — например, «Яндекс.Метрика» — и нажмите «Добавить шаблон».
- Добавьте собственные cookie кнопкой «Добавить cookie»: название, описание, категория, срок хранения.
- Сохраните — записи сразу появятся в окне настроек у посетителей. Массово включайте, выключайте и удаляйте записи через «Массовые действия», ищите — строкой поиска.
Шаблоны: WordPress, WooCommerce, Яндекс.Метрика, Google Analytics 4, Matomo, Facebook Pixel. При активации плагина шаблон WordPress добавляется автоматически, если таблица пуста. Шаблоны только добавляют записи и не перезаписывают ваши.
Импорт из CSV: разделитель ;, кодировка UTF-8, файл до 512 КБ и до 500 строк. Колонки: name;description;category;duration_value;duration_unit;domain;third_party;third_party_name. Строка заголовка распознаётся и пропускается.
07Блокировка скриптов
Главный принцип: до согласия аналитика и реклама не загружаются вообще — сайт работает как обычно, просто без невидимых счётчиков. После выбора категорий скрипты подхватываются динамически, без перезагрузки страницы.
Способ 1 — вкладка «Интеграции»
Подключение счётчика без вставки кода: выберите службу, укажите её идентификатор (номер счётчика, Measurement ID, Container ID, Pixel ID или URL Matomo) и категорию. Плагин сам сгенерирует официальный код счётчика, выведет его заблокированным и активирует после согласия. Идентификатор проверяется строгим форматом, произвольный код не принимается и не хранится.
Способ 2 — data-атрибут в теме
Замените у скрипта тип на text/plain и добавьте атрибут категории:
<!-- счётчик не выполнится, пока нет согласия -->
<script type="text/plain"
data-cookiecategory="statistics"
src="https://mc.yandex.ru/metrika/tag.js"></script>
Плагин найдёт такие скрипты, проверит согласие и, если категория разрешена, вернёт text/javascript — счётчик запустится на текущем визите. Работает и для инлайн-скриптов, а не только для файлов с src.
Способ 3 — автоблокировка известных счётчиков
Если Яндекс.Метрика или Google Analytics подключены другой темой либо плагином через стандартную систему скриптов WordPress, плагин распознаёт их по именам обработчиков: yandex-metrika, ym, ga, google-analytics, gtag, google-gtag, analytics. Такие скрипты блокируются до согласия на категорию «statistics». Список расширяется фильтром nymcs_blocked_script_handles.
Что происходит при разных действиях
| Действие посетителя | Результат |
|---|---|
| Первый визит | Баннер показан, счётчики не загружены |
| «Принять все» | Все скрипты загружаются динамически |
| «Отклонить все» | Работают только необходимые скрипты |
| «Настроить» → сохранить | Загружаются только выбранные категории |
| Возврат на сайт | Разрешённые скрипты грузятся сразу, баннер не показывается |
08Хранение согласия
- Основное хранилище —
localStorage, ключnymcs_consent. Внутри JSON: выбранные категории, timestamp и версия согласия. - Резерв — cookie
nymcs_consentсроком 12 месяцев (путь/, SameSite=Lax), если localStorage недоступен. - Серверная проверка — значение cookie ограничено 2 КБ и глубиной JSON 4, категории сверяются с белым списком, а согласие старой версии не принимается. В PHP используйте
nymcs_is_category_allowed( 'statistics' ). - Автоверсионирование — версия увеличивается при изменении текстов баннера, ссылки на политику cookie, реестра cookie и интеграций. Все посетители видят баннер повторно.
- Виджет — иконка в углу показывает окно настроек; посетитель может изменить выбор или отозвать согласие в любой момент.
JS-API и событие
// проверка категории в своём коде
window.NYMCS.isAllowed('statistics');
// открыть настройки и отозвать согласие
window.NYMCS.openSettings();
window.NYMCS.revoke();
// реакция на изменение согласия
document.addEventListener('nymcs:consent-updated', function (e) {
console.log(e.detail.categories, e.detail.version);
});
nymcs:consent-updated и PHP-действие nymcs_after_consent_updated срабатывают при каждом запросе с действительным согласием, а не только в момент выбора. Если нужен одноразовый эффект — фиксируйте факт обработки сами. Метод revoke() очищает сохранённое согласие и возвращает баннер, но уже загруженные скрипты не выгружает — они перестанут работать после перезагрузки страницы или при следующем визите.
09Вкладка «Интеграции»
Счётчики подключаются формой: служба → идентификатор → категория → размещение → приоритет. Код не вставляется вручную: плагин генерирует официальный сниппет службы при выводе страницы, не сохраняя его в базе, и печатает тег заблокированным (type="text/plain") до согласия на соответствующую категорию.
| Служба | Что вводится | Категория по умолчанию |
|---|---|---|
| Яндекс.Метрика | Номер счётчика (1–99 999 999), опция «Вебвизор» | statistics |
| Google Analytics 4 | Measurement ID: G-XXXXXXXX (также GT-, AW-, DC-, UA-) | statistics |
| Google Tag Manager | Container ID: GTM-XXXXXXXX | statistics |
| VK Pixel | Pixel ID: VK-RTRG-… | marketing |
| Top.Mail.ru | ID счётчика: TM-… или числовой | statistics |
| Facebook Pixel | Pixel ID — числовой идентификатор | marketing |
| Matomo | URL трекера (https://) и Site ID | statistics |
Для каждой интеграции задаются место вывода (head, body, footer), приоритет загрузки и переключатель «Включена». Рядом с полями выводится правовая справка по службе: домены, к которым обращается счётчик, какие данные он получает и ссылки на условия использования и политику конфиденциальности сервиса.
type="text/plain" + data-cookiecategory — плагин их активирует после согласия.
10Кэш, мультисайт и удаление
- Разметка выводится скрытой, показом управляет JavaScript, поэтому кэширование страниц не ломает логику согласия.
- Автоочистка кэша. При сохранении настроек, изменении реестра cookie, интеграций и версии согласия плагин очищает кэш: LiteSpeed Cache, WP Rocket, W3 Total Cache, WP Super Cache, WP Fastest Cache, Autoptimize, Hummingbird, Breeze, SiteGround Optimizer, Cache Enabler.
- Своя очистка. Для Varnish, nginx, Cloudflare и других слоёв подпишитесь на действие
nymcs_clear_cache— оно срабатывает перед каждым сбросом кэша. - Мультисайт. Активация в сети настраивает все сайты, а новые сайты подхватываются автоматически. Настройки и реестр cookie у каждого сайта свои.
- Удаление. При удалении плагина через админку WordPress удаляются настройки, версия согласия, кэш реестра и таблица cookie текущего сайта. В мультисайте проверьте таблицы остальных сайтов сети.
11Для разработчиков
Фильтры и действия
// Проверка: разрешена ли категория (PHP)
$allowed = apply_filters('nymcs_is_category_allowed', $allowed, $category);
// Добавить cookie в реестр программно
add_filter('nymcs_register_cookie', function ($cookies) {
$cookies[] = ['name' => 'my_cookie', 'category' => 'functional'];
return $cookies;
});
// Расширить список автоблокируемых обработчиков
add_filter('nymcs_blocked_script_handles', function ($handles) {
$handles[] = 'my-analytics';
return $handles;
});
// После обновления согласия (каждый запрос с согласием)
add_action('nymcs_after_consent_updated', function ($categories, $version) {
// своя логика; при необходимости дедуплицируйте сами
}, 10, 2);
// Своя очистка кэша (CDN, Varnish, nginx)
add_action('nymcs_clear_cache', function () {
// очистка на стороне хостинга
});
Хелперы и данные
nymcs_is_category_allowed( 'statistics' )— серверная проверка согласия на категорию.- Фильтр
nymcs_categories_meta— метаданные категорий, передаваемые в JS-конфиг. window.NYMCS_CONFIG— конфигурация баннера: версия, позиция, тема, метки, категории, срок хранения согласия.- Атрибуты разметки:
data-cookiecategory,data-nymcs-action,data-nymcs-script,data-nymcs-blocked-handle.
Безопасность
- Все входные данные проходят sanitize / escape, вывод экранируется.
- AJAX-запросы защищены nonce-проверкой, действия в админке — проверкой прав и nonce.
- Запросы к базе — только через
$wpdb->prepare. - Произвольный код не принимается и не хранится; идентификаторы служб валидируются строгими форматами при сохранении и при чтении.
- Ни одного запроса к сторонним сервисам без согласия; стили CSP-friendly.
12Соответствие законам
Беларусь: Закон от 7 мая 2021 г. № 99-З «О защите персональных данных», Указ Президента РБ от 28 октября 2021 г. № 422, требования НЦЗПД (cpd.by) — категоризация cookie, гранулярное согласие, прозрачность, отказ от «тёмных паттернов».
Россия: 152-ФЗ «О персональных данных», постановления Правительства РФ № 1119 (меры защиты) и № 687, приказ ФСТЭК России № 21, уведомление Роскомнадзора по ст. 22 152-ФЗ, приказ РКН № 179 (подтверждение уничтожения данных), ответственность по ст. 13.11 КоАП.
Чек-лист перед запуском — встроен в админку
- Указаны все cookie сайта (не менее пяти записей в реестре).
- Указаны сроки хранения каждой cookie.
- Есть ссылка на политику в отношении cookie.
- Работает кнопка «Отклонить все».
- Необходимые cookie нельзя отключить.
- Предусмотрено повторное согласие при изменении реестра.
- Аналитика и реклама не загружаются до согласия.
13Решение проблем
| Ситуация | Что делать |
|---|---|
| Баннер не появляется | Проверьте, что плагин включён в «Общих настройках». Откройте сайт в режиме инкогнито — согласие уже могло сохраниться. Очистите кэш страницы и CDN: плагин чистит кэш своих подопечных сам, но серверный и CDN-кэш — за вами. |
| Не видно иконку настроек в углу | Виджет появляется только после того, как посетитель сделал выбор. Проверьте также, что он включён в «Общих настройках» и не перекрыт элементами темы (z-index). |
| Метрика не работает после «Принять все» | Убедитесь, что интеграция добавлена, включена, привязана к категории «statistics», а номер счётчика указан верно. Если счётчик подключён ещё и темой — отключите дублирующий код. |
| Изменил реестр — баннер не показывается заново | Версия согласия увеличивается автоматически при сохранении реестра, поэтому проверьте кэш браузера и CDN. Запросить согласие немедленно можно кнопкой «Показать баннер заново всем» в «Общих настройках». |
| Скрипт в теме не блокируется | Замените type="text/javascript" на text/plain и добавьте data-cookiecategory с нужной категорией. Если скрипт подключён через wp_enqueue_script — добавьте его обработчик в фильтр nymcs_blocked_script_handles. |
| Хочу подключить сервис, которого нет в списке | Плагин сознательно не принимает произвольный код. Оберните скрипт сервиса в теме: type="text/plain" + data-cookiecategory — и он будет активирован после согласия вместе с остальными. |
| Кэш или CDN отдаёт старую версию | Плагин автоматически очищает кэш 10 популярных плагинов. Для Varnish, nginx и Cloudflare подключите свою очистку к действию nymcs_clear_cache. |