Skip to content

chekazoid/legal-entity-marks

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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: автоматическое обновление реестров
* Автосканирование при публикации
* Админ-интерфейс: Обзор, Реестр, Сканер, Настройки

About

WordPress-плагин для СМИ: маркировка иноагентов/экстремистских/террористических/нежелательных организаций на лету + реестр запрещённых доменов и сканер ссылок

Resources

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors