Snigirev Cookie Consent

Description

Most “cookie consent” plugins are just an informational banner: it shows
up, the visitor clicks something, the banner disappears — and every
tracking script on the page was already running before that click ever
happened. That doesn’t satisfy 152-FZ or GDPR, and it wouldn’t hold up
if a regulator ever asked “prove the user actually consented before
tracking started.”

Snigirev Cookie Consent gates the scripts themselves, not just the
banner. Any script you add through the plugin (Yandex Metrika, Google
Analytics/GTM, ad pixels, anything) is written to the page as an inert
— the browser physically will not execute
it. Only after the visitor makes an actual choice (Accept, or ticks the
matching category and saves) does the banner’s own JavaScript rewrite
that tag into a real <script> and let it run. Reload the page after
that, and the plugin reads the stored choice from a cookie and
re-activates only the categories the visitor actually agreed to —
without showing the banner again. Nothing loads by default except
strictly necessary functionality.

Two ways to run it

  • Full mode — three categories (necessary/analytics/marketing), a
    “Customize” button with a detailed per-category breakdown, and a
    “Save choices” button. Analytics/marketing only appear as separate
    toggles once you’ve actually added a script for that category in the
    admin — an empty, non-functional toggle never shows up.
  • Simple mode — one switch in the settings turns the whole thing
    into a plain Accept/Reject notice: no category panel, no “Customize”
    button. Every non-independent script activates together on Accept.
    Good fit for sites that don’t need (or don’t want to manage) a
    category breakdown.

Design, without touching a line of CSS

  • Position: top or bottom bar (full width), centered modal, or a corner
    card (left/right)
  • Colors, border radius, shadow, padding, max width — all from the
    settings screen; any color field also accepts transparent (e.g. to
    drop the banner’s background strip entirely and show only the
    floating container)
  • Configurable delay before the banner appears, with a smooth fade-in
  • A live preview of the banner sits right on the settings screen and
    updates instantly as you change style or text — no saving, no
    reloading, no guessing what it’ll look like on the actual site

Editing the banner text

  • Banner texts (title, description, category labels/descriptions,
    button labels) are one flat set of settings-screen fields, in Russian
  • The description field (and other long-text fields) uses WordPress’s
    own visual editor in a stripped-down form — Bold, Italic, and an
    actual “Insert/edit link” button, instead of hand-typing HTML. That’s
    also where you link to your privacy policy: there’s no separate
    privacy-link field to fill in, just link the words directly in the
    description text

Managing tracking scripts

  • A repeater in the admin: name, the script’s own code (HTML/JS),
    category, and a “load immediately, without consent” flag for the rare
    case where a tracker (typically an analytics counter) genuinely needs
    to start before any interaction — that one bypasses the gate entirely
    and is clearly called out as doing so
  • The code field has real syntax highlighting (the same CodeMirror-based
    editor WordPress uses for Additional CSS and the theme/plugin file
    editor), not a bare textarea
  • Saving the script’s code requires the unfiltered_html capability —
    on classic multisite that’s normally only the network super admin;
    everyone else sees the field locked, and the server refuses a
    modified value even from a direct POST request, not just visually

Everything else

  • [snigirev_cookie_settings] shortcode — drop it anywhere (footer,
    privacy policy page) as a button to reopen the banner so a visitor can
    change their mind later
  • No server-side storage at all — the consent decision lives only in a
    cookie on the visitor’s own browser; the plugin doesn’t collect or
    keep any personal data
  • Free, and stays that way — nothing here is a trial or a paywalled
    tier. If it saved you some time, there’s a link to say thanks with a
    coffee, entirely optional and unrelated to how the plugin works

Установка

  1. Распакуйте архив и загрузите папку snigirev-cookie-consent в
    /wp-content/plugins/ (или используйте Плагины Добавить новый
    Загрузить плагин на самом архиве)
  2. Активируйте плагин через меню «Плагины»
  3. Настройки Cookie Consent — настройте стиль баннера, тексты
    категорий (ссылку на политику конфиденциальности впишите прямо в
    текст описания через <a href="...">) и добавьте скрипты метрики
  4. При необходимости разместите шорткод [snigirev_cookie_settings]
    на странице политики конфиденциальности, чтобы пользователь мог
    изменить своё решение

Структура файлов

