=== Snigirev AI Meta & Alt ===
Contributors: WPORG_USERNAME_ЗАГЛУШКА
Tags: seo, alt text, image seo, ai, schema
Requires at least: 5.8
Tested up to: 6.5
Requires PHP: 7.4
Stable tag: 1.6.6
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

SEO-плагин с ИИ-генерацией: ALT/Title/Caption/Description для изображений, SEO title/description для постов и страниц, schema.org, XML-карта сайта, robots.txt, Open Graph и менеджер редиректов.

== Description ==

SEO-плагин с ИИ-генерацией контента: ALT/Title/Caption/Description для
изображений медиабиблиотеки, SEO title/description для постов и страниц,
базовая schema.org разметка (JSON-LD, Article/WebPage), XML-карта сайта и
robots.txt.

= Функционал =

* Медиабиблиотека: сканирование изображений без ALT (глобальный режим) и
  просмотр изображений конкретной страницы/записи (режим "по странице"),
  редактирование ALT/Title/Caption/Description, точечная и массовая
  генерация ALT/Description через ИИ, единый пайплайн «Обработать всё».
  Генерация поддерживает PNG/JPEG/GIF/WebP — для AVIF (и других
  неподдерживаемых форматов) плагин сразу показывает понятную ошибку
  вместо попытки отправить его ИИ-провайдеру
* Мета-теги: метабокс на экране редактирования поста с полями SEO
  title/description, ИИ-генерация по кнопке, вывод тегов на фронтенде
  (`<title>`, `<meta name="description">`)
* Шаблоны по умолчанию ("Smart Tags", по образцу AIOSEO): если у поста не
  задан свой SEO Title/Description, используется общий шаблон из настроек с
  плейсхолдерами `#post_title`, `#site_title`, `#tagline`, `#separator`,
  `#current_year`, `#current_date` — метабокс поста показывает, что реально
  подставится, ещё до сохранения. В настройках теги вставляются кликом по
  кнопке, под полем сразу виден пример результата с реальными значениями
  сайта
* Schema.org: JSON-LD разметка Article (посты) / WebPage (страницы) в
  `wp_head`, использует значения из мета-модуля
* Настраиваемый провайдер ИИ: OpenAI / OpenRouter / Hubris / Custom (свой
  OpenAI-совместимый эндпоинт), опциональный прокси
* XML-карта сайта на `/sitemap.xml` — все публичные посты/страницы,
  генерируется динамически при запросе (без записи файла на диск),
  включается/выключается в настройках
* robots.txt: дополнительные правила из настроек добавляются к стандартному
  virtual robots.txt WordPress, плюс автоматическая строка `Sitemap:` со
  ссылкой на карту сайта (если она включена)
* Open Graph (`og:title`, `og:description`, `og:image`, `og:url`,
  `og:site_name`, `og:locale`) в `wp_head` — единый стандарт, который
  парсят ВКонтакте, Одноклассники, Telegram и MAX для превью ссылок,
  никаких платформо-специфичных тегов не требуется. Использует те же
  значения, что и SEO title/description (пункт про Meta/Smart Tags выше)
* Редиректы 301/302: правило "источник (путь, можно с `*` для префикса) →
  назначение (полный URL)", список с включением/выключением и удалением
  прямо в админке (Snigirev AI Meta & Alt → Редиректы), проверяется на каждом
  запросе до вывода страницы
* Импорт из Snigirev Meta & Alt: если на сайте ранее стояла бесплатная
  Lite-версия и в ней заполнялись SEO-поля/редиректы — полная версия
  обнаруживает эти данные (даже если Lite уже деактивирована/удалена) и
  предлагает разовый импорт (уведомление в админке + кнопка в Настройках).
  Редиректы добавляются без дублей (merge по source), SEO-поля постов и
  настройки media/meta/tools копируются только туда, где в полной версии
  ещё ничего не настроено вручную — ничего уже заданное не перезаписывается,
  повторный запуск безопасен

= Лицензирование =

Без активного лицензионного ключа доступен весь функционал, КРОМЕ
ИИ-генерации (кнопки «Сгенерировать» для ALT/описания изображений и
Title/Description постов) — она требует активной лицензии. Остальное
(sitemap, robots.txt, редиректы, ручные мета-теги, schema.org, Open Graph)
работает всегда, без ограничений. Проверка ключа идёт на отдельный сервер
разработчика (`license.aeropic.ru`) — по кнопке в настройках и, при
отдельно включённом согласии, автоматически раз в сутки по WP-Cron (см.
раздел External Services ниже).

