
Cookie-баннер WordPress и Яндекс.Метрика: настройка Complianz, журнал согласий и 152-ФЗ
Реальный кейс profbuh.pro: настраиваем Complianz, запуск Яндекс.Метрики после согласия, отзыв без лишних запросов, историю решений, версии текста и очистку журнала. Пошаговая инструкция с кодом и скриншотами.

Содержание
Как настроить cookie-баннер в WordPress, чтобы Яндекс.Метрика запускалась после согласия, посетитель мог отказаться, а владелец сайта видел историю решений? Разбираем реальную настройку profbuh.pro — сайта бухгалтерской компании «Профбух» («Свой бухгалтер»): Complianz Premium, существующий счётчик в Perfmatters, ссылка в подвале, журнал согласий и ежемесячная очистка.
Это технический кейс с кодом и проверками, а не обещание «поставить плагин и автоматически выполнить весь 152-ФЗ». Правовые документы, основания обработки и обязанности оператора нужно согласовать с юристом под конкретную компанию. Ниже прямо отмечено, где работает штатный Complianz, а где используется наша отдельная разработка.
Версии стенда: WordPress 7.1.4, Complianz Premium 7.6.7, Perfmatters 2.6.5, FlyingPress 5.6.5, Kadence и WPCodeBox 2. Интерфейсы и хуки других версий могут отличаться. Проверки выполнены 11 ноября 2026 года; технические события журнала хранят время UTC.
Что требовалось сделать на profbuh.pro
На сайте уже стояли Яндекс.Метрика и собственный код событий. Задача состояла в управлении их запуском: не потерять существующую схему целей, не создать второй счётчик, добавить понятный выбор и сохранить техническое подтверждение решения. Для бухгалтерской компании особенно важно, чтобы уведомление соответствовало реальному поведению сайта.
- До решения посетителя аналитика не запускается. Необходимые механизмы сайта продолжают работать.
- «Принять» разрешает аналитику; «Отклонить» оставляет только необходимые категории.
- Настройки можно открыть повторно из подвала. Постоянная плавающая вкладка не закрывает контент.
- Выбор сохраняется в браузере, а изменения — в серверной истории с версией условий.
- Старые записи не накапливаются бесконечно; спорные записи можно защитить от автоочистки.
| Уровень | Что делает | Где находится |
|---|---|---|
| Интерфейс | Показывает баннер, кнопки, категории | Complianz |
| Блокировка | Разрешает выполнение скрипта только после выбора statistics | Complianz + разметка скрипта в Perfmatters |
| Отзыв | Останавливает активный счётчик и перезагружает страницу | Небольшой JavaScript в подвале |
| Последнее состояние | Сохраняет решение для браузерного ID | Complianz Premium |
| История и архив | Добавляет отдельные события и снимки текста | Собственный PHP-код в WPCodeBox 2 |
| Срок хранения | Корзина, защита записей, очистка по расписанию | Собственный модуль + WordPress cron |
Поток данных: посетитель → интерфейс Complianz → сохранение выбора → разрешение категории «Аналитика» → выполнение существующего кода Метрики → отправка в Яндекс. Параллельно сервер сохраняет событие выбора. Журнал согласий и статистика посещений — разные хранилища.
Что относится к 152-ФЗ, а что является техническим решением
Основной закон — 152-ФЗ от 27.07.2006 «О персональных данных». Он регулирует обработку персональных данных, а не внешний вид cookie-окна. Правовое основание выбирают для каждой цели обработки. В этом проекте для необязательной аналитики выбран предварительный добровольный выбор посетителя.
| Правовой вопрос | Как реализована техническая часть | Что остаётся оператору |
|---|---|---|
| Основание обработки и согласие: статьи 6 и 9 | Метрика заблокирована до разрешения; есть отказ и изменение решения | Проверить содержание согласия, цели и основание с юристом |
| Минимизация и срок: статья 5 | В историю дополнительно не копируем ФИО, IP и ClientID Метрики; есть ограничение хранения | Обосновать срок хранения и перечень данных |
| Информирование: статья 18.1 | Ссылка на политику из баннера | Заполнить и поддерживать актуальные документы |
| Защита: статья 19 | История закрыта правами администратора, экспорт защищён nonce | Обеспечить безопасность сервера, доступов и резервных копий |
| Обращения и отзыв: статьи 20 и 21 | Повторное открытие настроек, остановка счётчика, поиск истории | Рассматривать обращения и выполнять применимые сроки |
| Локализация и уведомление: статьи 18 и 22 | Баннер сам этого не обеспечивает | Проверить размещение баз и необходимость уведомления Роскомнадзора |
Кнопки отказа и настройки, выключенный первоначальный переключатель — наш способ сделать выбор понятным и проверяемым. Закон не задаёт конкретный CSS, зелёный цвет или название плагина. Срок журнала 24 месяца также выбран для проекта, а не установлен законом для всех cookie. 420-ФЗ от 30.11.2024 изменил ответственность по КоАП; отдельным «законом о дизайне cookie-баннера» он не является.
Перед запуском: проверьте, что по ссылкам действительно есть содержательные политика и согласие с реквизитами оператора, целями, сервисами и порядком обращения. Созданная пустая страница не заменяет документ. При технической проверке проекта встречались незаполненные страницы, поэтому юридическую готовность всего сайта нельзя выводить из работающего баннера.
Почему выбрали Complianz, а не форму или обычный поп-ап
Fluent Forms подходит для согласий при отправке заявки. Но форма сама по себе не управляет всеми скриптами на каждой странице. Kadence Conversions может показать красивое окно, однако логику категорий, повторного выбора и интеграцию с аналитикой пришлось бы разрабатывать отдельно. Здесь Complianz отвечает именно за управление согласием.
Базовый баннер и механизм блокировки не следует путать с серверными записями: в нашем проекте используется Complianz Premium с Records of Consent. Поверх него написана история изменений. Наличие Premium само по себе не означает, что появится наша страница «История согласий cookie».
- Complianz: https://wordpress.org/plugins/complianz-gdpr/.
- Premium и документация: https://complianz.io/.
- Perfmatters оставили местом хранения прежнего кода аналитики. Покупать его ради этого рецепта не обязательно: можно использовать существующий надёжный способ вставки скрипта.
- WPCodeBox 2 использовали для отдельного PHP-модуля. Не вставляйте PHP в текст статьи, HTML-виджет или поле JavaScript.
- FlyingPress очищает кэш страниц после изменений. Он не хранит пользовательское согласие.
Шаг 1. Подготовка: резервная копия и инвентаризация аналитики
- Создайте резервную копию файлов и базы. Сохраните исходный код счётчика и целей отдельным файлом, чтобы можно было вернуть прежнее состояние.
- Проверьте все места подключения Метрики: Perfmatters → Code → Global Scripts, настройки SEO-плагина, тему, менеджер тегов, отдельный плагин Метрики, HTML-виджеты.
- Найдите номер счётчика и вызовы init, reachGoal, dataLayer.push. Зафиксируйте, какой компонент отправляет каждую цель.
- Проверьте до изменения: загружается ли tag.js и сколько запросов watch отправляется при одном просмотре. Не считайте отсутствие кода в списке Snippets доказательством его отсутствия в Global Scripts.
- Внесите изменения сначала на копии сайта. Для рабочего сайта выберите время, когда можно сразу проверить формы, аналитику и откат.
У profbuh.pro счётчик 110393276 уже был установлен. Мы не создавали новый счётчик и не переносили весь JavaScript в текст баннера. Изменили условия выполнения существующего скрипта. Номер ниже заменён учебным значением: на своём сайте используйте собственный ID.
Шаг 2. Настройка Complianz: выбор до запуска статистики
- В WordPress откройте «Плагины → Добавить плагин», установите Complianz из официального каталога. Если нужен серверный журнал Premium, используйте лицензионный дистрибутив разработчика.
- Пройдите Complianz → Wizard. Укажите действительные сведения об операторе и используемых сервисах. Выберите модель предварительного согласия opt-in для целевой аудитории. Не копируйте обозначение региона из чужого проекта как юридический вывод.
- В разделе статистики укажите реальный способ подключения Метрики. Если её код остаётся в Perfmatters, не включайте ещё одну автоматическую установку счётчика.
- В Consent Banner → General выберите категории с кнопками Accept — Deny — View Preferences. Для плавающей кнопки управления в нашем проекте выбрано Hide everywhere: повторный доступ будет в подвале.
- Включите баннер и сохранение записей согласий в Premium. Проверьте Records of Consent реальным тестовым выбором: установленная лицензия ещё не доказывает, что записи появились.
- В Integrations проверьте блокировку сторонних скриптов. Отключите автоматическое принятие по прокрутке, таймеру или закрытию окна.
- Переведите видимые тексты и привяжите юридические страницы. Сохраните изменения.