snigirev-cookie-consent/
├── snigirev-cookie-consent.php заголовок плагина, автозагрузчик, точка входа
├── includes/
│ ├── Core.php singleton-фасад, регистрация хуков
│ ├── Settings.php схема опции, defaults, sanitize
│ ├── Shortcode.php [snigirev_cookie_settings]
│ ├── Admin/SettingsPage.php страница настроек (Settings API)
│ └── Frontend/
│ ├── Banner.php рендер баннера + гейтящихся скриптов (wp_footer)
│ └── Scripts.php независимые скрипты (wp_head)
├── assets/
│ ├── admin.css / admin.js вкладки настроек, репитер скриптов
│ └── banner.css / banner.js стили и логика согласия на фронтенде
├── uninstall.php
└── readme.txt

Безопасность

  • Страница настроек требует manage_options
  • Поле кода скрипта в репитере сохраняется только при наличии права
    unfiltered_html у текущего пользователя — без этого права поле
    недоступно для редактирования в форме (readonly/disabled), и сервер
    не принимает изменения кода даже при прямом POST-запросе
  • Нонсы и проверка option_page — через стандартный механизм
    settings_fields()/options.php
  • Все обычные поля настроек проходят через sanitize_callback
    (sanitize_hex_color, sanitize_text_field, absint, esc_url_raw
    и т. п.); текстовые поля баннера — через wp_kses() с узким allowlist
    тегов (a/strong/em), а не произвольный HTML
  • Согласие хранится только в cookie на стороне клиента — плагин не
    собирает и не хранит персональные данные на сервере

Соответствие 152-ФЗ

  • Баннер прямо называет используемые сервисы аналитики/маркетинга по
    названию, заданному в репитере скриптов
  • Ссылка на политику конфиденциальности добавляется админом прямо в
    текст описания баннера (поддерживается тег <a>)
  • По умолчанию не активируется ничего, кроме необходимых cookie, до
    явного действия пользователя

Известные ограничения

  • Если пользователь дал согласие на категорию, скрипт этой категории
    успел выполниться в текущей загрузке страницы, а затем пользователь
    через шорткод [snigirev_cookie_settings] отозвал согласие на эту же
    категорию — уже выполнившийся код (например уже инициализированный
    счётчик метрики) технически не может быть «отменён» на лету, это
    ограничение самого приёма гейтинга через type="text/plain". Новое
    решение сохраняется в cookie и будет учтено при следующей загрузке
    страницы.

Поддержать разработку

Плагин бесплатный и таким останется — донат ни на что не влияет и не
открывает скрытых функций. Если плагин сэкономил вам время, можно
угостить разработчика кофе: https://aiseobooster.aeropic.ru/coffee.php

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Snigirev Cookie Consent” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

1.3.4

  • Из архива для WordPress.org убран phpcs.xml.dist (конфиг dev-инструмента
    PHPCS) — каталог не пропускает файлы такого рода в загружаемом ZIP
    (“Application files are not permitted”). Файл остаётся в git-репозитории
    для локальной разработки, просто не попадает в релизный архив

1.3.3

  • “Tested up to” поднят до 7.1 — активация и рендер страницы настроек
    проверены вживую на WordPress 7.1, ошибок и предупреждений плагин
    не добавляет

1.3.2

  • Contributors в readme исправлен на реальный зарегистрированный
    WordPress.org аккаунт (mkrabs) — старое значение было плейсхолдером
    и не совпадало с аккаунтом, из-под которого подан плагин
  • Инлайновые <script>/<style> для превью редактора текста и
    CSS-переменных стиля баннера заменены на wp_add_inline_script()/
    wp_add_inline_style(), привязанные к уже зарегистрированным хендлам
    (scc-admin, scc-banner) — без изменений в поведении
  • Префикс глобальных PHP-констант SCC_ (3 символа) заменён на
    SCCO_ (4 символа) — минимальная длина префикса по требованиям
    каталога WordPress.org. Внутренние константы, нигде не хранятся в
    БД — без изменений в поведении

1.3.1

  • Убраны лишние комментарии в коде (докблоки на каждый метод, длинные
    пояснения-«почему», пересказ кода) — оставлены только там, где без них
    можно случайно сломать неочевидное поведение. Без функциональных
    изменений.

1.3.0

  • Исправлено: селект «Категория» в репитере скриптов (вкладка «Скрипты»)
    показывал захардкоженные «Аналитика»/«Маркетинг» вместо реальных
    названий категорий с вкладки «Тексты и категории» — если категорию
    переименовать, баннер на сайте и селект в админке расходились в
    названии. Теперь селект берёт текст напрямую из настроенных названий
    категорий (с фолбэком на «Аналитика»/«Маркетинг», если поле названия
    пустое)