== External Services ==

Этот плагин обращается к двум внешним сервисам:

**1) ИИ-провайдер (OpenAI-совместимый Chat Completions API)**

Плагин отправляет запрос на `{Base URL}/chat/completions` того провайдера,
которого сам администратор указал в настройках: OpenAI (`api.openai.com`),
OpenRouter (`openrouter.ai`), Hubris (`api.hubris.pw`) либо произвольный
кастомный OpenAI-совместимый эндпоинт. Отправляется текстовый
промпт-инструкция (контекст — название
поста/страницы) и, для генерации ALT/описаний изображений, также публичная
ссылка на изображение из медиабиблиотеки WordPress (`image_url`).
API-ключ вводит сам администратор в настройках — плагин не хранит и не
проксирует собственный ключ разработчика. Запрос отправляется ТОЛЬКО по
явному клику на кнопку «Сгенерировать» (точечно или в рамках bulk-очереди,
которую администратор сам запускает) — никогда автоматически или в фоне.

Ссылки на условия использования и политику конфиденциальности зависят от
выбранного администратором провайдера: OpenAI —
https://openai.com/policies/, OpenRouter — https://openrouter.ai/privacy,
Hubris — https://hubris.pw/legal/privacy.
При выборе кастомного эндпоинта ответственность за условия использования
и обработку данных выбранного сервиса несёт администратор сайта,
самостоятельно указавший этот эндпоинт.

**2) license.aeropic.ru (сервер лицензий разработчика)**

Собственный сервер разработчика плагина (не сторонний сервис), используется
исключительно для проверки статуса лицензионного ключа. Отправляется:
лицензионный ключ (который администратор сам ввёл в настройках) и домен
сайта. Больше никакие данные не передаются. Запрос происходит: (а) по
клику на кнопку «Проверить лицензию» в настройках; (б) автоматически раз
в сутки через WP-Cron — но только если администратор явно включил чекбокс
«Разрешить автоматическую ежедневную проверку статуса лицензии в фоне» в
настройках (по умолчанию выключено для новых установок; без этого согласия
проверка происходит только вручную по кнопке).

Политика конфиденциальности: https://aiseobooster.aeropic.ru/privacy.php

== Installation ==

1. Распакуйте архив и загрузите папку `snigirev-ai-meta-alt` в
   `/wp-content/plugins/` (или используйте Плагины → Добавить новый →
   Загрузить плагин на самом архиве)
2. Активируйте плагин через меню «Плагины»
3. Snigirev AI Meta & Alt → Настройки — укажите провайдера ИИ и API-ключ,
   при желании введите лицензионный ключ
4. Snigirev AI Meta & Alt (пункт меню) — сканирование и редактирование
   SEO-полей изображений
5. На экране редактирования любого поста/страницы — метабокс
   «Snigirev AI Meta & Alt — мета-теги» для SEO title/description

== Frequently Asked Questions ==

= Нужна ли лицензия? =

Нет, для базового функционала (SEO title/description, schema.org, XML-карта
сайта, robots.txt, Open Graph, редиректы, ручное редактирование ALT/Title/
Caption/Description изображений) лицензия не требуется — всё доступно
бесплатно. Лицензионный ключ нужен только для ИИ-генерации (кнопки
«Сгенерировать» для ALT/описаний изображений и SEO Title/Description
постов).

= На сколько сайтов действует лицензия? =

3 сайта (домена) на любой тариф.

= Плагин куда-то отправляет данные моего сайта? =

Да, при использовании функций ИИ-генерации и/или проверки лицензии — см.
раздел External Services выше, там подробно описано, что именно, куда и
при каких действиях администратора отправляется.

= Как связаться с поддержкой? =

Автор: Снигирёв Павел Викторович.
Email: A-FONIKI@yandex.ru.
Телефон: +7 903 200-82-22.

== Changelog ==

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

= 1.6.5 =
* Исправлено обновление плагина, падавшее с ошибкой «Загрузка не удалась.
  Forbidden»: если попытка получить свежую (10-минутную) ссылку на
  скачивание у license.aeropic.ru прямо перед закачкой не удавалась,
  код молча откатывался на старую ссылку из 12-часового кэша — её токен
  к этому моменту почти всегда уже просрочен, отсюда 403. Теперь в этом
  случае показывается понятная ошибка вместо обречённой попытки.