| Действие посетителя | Результат для Метрики |
|---|---|
| Первый вход без выбора | Не запускается |
| Нажал «Принять» | Разрешена аналитика, счётчик загружается |
| Нажал «Отклонить» | Не запускается; после прежнего согласия останавливается |
| Нажал «Настроить» | Только открыл панель, нового согласия ещё нет |
| Сохранил выбор с выключенной аналитикой | Аналитика не разрешена |
| Закрыл окно крестиком без прежнего согласия | Нового согласия нет; аналитика не разрешена |
| Закрыл настройки при уже сохранённом согласии | Само закрытие не меняет прежний выбор |
Шаг 3. Как заблокировать Яндекс.Метрику до согласия
Используем механизм Complianz: скрипт получает тип text/plain и категорию statistics. Браузер не выполняет такой блок как обычный JavaScript. После разрешения статистики Complianz активирует его. Это отличается от ситуации, когда обычный счётчик уже запущен, а баннер лишь показывается поверх страницы.
<script type="text/plain" data-category="statistics" data-no-optimize="1">
// Здесь — ваш существующий полный код Яндекс.Метрики.
// Сохраните загрузчик tag.js и существующие параметры init.
// Не вставляйте второй счётчик и не дублируйте init.
</script> 
Это оболочка, а не полный код счётчика. Внутри должен остаться полученный в настройках Метрики загрузчик и init вашего проекта. У нас были включены webvisor, clickmap, trackLinks, accurateTrackBounce и ecommerce через dataLayer. Перечень опций выбирают по задачам и правовым документам, а не копируют механически.
// Фрагмент параметров проекта, НЕ второй код установки:
ym(YOUR_COUNTER_ID, 'init', {
webvisor: true,
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
ecommerce: 'dataLayer'
}); Атрибут data-no-optimize=»1″ оставлен как дополнительная подсказка оптимизаторам; он не является универсальной гарантией исключения во всех плагинах. В FlyingPress/Perfmatters проверьте реальные правила задержки и оптимизации JavaScript. Управляющий код согласия не должен ждать случайного пользовательского клика, а заблокированный счётчик не должен превращаться обратно в обычный script до выбора.
Проверьте также noscript-изображение Метрики и любые отдельные пиксели: они не должны отправлять запросы в обход выбранной модели согласия. Не переносите «запасной» трекер в незаблокированный HTML. Документация Complianz по разметке: официальное руководство интеграций.
Шаг 4. Русский текст, зелёные кнопки, светлая и тёмная тема
В Consent Banner → Texts задайте все подписи, а не только заголовок. Проверьте основной экран, раскрытые категории, кнопки сохранения, ссылку на документ, подсказки и повторно открытые настройки. Английское Privacy Statement на русском сайте заменили на «Политика конфиденциальности».
| Поле | Текст примера |
|---|---|
| Заголовок | Ваш выбор cookie |
| Accept | Принять |
| Deny | Отклонить |
| View preferences | Настроить |
| Save preferences | Сохранить выбор |
| Functional | Необходимые |
| Statistics | Аналитика |
| Ссылка на документ | Политика конфиденциальности |
Наш краткий текст: «Мы используем необходимые cookie для работы сайта. С вашего согласия подключаем Яндекс.Метрику, чтобы анализировать посещения и действия на сайте. Вы можете отказаться от аналитики или изменить выбор в “Настройках cookie”». Этот текст объясняет интерфейс; содержание юридических документов всё равно нужно подготовить отдельно.
Сначала настройте Consent Banner → Colors штатными средствами. Для связи с тёмной темой используйте реальные переменные палитры вашей темы, а не глобальную замену всех кнопок сайта. У Kadence это переменные global-palette, у Blocksy — другая система: одно имя переменной не подходит любой теме. Подробности — в нашем руководстве по светлой и тёмной теме Kadence.

