chekazoid/legal-entity-marks
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
=== Legal Entity Marks === Contributors: chekazoid Author: Алексей Шляпужников Author URI: https://shliapuzhnikov.com Plugin URI: https://github.com/chekazoid/legal-entity-marks Tags: legal, media, foreign agents, extremism, compliance, russia, smi, inoagent Requires at least: 6.1 Tested up to: 6.8 Requires PHP: 7.4 Stable tag: 1.5.0 License: GPL-2.0+ License URI: https://www.gnu.org/licenses/gpl-2.0.html Автоматическая маркировка иноагентов, экстремистских, террористических и нежелательных организаций в публикациях. Поиск и удаление ссылок на сайты запрещённых организаций. == Описание == Legal Entity Marks - плагин для СМИ и информационных сайтов, который помогает соблюдать требования российского законодательства при упоминании организаций и лиц из реестров Минюста, ФСБ и НАК. Плагин работает с четырьмя реестрами: * **Иностранные агенты** (реестр Минюста, ФЗ-255) * **Экстремистские организации** (перечень Минюста) * **Террористические организации** (перечень ФСБ/НАК) * **Нежелательные организации** (перечень Минюста) = Маркировка упоминаний = Плагин находит упоминания лиц и организаций в тексте статей и добавляет сноску к первому упоминанию, а в конце статьи блок юридических дисклеймеров. Оригинальный текст в базе данных **не изменяется**: маркировка происходит на лету через фильтр `the_content`. Отключите плагин, и статьи вернутся к исходному виду. = Как ищутся имена = Фамилии и имена склоняются по правилам русского языка, поэтому находятся «по словам Иванова», «письмо Иванову», «интервью с Ивановым». Работают оба порядка слов: и «Иванов Иван» из реестра, и «Иван Иванов» из текста статьи. Род определяется по отчеству, а если его нет, по окончанию фамилии. Женские фамилии на согласную не склоняются, поэтому «Апахончич» остаётся неизменной во всех падежах. Несклоняемые типы (-ко, -ых, -их, -аго, на гласную) берутся как есть. Отдельная фамилия без имени засчитывается, только если полное имя встречается в той же статье. В прессе так и пишут: первое упоминание полное, дальше по фамилии. Это отсекает однофамильцев, которых в реестрах немало. = Что маркировать, а что нет = Каждую из четырёх категорий можно отключить в настройках. Для иноагентов есть отдельный режим «только в цитатах и ссылках»: обычное упоминание фамилии не маркируется, а маркировка ставится там, где человека цитируют или дают ссылку на его материал. Условия настраиваются: блок цитаты, абзац с гиперссылкой, прямая речь в кавычках, встроенный пост из соцсети. В редакторе статьи есть блок «Маркировка». Пользователь с ролью «Редактор» или выше видит, что нашёл сканер, и может снять ложное срабатывание или, наоборот, промаркировать упоминание вопреки общему правилу. Решение действует только для этой статьи. = Реестр запрещённых сайтов и сканер ссылок = Плагин ведёт реестр доменов экстремистских, террористических и нежелательных организаций и позволяет: * Сканировать все публикации на наличие ссылок на запрещённые домены * Просматривать результаты: какие статьи содержат ссылки, куда и с каким текстом * Удалять запрещённые ссылки поштучно или массово (тег `<a>` заменяется текстом ссылки) В комплект включён начальный реестр из 79 доменов (Meta/Facebook/Instagram, Свидетели Иеговы, NED, Bellingcat, Медуза, ФБК и др.). Реестр пополняется вручную через админку, CLI или импорт из файлов (TXT, CSV, JSON). = Основные возможности = * Склонение фамилий и имён, оба порядка слов, учёт рода * Поддержка алиасов: «Meta Platforms» = Facebook = Instagram = Фейсбук * Выбор реестров и режим «иноагенты только в цитатах» * Ручное управление маркировкой в редакторе статьи * AJAX-сканеры с прогресс-баром в админке (маркировка и ссылки) * WP-CLI команды для всех операций * Автоматическое обновление реестров по расписанию (WP-Cron) * Автоматическое сканирование при публикации поста * Настраиваемые цвета блока дисклеймеров * Совместимость с популярными кеш-плагинами * Начальные данные: 2300+ сущностей и 79 запрещённых доменов (реестры обновлены в июле 2026) = Требования = * WordPress 6.1+ * PHP 7.4+ (рекомендуется 8.0+) * Расширение mbstring для PHP == Установка == 1. Загрузите папку `legal-entity-marks` в `/wp-content/plugins/` 2. Активируйте плагин через меню «Плагины» 3. При активации автоматически создаются таблицы и импортируются начальные данные 4. Перейдите в Маркировка → Сканер и запустите полное сканирование 5. Перейдите в Маркировка → Ссылки для проверки ссылок на запрещённые сайты Или через WP-CLI: wp plugin activate legal-entity-marks wp lem scan --all --batch=500 wp lem banned-links-scan --batch=500 == Часто задаваемые вопросы == = Изменяет ли плагин текст статей в базе данных? = Маркировка упоминаний - нет, она работает на лету через фильтр `the_content`. Удаление запрещённых ссылок - да, при явном запуске пользователем из админки или CLI. = Можно ли отключить отдельные категории? = Да. В настройках четыре флажка: иностранные агенты, экстремистские, террористические и нежелательные организации. Выключенная категория не маркируется и не попадает в блок дисклеймеров. Пересканирование не требуется. = Можно ли маркировать иноагентов только в цитатах и ссылках? = Да, для этого есть отдельный режим в настройках. Когда он включён, обычное упоминание фамилии в тексте не маркируется, а маркировка ставится там, где человека цитируют или дают ссылку на его материал. Остальных трёх реестров правило не касается. Что считать поводом для маркировки, настраивается: блок цитаты (вместе с подводкой и подписью в соседних абзацах), абзац с гиперссылкой, абзац с прямой речью в кавычках, встроенный пост из соцсети. После изменения этих условий нужно пересканировать статьи: признак вычисляется во время сканирования. = Что делать с ложным срабатыванием? = В редакторе статьи есть блок «Маркировка». Пользователь с ролью «Редактор» или выше видит там всё, что нашёл сканер, и может снять маркировку в конкретной статье. В обратную сторону тоже работает: если правило контекста отсекло упоминание, которое по мнению редакции надо пометить, его можно вернуть галочкой «промаркировать всё равно». Решение действует только для этой статьи. = Находит ли плагин имена в косвенных падежах? = Да. Фамилии и имена склоняются по правилам русского языка, поэтому находятся «по словам Иванова», «письмо Иванову», «интервью с Ивановым». Работают оба порядка слов: и «Иванов Иван» из реестра, и «Иван Иванов» из текста статьи. Род определяется по отчеству, а при его отсутствии по окончанию фамилии. Это важно для женских фамилий на согласную: «Апахончич Дарья» остаётся неизменной во всех падежах, и «Апахончича» под маркировку не попадёт. Несклоняемые типы (-ко, -ых, -их, -аго, на гласную) отдаются как есть. Склонение можно отключить в настройках. = Что с однофамильцами? = Отдельная фамилия без имени по умолчанию засчитывается, только если полное имя встречается где-то в той же статье. В прессе так и пишут: первое упоминание полное, дальше по фамилии. «Лев Пономарев заявил… Пономарев добавил…» будет размечено, а заметка про постороннего чиновника Пономарева нет. Режим переключается в настройках. Вариант «искать всегда» ловит больше, но даёт ложные срабатывания: 13 из 24 самых частых русских фамилий есть в реестре иноагентов, а мужской родительный падеж совпадает с женским именительным («Смирнова» это и Смирнов в родительном, и Смирнова в именительном). На проверочном наборе из восьми заметок про посторонних людей режим «всегда» дал 19 ложных срабатываний, режим по умолчанию ни одного. Ложные срабатывания в конкретной статье снимаются в блоке «Маркировка». = Как часто обновляются реестры? = По умолчанию - еженедельно через WP-Cron. Интервал настраивается: ежедневно, еженедельно, ежемесячно. Также можно обновить вручную из раздела «Обзор». = Как пополнять реестр запрещённых сайтов? = Тремя способами: 1. Вручную через админку (Маркировка → Ссылки → Добавить домен) 2. Массовый импорт через textarea в админке (формат: домен | название) 3. Через WP-CLI: `wp lem banned-sites-add --domain=example.org` или `--file=domains.csv` Поддерживаемые форматы файлов: TXT (домен | название), CSV (колонки domain/label, разделитель , или ;), JSON ([{domain, label}]). = Совместим ли плагин с кеш-плагинами? = Да. Встроенная поддержка: WP Super Cache, W3 Total Cache, WP Rocket, LiteSpeed Cache, WP Fastest Cache. Для nginx FastCGI и других решений есть хук `lem_purge_post_cache` (передаёт `$post_id` и `$url`). == WP-CLI команды == = Реестры и сканирование = wp lem import --all # Импорт из встроенных JSON-файлов wp lem fetch --source=all # Загрузка реестров из онлайн-источников wp lem scan --all --batch=500 # Сканирование всех статей wp lem scan --post_id=123 # Сканирование одной статьи wp lem scan --recent=7 # Статьи за последние 7 дней wp lem status # Статистика wp lem list --type=inoagent # Список сущностей wp lem purge-cache # Очистка кеша = Запрещённые сайты и ссылки = wp lem banned-sites # Список запрещённых доменов wp lem banned-sites-add --domain=example.org # Добавить домен wp lem banned-sites-add --file=domains.txt # Импорт из TXT wp lem banned-sites-add --file=domains.csv # Импорт из CSV wp lem banned-sites-add --json-file=data.json # Импорт из JSON wp lem banned-links-scan --batch=500 # Сканировать ссылки wp lem banned-links-scan --post_id=123 # Сканировать одну статью wp lem banned-links-clean --dry-run # Пробный запуск удаления wp lem banned-links-clean --batch=100 # Удалить запрещённые ссылки == Структура меню == * **Маркировка → Обзор** - статистика, быстрые действия * **Маркировка → Реестр** - просмотр и редактирование сущностей * **Маркировка → Сканер** - AJAX-сканирование статей на упоминания * **Маркировка → Ссылки** - реестр доменов, сканер ссылок, удаление * **Маркировка → Настройки** - типы записей, стили, расписание == Changelog == = 1.5.0 = * Склонение фамилий и имён: находятся «по словам Иванова», «с Ивановым», «письмо Иванову», а также порядок слов «Иван Иванов» * Род учитывается по отчеству: женские фамилии на согласную не склоняются * Отдельная фамилия без имени засчитывается, только если полное имя есть в той же статье - отсекает однофамильцев (режим переключается) * Выбор реестров: каждую из четырёх категорий можно отключить в настройках * Режим «иноагенты только в цитатах»: голое упоминание фамилии не маркируется, маркировка ставится там, где человека цитируют или дают ссылку * Настраиваемые условия контекста: блок цитаты, гиперссылка, прямая речь в кавычках, встроенный пост из соцсети * Блок «Маркировка» в редакторе статьи: редактор и выше может снять ложное срабатывание или промаркировать упоминание вручную * Исправлено: настройка `registries` объявлялась, но нигде не применялась * Дисклеймеры экстремистских и террористических организаций переформулированы без тире: WordPress автоматически превращал дефис в среднее тире * Описание в readme приведено в соответствие с возможностями плагина = 1.4.0 = * Исправлен импорт встроенного реестра иноагентов при активации (использовался парсер другого формата, записи пропускались) * Обновлены встроенные данные всех реестров (июль 2026) * Очистка кеша nginx FastCGI вынесена в хук `lem_purge_post_cache` * Удалена миграция с устаревшего mu-plugin * Минимальная версия WordPress поднята до 6.1 (используются wp_cache_flush_runtime и полифилы PHP 8) = 1.3.0 = * Сканер: поиск совпадений в заголовке поста (post_title), а не только в контенте * Сканер: встроенный блеклист общеупотребительных слов для предотвращения false positives * Фронтенд: поиск совпадений для inline-маркировки по всем алиасам сущности (не только matched_as) * Обновлены встроенные данные реестров с алиасами (словоформы, короткие названия из кавычек) * Свидетели Иеговы: единый алиас на организацию-зонтик (407 местных орг. без отдельных алиасов) * Удалены дубликаты сущностей = 1.2.0 = * Иноагенты: переход на REST API reestrs.minjust.gov.ru (GitHub fz255 не обновляется с октября 2024) * Исправлен парсер экстремистских организаций (Минюст сменил HTML-структуру на div.doc) * Исправлен парсер террористических организаций (выбиралась колонка номера вместо названия) * Нежелательные организации: переход на REST API reestrs.minjust.gov.ru (старый URL 404) * Интеграция с FastCGI-кешем nginx * Обновлены встроенные данные реестров = 1.1.0 = * Реестр запрещённых сайтов: таблица `wp_lem_banned_sites`, CRUD-операции * Сканер ссылок: поиск `<a href>` на запрещённые домены во всех публикациях * Удаление запрещённых ссылок: поштучно и массово, с прогресс-баром * Начальный реестр: 79 доменов экстремистских и нежелательных организаций * Админ-страница «Ссылки»: реестр доменов, сканер, результаты, удаление * Импорт доменов: TXT, CSV (авто-определение разделителя), JSON * 4 новые WP-CLI команды: banned-sites, banned-sites-add, banned-links-scan, banned-links-clean * Статистика запрещённых ссылок на Dashboard * Поддержка поддоменов при проверке (sub.example.org совпадает с example.org) = 1.0.0 = * Первый релиз * Поддержка 4 реестров: иноагенты, экстремисты, террористы, нежелательные * AJAX-сканер с прогресс-баром * WP-CLI команды: import, fetch, scan, status, list, purge-cache * WP-Cron: автоматическое обновление реестров * Автосканирование при публикации * Админ-интерфейс: Обзор, Реестр, Сканер, Настройки