1.2.9

  • Author URI в шапке плагина — имя автора в списке плагинов теперь
    кликабельная ссылка; Contributors в readme сведён к одному аккаунту

1.2.8

  • Исправлен баг: редактор кода (CodeMirror) на вкладке «Скрипты» был
    пустым и с наехавшей нумерацией строк, пока по нему не кликнешь —
    редакторы, изначально скрытые в неактивной вкладке, теперь
    пересчитывают раскладку при переключении на вкладку «Скрипты»

1.2.7

  • Убран неиспользуемый атрибут data-consent-name у гейтящихся скриптов
    (нигде не читался — ни фронтенд-JS, ни CSS) и неиспользуемая константа
    Settings::CATEGORIES — мёртвый код по итогам аудита

1.2.6

  • Убрана функция вкладок RU/EN в настройках текстов баннера (появилась в
    1.1.0) и автоопределение языка сайта для выбора текста — остаётся один
    набор текстов баннера на русском, без переключения по языку

1.2.5

  • Ненавязчивое уведомление про донат на странице настроек плагина
    (только там, не на других экранах админки) со ссылкой на
    https://aiseobooster.aeropic.ru/coffee.php — скрывается по кнопке «Не
    сейчас» до конца текущего визита и появляется снова при следующем
    открытии страницы настроек; плагин остаётся полностью бесплатным без
    каких-либо ограничений
  • На экране «Плагины» рядом со стандартными ссылками плагина добавлены
    «Донат» и «Страница на WordPress.org»

1.2.4

  • Поле «Текст ссылки повторного открытия» в настройках теперь прямо
    подписано названием шорткода — [snigirev_cookie_settings] — чтобы
    не искать его в readme
  • Убран неработающий чекбокс «Плавающая кнопка cookie» — он ничего не
    включал (кнопка нигде не рендерилась); отзыв согласия по-прежнему
    доступен только через шорткод

1.2.3

  • Поле «Код скрипта» в репитере скриптов теперь с подсветкой синтаксиса
    (тот же CodeMirror, что в «Дополнительный CSS» и редакторе тем) —
    проще читать и редактировать HTML/JS-код счётчиков

1.2.2

  • Фон полосы (section) по умолчанию теперь transparent вместо тёмного
    цвета — для новых установок баннер сразу выглядит как плавающая
    карточка без цветной подложки. На уже активированных сайтах старое
    сохранённое значение не трогается — впишите transparent в поле
    вручную и сохраните, если хотите убрать полосу

1.2.1

  • Поле «Описание» (и остальные текстовые поля с поддержкой HTML —
    описания категорий) теперь используют стандартный визуальный
    редактор WordPress в упрощённом виде (жирный, курсив, вставка ссылки)
    вместо обычного textarea — вставлять ссылку на политику
    конфиденциальности стало удобнее, кнопкой, а не вручную HTML-тегом

1.2.0

  • Цветовые поля стиля принимают transparent (не только #rrggbb) —
    например, чтобы убрать полосу-подложку и оставить только контейнер
  • Убрана отдельная вкладка/поле «Политика конфиденциальности» — ссылка
    добавляется вручную прямо в тексте описания баннера (там уже
    поддерживается <a>), одним полем меньше
  • Категории «Аналитика»/«Маркетинг» в баннере теперь появляются только
    когда в репитере скриптов реально есть хотя бы один скрипт этой
    категории — до этого момента баннер показывает только
    Принять/Отклонить, без пустых неработающих тумблеров
  • Добавлен переключатель «Простой режим» — полностью убирает панель
    категорий и кнопку «Настроить», оставляя только Принять/Отклонить;
    все скрипты (кроме «грузить сразу») активируются одним действием
  • Подсказка про поддержку HTML в текстах баннера показывается один раз
    на вкладке, а не под каждым полем
  • Чекбокс «Независимый» в репитере скриптов переименован в «Грузить
    сразу, без согласия» — то же самое поведение (для метрики, которая
    должна стартовать рано), просто понятнее назван

1.1.0

  • Позиции баннера: по центру экрана, в углу слева/справа (в дополнение к
    сверху/снизу)
  • Плавное появление баннера с настраиваемой задержкой (мс)
  • Live-превью баннера прямо на странице настроек
  • Тексты баннера на русском и английском — показывается автоматически
    по языку сайта
  • Ссылка на политику конфиденциальности — выбор существующей страницы
    сайта из выпадающего списка (со fallback на ручной ввод URL)

1.0.0

  • Первый релиз: баннер согласия с тремя категориями, гейтинг скриптов,
    настраиваемый стиль, репитер скриптов, шорткод повторного открытия.