Проверьте контраст текста и фона, видимость переключателя, клавиатурный фокус, крестик закрытия, ширину кнопок на телефоне. Не убирайте фокус outline ради внешнего вида: посетитель должен понимать, какая кнопка выбрана с клавиатуры.
Шаг 5. Рабочие «Настройки cookie» в подвале
Первоначальная ссылка с адресом # могла прокручивать страницу наверх, не открывая настройки. Для действия на текущей странице используем кнопку type=»button» и штатный класс Complianz. В Kadence её разместили через «Внешний вид → Виджеты → Подвал 4 → Произвольный HTML». В блочной теме найдите соответствующую часть шаблона Footer.
<button type="button"
class="cmplz-manage-consent ym-disable-clickmap ym-hide-content ym-disable-tracklink">
Настройки cookie
</button> Complianz может применить к классу управления оформление плавающей вкладки. Поэтому в полном файле нашего подвала есть локальные стили display, position, background и border: кнопка выглядит как строка футера. Не применяйте эти стили ко всем кнопкам сайта. Сначала проверьте штатное скрытие вкладки, затем оформление только этого элемента.

После сохранённого выбора баннер исчезает полностью. Посетитель открывает его снова из подвала. Проверка проста: нажмите ссылку внизу длинной страницы — должны появиться настройки, а не измениться только адрес или положение прокрутки.
Шаг 6. Отзыв согласия: как остановить уже работающий счётчик
Блокировка при первом входе не решает всё. Если человек уже разрешил аналитику, tag.js находится в памяти страницы. При отзыве необходимо остановить этот экземпляр и загрузить страницу с новым запретом. В нашем подвале обработчик слушает событие cmplz_status_change для категории statistics, вызывает destruct и через 500 мс перезагружает страницу. Небольшая задержка даёт штатному запросу журнала возможность завершиться, но сама по себе не гарантирует его доставку при проблемах сети.
Ниже учебный вариант обработчика для одного счётчика; полный фактически использованный вариант находится в архиве. Не подключайте оба одновременно. На мультисайте названия cookie могут иметь префикс; для новой интеграции предпочтительны API и события Complianz, а не слепое чтение cookie.
(function () {
const counterId = 12345678; // замените своим ID
let allowed = typeof cmplz_has_consent === 'function'
? cmplz_has_consent('statistics') : false;
document.addEventListener('cmplz_status_change', function (event) {
if (!event.detail || event.detail.category !== 'statistics') return;
const next = event.detail.value === 'allow';
if (allowed && !next) {
if (typeof window.ym === 'function') window.ym(counterId, 'destruct');
setTimeout(function () { window.location.reload(); }, 500);
}
allowed = next;
});
})(); Почему пришлось исключить сам баннер из карты кликов
При проверке нашли пограничный случай: после прежнего согласия клик по «Отклонить» успевал породить clmap до перезагрузки. Это был запрос карты кликов, а не доказательство запуска Метрики при первом входе без согласия. Исправление — исключить элементы управления согласием из карты кликов средствами самой Метрики.
(function () {
const selector = '.cmplz-cookiebanner, #cmplz-manage-consent, .cmplz-manage-consent';
function mark(element) {
element.classList.add('ym-disable-clickmap', 'ym-hide-content', 'ym-disable-tracklink');
}
function markTree(root) {
if (root.nodeType === 1 && root.matches(selector)) mark(root);
if (root.querySelectorAll) root.querySelectorAll(selector).forEach(mark);
}
markTree(document);
new MutationObserver(function (records) {
records.forEach(function (record) { record.addedNodes.forEach(markTree); });
}).observe(document.body, { childList: true, subtree: true });
})(); Этот код размещают после появления document.body, например в подвале. MutationObserver обрабатывает добавленные узлы, потому что Complianz может вставить окно позже загрузки страницы. Здесь нет перехвата fetch, XMLHttpRequest или остановки распространения кликов: штатный обработчик Complianz должен получать нажатие.
| Класс Метрики | Назначение |
|---|---|
| ym-disable-clickmap | Не учитывать клики внутри элемента в карте кликов |
| ym-hide-content | Скрывать содержимое элемента в Вебвизоре; это не выключение всей записи Вебвизора |
| ym-disable-tracklink | Не считать эту ссылку внешним переходом |
Назначение классов описано в разметке HTML для Метрики и настройках Вебвизора. После исправления в повторном тесте на profbuh.pro запросов clmap и других запросов Метрики после действия отзыва не обнаружено. Уже отправленные до отзыва события этим не удаляются; запросы, находившиеся в полёте, нельзя «отозвать» задним числом.
Как не сломать цели и не получить двойную аналитику
Согласие определяет, когда аналитике разрешено работать. Схема целей определяет, что именно она отправляет. Это разные задачи. На сайте были собственные события через dataLayer, поэтому добавлять рядом прямой reachGoal для каждого события без проверки обработчика нельзя: так легко получить двойную конверсию.
// Это запись в локальный массив событий:
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ event: 'lead_submit' });
// Это отдельная команда Метрике, НЕ вставляйте её «на всякий случай»:
// ym(YOUR_COUNTER_ID, 'reachGoal', 'lead_submit'); dataLayer.push сам по себе не доказывает отправку цели в Яндекс. Его может читать действующий менеджер тегов или другой обработчик. Сначала найдите эту связку. Если прямого обработчика действительно нет, проектируйте одну схему отправки и проверяйте её отдельно. В финальной доработке исключения баннера из карты кликов мы не меняли цели и не добавляли reachGoal.
- Проверьте каждую бизнес-цель после согласия: отправка успешной формы, клик по телефону, переход в мессенджер.
- Убедитесь, что одно реальное действие даёт одно событие, а ошибка формы не считается заявкой.
- После отказа повторите действие: сетевой отправки в Метрику быть не должно.
- Не воспроизводите накопленную до согласия очередь событий автоматически: это отдельное решение о данных, собранных до выбора.
- Сверяйте идентификатор цели, счётчик, фильтры и задержку отчёта. Сообщение отладчика не заменяет проверку реального запроса и отчёта.
Шаг 7. Где находится журнал согласий
У владельца есть два разных экрана. Complianz → Tools → Records of Consent показывает штатные записи. Инструменты → История согласий cookie — наша дополнительная история, где новое решение добавляется отдельной строкой. Старые решения до включения доработки задним числом не восстановлены.
/wp-admin/admin.php?page=complianz#tools/records-of-consent
/wp-admin/tools.php?page=pb-consent-audit
/wp-admin/tools.php?page=pb-cookie-retention Добавьте к этим путям адрес своего сайта. Две страницы pb-* появятся только после установки нашего PHP-модуля. Посторонний посетитель не должен получать к ним доступ. Журнал лежит в базе WordPress на сервере, а не непрерывно скачивается на компьютер администратора.