* Добавлена поддержка окна «Просмотр деталей версии» на экранах
  «Плагины»/«Обновления» (фильтр `plugins_api`) — раньше WordPress по
  умолчанию пытался запросить эти данные у wordpress.org, где плагина
  нет, и ссылка «Подробности» вела в никуда.

= 1.6.4 =
* На экране «Обновления» WordPress теперь показывается иконка плагина —
  `/api/update-check` license.aeropic.ru отдаёт её URL вместе с ответом об
  обновлении (`UpdateChecker` передаёт его в стандартное поле `icons`
  транзиента). На экран «Плагины» это не влияет — WordPress там не
  показывает иконки ни у одного плагина, ни с WordPress.org, ни без.

= 1.6.3 =
* Добавлены заголовки Plugin URI и Author URI — теперь на экране «Плагины»
  у Snigirev AI Meta & Alt есть стандартные ссылки «Перейти на страницу
  плагина» и на автора (тот же формат уже был в бесплатной версии).

= 1.6.2 =
* `assets/admin.js` теперь ждёт `DOMContentLoaded`, если скрипт выполнился
  раньше, чем DOM успел распарситься (найдено живьём на сайте, где тема
  переносит/асинхронизирует подключаемые скрипты) — раньше в этом случае
  все кнопки на экране настроек молча не получали обработчик клика.

= 1.6.1 =
* Исправлен баг, из-за которого `assets/admin.js`/`admin.css` не
  подключались на экранах «Настройки» и «Редиректы» — код сравнивал
  hook screen'а с захардкоженной строкой `ai-seo-booster_page_...`, а
  WordPress реально формирует hook из `sanitize_title()` заголовка
  меню («Snigirev AI Meta &amp; Alt» → `snigirev-ai-meta-amp-alt`), не
  из slug. Из-за этого не работали: кнопка «Проверить лицензию»,
  live-превью тегов в шаблонах, и новые кнопки «Загрузить список
  моделей»/«Проверить подключение» из 1.6.0. Теперь оба класса берут
  hook_suffix из фактического возврата `add_submenu_page()`.

= 1.6.0 =
* Новая кнопка «Загрузить список моделей» в настройках ИИ — запрашивает
  `GET {Base URL}/models` у провайдера и показывает результат как
  выпадающий список (datalist) и кликабельный список под полем Model.
* Новая кнопка «Проверить подключение» рядом с полем Proxy — отправляет
  пробный запрос ИИ-провайдеру с текущими (не обязательно сохранёнными)
  значениями Base URL/Model/API Key/Proxy, ничего не сохраняет.
* Обе кнопки валидируют то, что реально сейчас в полях формы, не
  требуя сначала сохранить настройки.

= 1.5.11 =
* Промпт ИИ-генерации Title для изображений переписан: строго 2–3 слова
  вместо 3–7, требование именной группы (а не предложения/описания) с
  примерами стиля, явный запрет вступительных фраз перед названием.

= 1.5.10 =
* Раскрыто описание настройки «Источник Title» в настройках — уточнено,
  что речь о названии самого изображения (не о SEO Title страницы), и
  что произойдёт в каждом варианте источника.

= 1.5.9 =
* Исправлена кнопка генерации Title для изображений, не прикреплённых
  ни к одной записи (частый случай в общем списке «без ALT») — раньше
  тихо записывала пустое значение при источнике «заголовок записи».

= 1.5.8 =
* Фоновая проверка лицензии (при включённом согласии в настройках)
  теперь раз в неделю вместо раза в день — меньше нагрузки на
  license.aeropic.ru.

= 1.5.7 =
* Добавлен Hubris (api.hubris.pw) как готовый пресет ИИ-провайдера — рядом
  с OpenAI и OpenRouter, для оплаты в рублях без зарубежной карты.

= 1.5.6 =
* Ребрендинг: «AI SEO Booster» → «Snigirev AI Meta & Alt» (название продукта
  и text domain, функционал не изменился).

= 1.5.5 =
* Добавлено явное согласие (чекбокс в настройках, по умолчанию выключен)
  на автоматическую ежедневную фоновую проверку лицензии через WP-Cron —
  без согласия проверка выполняется только вручную по кнопке.
* readme.txt приведён в формат WordPress.org, добавлен раздел External
  Services.

= 1.5.4 =
* Импорт данных из Snigirev Meta & Alt.