| Поле | Как читать |
|---|---|
| ID Complianz | Идентификатор браузерной записи; не ФИО и не ClientID Метрики |
| Дата UTC | Когда сервер записал событие; не локальное время компьютера |
| Решение | Разрешение аналитики, запрет, отзыв или отсутствие выбора |
| Категории | Что было разрешено в этом состоянии |
| Версия / снимок | Версия настроек и хеш архивного набора текстов |
| Действие | Принять, отклонить, сохранить, закрыть — если передано браузером |
| Предыдущие категории | Позволяют увидеть изменение, например разрешение → отказ |
Для тестового ID 16 записаны три состояния: 22:24:48 UTC — аналитика не разрешена; 22:24:59 — разрешена; 22:25:19 — согласие отозвано. Начальная запись запрета не обязательно означает нажатие «Отклонить»: смотрите отдельное поле действия. Нельзя выдавать отсутствие разрешения за активное согласие.
Экспорт CSV и JSON
- Откройте историю и введите ID Complianz. На экране показываются последние 30 записей по выбранному фильтру — это не «последний месяц».
- Нажмите «Посмотреть запись и текст», чтобы увидеть детали и источник версии.
- Скачайте JSON конкретной записи: он содержит событие и связанный снимок.
- CSV в этой реализации выгружает всю активную историю, даже если экран отфильтрован. Для одного обращения отберите нужный ID и не передавайте посторонние записи.
- Годовалые события доступны через тот же интерфейс и экспорт, пока не истёк срок хранения. Прямой вход в базу для обычной проверки не нужен.
Шаг 8. Почему ID баннера 0 не равен версии условий
В штатном журнале встречалось значение 0 в колонке баннера. Важно различать идентификатор баннера, banner_version и cmplz_policy_id: это разные величины. В нашем тесте действующий баннер имел ID 1, версию настроек 22; cookie политики имела отдельное значение. Одно число нельзя подставлять вместо другого.
Доработка заполняет недостающий идентификатор в текущем обновлении записи и архивирует фактическую версию. Старые строки массово не переписываются. Если браузер показывает старую кэшированную версию, код проверяет её соответствие сохранённому снимку. При несовпадении запись помечается как неподтверждённая, а текущий текст не выдаётся за тот, который видел человек.
// Упрощённая схема архива: это объяснение, не полный модуль.
$json = wp_json_encode($snapshot, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$hash = hash('sha256', $json);
// Повторно используем снимок с тем же hash, а не копируем текст к каждому событию.
$integrity = hash_hmac('sha256', wp_json_encode($event), wp_salt('auth')); Снимок хранит выбранные настройки баннера и исходное содержимое указанных юридических страниц. Он не является видеозаписью интерфейса и не гарантирует точное отображение всех динамических блоков. В исходнике перечислены конкретные slugs страниц: при переносе их обязательно заменить своими.
SHA-256 позволяет сравнивать содержимое. HMAC помогает обнаруживать изменение при наличии правильного ключа, но не является подписью посетителя или независимой доверенной отметкой времени. Администратор с доступом к базе и ключам технически может менять данные. При ротации WordPress salts учитывайте, что проверка старого HMAC новым ключом не сойдётся.
Шаг 9. Хранение 24 месяца, корзина и cron
Журнал должен быть полезным и управляемым по объёму. Для проекта выбрали 24 полных календарных месяца активного хранения. Очистка стартует первого числа в 02:00 UTC и работает порциями. При месячном расписании фактический возраст перед переносом в корзину может составлять примерно 24–25 месяцев: это не удаление ровно в секунду двухлетия.

- Сначала просроченные записи переходят в корзину. Для штатной таблицы Complianz перед удалением создаётся восстановительная копия строки.
- Восстановление доступно ещё минимум 30 дней. Затем выполняется окончательное удаление штатной очисткой WordPress либо следующим месячным запуском модуля.
- Если корзина WordPress отключена, наша очистка останавливается, чтобы не заменить мягкое удаление немедленным окончательным.
- ID под защитой пропускаются, включая корзину. Снимки, на которые ссылаются оставшиеся записи, не удаляются; текущая версия также сохраняется.
- После восстановления ID автоматически защищается от повторной очистки до снятия защиты.
- Резервные копии сервера живут по отдельному расписанию: очистка рабочей базы не стирает их автоматически.
В «Инструменты → Хранение журнала cookie» есть кнопка «Проверить без удаления», дата следующего запуска, сведения о последней очистке, поле ID и причины защиты, корзина. Для обращения посетителя сначала включите защиту и сохраните выгрузку. После окончания спора решение о снятии защиты принимает владелец по согласованной процедуре.
Почему серверный cron каждую минуту не означает очистку каждую минуту
Серверный cron запускает диспетчер WordPress, а диспетчер исполняет только созревшие задачи. В TimeWeb уже был включён запуск wp-cron.php каждую минуту через PHP 8.2. Мы проверили работу очереди. Сама очистка журнала остаётся ежемесячной; большие объёмы продолжаются пакетами через 5 минут.
# Учебный пример. Уточните путь к PHP и сайту у хостинга.
* * * * * /path/to/php82 /path/to/site/wp-cron.php >> /path/to/cron.log 2>&1 Не копируйте эти пути буквально. При отключённом запуске WP-Cron от посещений серверная задача обязательна. Не отключайте WP-Cron, пока не настроен и не проверен его заменитель. Наличие переключателя «Включено» ещё не равно успешному выполнению: проверьте лог и изменение времени задач. Для нашей очистки дополнительно оставлен резервный запуск созревшей задачи в конце запроса к сайту; он не включает глобально все задачи и не делает дополнительный HTTP-запрос.
Работа ведётся небольшими пакетами с блокировкой повторного запуска. На малом сайте это удобнее, чем сканировать и удалять всю историю одним тяжёлым SQL-запросом. Периодически контролируйте размер базы и бэкапов: объём зависит от числа изменений решений, а не только от числа посетителей.
Как разобраться, если посетитель говорит «я согласия не давал»
Фамилия не превращается автоматически в браузерный ID. Если Иван Иванович написал письмо, журнал не умеет искать его по ФИО, когда это имя никогда не собиралось в связи с cookie. Не нужно ради этого начинать собирать паспорта или связывать всех посетителей с CRM.
- Зарегистрируйте обращение, уточните адрес страницы, примерное время и браузер, из которого человек заходил.
- Попросите при его участии посмотреть данные именно этого сайта в браузере. В Chrome: DevTools → Application → Storage → Cookies → домен сайта. Нужен cmplz_id, если он сохранился. Не просите экспорт всех cookie браузера.
- Найдите ID в журнале, проверьте последовательность, категории, время UTC, действие и источник версии.
- Поставьте историю ID под защиту от очистки, выгрузите нужные JSON и относящиеся к спору строки CSV.
- Если ID удалён или человек использовал другой браузер, честно зафиксируйте, что надёжная связь не установлена. Не назначайте ему «похожую» запись по времени.
- Рассмотрите отзыв и обращение с юристом. Отказ на сайте останавливает будущую отправку, но не удаляет автоматически ранее полученные Яндексом данные.
Совпадение cmplz_id с серверной историей подтверждает связь записи с конкретным браузерным состоянием и его техническим выбором. Оно не устанавливает личность и не гарантирует, кто физически нажал кнопку на общем компьютере. Доказательства оцениваются в совокупности; один плагин не обещает исход проверки или суда.
Для запроса о данных и для требования прекратить обработку применяются разные нормы и сроки. Не назначайте всем обращениям единый срок «месяц»: используйте статьи 20 и 21 закона и процедуру оператора. Не отправляйте заявителю полный журнал других посетителей.
Как проверить Метрику до согласия: пошаговый протокол
- Закройте все окна инкогнито и откройте новое. Это важно: открытые приватные вкладки могут делить одно временное хранилище. Используйте обычную публичную страницу, например https://profbuh.pro/kontakty/.
- До выбора откройте DevTools → Network. Включите Preserve log, очистите список и перезагрузите страницу. Фильтруйте yandex, metrika, mc.yandex; проверьте и другие домены счётчика, если они есть.
- Не нажимая «Принять», подождите загрузки страницы, прокрутите её. Не должно быть загрузки tag.js и отправок watch/clmap от вашего счётчика.
- В Application → Cookies проверьте отсутствие новых аналитических cookie. Само наличие старых cookie в непустом профиле ещё не доказывает новый запрос.
- Нажмите «Принять». Должны появиться загрузка счётчика и запрос просмотра. Проверьте HTTP-статус, номер счётчика и параметры.
- Выполните одно целевое действие и проверьте, что цель отправляется один раз. Не используйте платёж или реальную заявку клиента как тест без необходимости.
- Откройте «Настройки cookie» в подвале. При ранее сохранённом согласии переключатель должен отражать именно его, а не всегда сбрасываться.
- Очистите Network и нажмите «Отклонить». Проверьте отсутствие clmap от этого клика и новых отправок после отзыва, затем после перезагрузки.
- Откройте серверную историю и сопоставьте запрет, разрешение и отзыв по одному тестовому ID.
- Повторите на телефоне, в светлой и тёмной теме, с включённым кэшем. Проверьте футер и формы на разных типах страниц.
Поиск строки mc.yandex.ru в исходнике не заменяет Network: заблокированный text/plain может содержать адрес и при этом не выполняться. И наоборот, скрипт может подключаться динамически и отсутствовать в первоначальном HTML. Расширение-блокировщик или ошибка сети способны создать ложное впечатление успешной блокировки — проверяйте тот же браузер после принятия.
| Проверка profbuh.pro | Наблюдение |
|---|---|
| Чистое состояние до выбора | Запросов Метрики не обнаружено |
| После «Принять» | tag.js и запрос watch счётчика 110393276, HTTP 200 |
| После отзыва с исправленной разметкой | clmap и других запросов Метрики после действия не обнаружено |
| После перезагрузки с отказом | Запросов Метрики не обнаружено |
| Серверная история | Тестовый ID 16: три отдельных состояния |
| Масштаб проверки | Финальный сетевой тест — /kontakty/ в авторизованном браузере с временно очищенными cookie согласия; это не утверждение о проверке всех устройств и страниц |
Отдельно проверялось отображение первоначально выключенной аналитики в инкогнито. Сетевой протокол выше стоит повторять после каждого изменения загрузчика, оптимизации, темы или версии Complianz. Проверка одной страницы не сертифицирует весь сайт навсегда.
Типичные ошибки и обслуживание после запуска
| Симптом | Что проверить |
|---|---|
| Баннер есть, Метрика работает сразу | Второй незаблокированный счётчик, noscript, менеджер тегов, кэш |
| Нажатие в подвале бросает наверх | Ссылка # вместо рабочей кнопки; потерян класс; не загружен Complianz |
| Осталась плавающая вкладка | Manage consent display options и кэш CSS/HTML |
| После принятия нет статистики | Категорию statistics, ошибки JS, правила Delay JS, блокировщик, номер счётчика |
| Две одинаковые цели | Параллельные dataLayer-обработчик и reachGoal, повторная подписка |
| Нет истории | Premium Records включён; PHP-модуль активен; запрос сохранения не блокируется |
| Старая версия в записи | Проверьте браузерную версию и снимок; не заменяйте её текущим текстом |
| Очистка не запускается | Время UTC, cron хостинга, логи, очередь и блокировка задачи |
Очистка FlyingPress или Perfmatters не удаляет cookie посетителя. Если выбор сохранён на 365 дней, вчерашнее согласие обычно продолжает действовать завтра. Повторный запрос зависит от срока, удаления cookie, другого браузера и настройки изменения политики. Существенные новые цели обработки нельзя просто «прикрыть» старым выбором.
После обновлений: резервная копия → проверка совместимости → очистка кэша → чистый браузер → принятие → отзыв → проверка журнала. Раз в месяц смотрите результат очистки и состояние резервных копий. Изменения текста, целей и списка сервисов фиксируйте вместе с версией и датой.
Нужно ли спасать всю статистику серверной отправкой
Мы не включали дополнительную серверную аналитику для отказавшихся. Удаление _ym_uid или IP из собственного payload само по себе не доказывает обезличивание: остаются адреса страниц, UTM, источники, связки событий и сетевые метаданные. Measurement Protocol Метрики имеет собственный формат и обязательный cid; это не универсальный переключатель «собирать всё анонимно без согласия».
Точные потери аналитики нельзя объявить заранее: «до 80%» и «принимают 20–70%» не являются измеренными показателями этого проекта. Журнал изменений без числа показов баннера и корректного подсчёта посетителей не даёт долю принятия. Для владельца здесь выбран приоритет управляемой обработки, а не скрытого обхода отказа.
Исходники: что именно мы добавили и как повторить
Скачать архив примеров кода. Он содержит фактически использованные PHP-модуль истории и хранения, HTML/JavaScript подвала и README с ограничениями. Это исходники проектной доработки, а не официальный плагин Complianz и не универсальный сертифицированный продукт.
- Изучите README. Сравните версии WordPress, PHP и Complianz. PHP-файл зависит от таблиц и хуков Premium; при их изменении необходима адаптация.
- В HTML-файле замените номер счётчика 110393276 своим. Убедитесь, что такой счётчик существует и установлен только один раз.
- В PHP проверьте список slugs юридических страниц, часовые пояса, схему хранения и текст о хостинге. Упоминание TimeWeb относится к данному кейсу.
- Разместите PHP через менеджер PHP-сниппетов или оформите отдельный плагин с участием разработчика. В WPCodeBox при необходимости уберите начальный <?php согласно режиму редактора. Не включайте одновременно базовую и объединённую версии.
- На тестовом сайте включите Premium Records of Consent, затем модуль. Создайте тестовые решения и проверьте историю, архив текста, экспорт, права доступа.
- Для теста очистки используйте только искусственные записи в отдельной базе. Проверьте защищённый ID, корзину, восстановление и повторный запуск. Не меняйте время сервера рабочего сайта ради теста.
- Установите кнопку и JS в подвал, настройте оболочку существующего счётчика, очистите кэш и выполните весь протокол.
- Перед переносом на рабочий сайт проверьте возможность отката и согласуйте правовые документы. После переноса снова проверьте публичную страницу без авторизации.
В PHP используются закрытые типы записей pb_cookie_event, pb_cookie_version и pb_cookie_native. Они не публикуются в REST API. Событие сохраняется через cmplz_store_consent: сначала запоминаются прежние категории, затем добавляется новая строка. При смене текста одинаковые снимки повторно не создаются. Экспорт доступен с manage_options и проверкой nonce.
// Реальная точка подключения истории к Complianz:
add_action('cmplz_store_consent', [__CLASS__, 'before'], 1, 3);
add_action('cmplz_store_consent', [__CLASS__, 'record'], 999, 3);
// Закрытые записи, не публичный раздел сайта:
register_post_type('pb_cookie_event', [
'public' => false,
'show_ui' => false,
'show_in_rest' => false,
'rewrite' => false,
'query_var' => false,
'supports' => []
]); Этот фрагмент поясняет архитектуру и не запускается отдельно: __CLASS__ относится к классу полного модуля. Не вставляйте все фрагменты статьи подряд — часть из них демонстрирует отдельные места того же кода. Для воспроизведения используйте единый исходник и инструкцию из архива.
Частые вопросы
Можно ли посмотреть рабочий пример?
Да: https://profbuh.pro/. Откройте сайт в новом приватном окне или воспользуйтесь «Настройками cookie» в подвале. Сайт работает и может обновляться после публикации этого кейса. Административные журналы доступны только владельцу.
Крестик означает согласие?
Нет. В выбранной модели закрытие не создаёт нового разрешения на аналитику. Если человек уже согласился раньше, простое закрытие повторно открытых настроек не отменяет прежнее решение.
Почему аналитика в первый раз выключена?
Чтобы сохранение настроек без изменения переключателя не стало неожиданным разрешением. Отдельная кнопка «Принять» позволяет явно включить аналитику. После ранее сохранённого согласия настройки показывают уже разрешённое состояние.
Согласие на cookie заменяет чекбокс формы?
Нет. Заявка с именем и телефоном, рассылка, реклама и аналитика могут иметь разные цели и основания. Настройте формы отдельно и не объявляйте одно согласие разрешением на любую обработку.
cmplz_id и ClientID Метрики — одно и то же?
Нет. Первый используется для записей согласия Complianz, второй — в аналитической системе. В нашем дополнительном журнале ClientID не сохраняется. Связь с ФИО также автоматически не создаётся.
Будет ли сайт соответствовать закону после копирования кода?
Код реализует часть выбранной технической модели. Он не проверяет все основания обработки, документы, инфраструктуру, договоры, локализацию и организационные меры. Эти вопросы остаются у оператора. Проверять нужно и текст, и сетевое поведение сайта, и реальные процедуры работы с обращениями.
Документация и источники
- 152-ФЗ: https://www.consultant.ru/document/cons_doc_LAW_61801/.
- Согласие, статья 9: текст статьи 9.
- 420-ФЗ от 30.11.2024: https://www.consultant.ru/document/cons_doc_LAW_491932/.
- Complianz, категории, cookie и API: официальная документация интеграций.
- Метрика, исключение элементов: разметка HTML.
- Вебвизор: настройки записи и скрытия содержимого.
- Measurement Protocol: формат загрузки данных.
- WordPress cron: https://developer.wordpress.org/plugins/cron/.
- Оптимизация иллюстраций: наше руководство по изображениям и WebP.
Материал подготовлен на основе реальной настройки profbuh.pro. Сначала добейтесь одного проверяемого сценария: чистый вход без аналитики → явное разрешение → работа счётчика → отзыв без новых отправок → отдельная запись истории. Затем проверяйте остальные страницы, устройства и сервисы тем же способом.

