=== ACH Thumbnail ===
Contributors: alekseychikun
Tags: thumbnail, image, webp, avif, performance
Requires at least: 6.0
Tested up to: 6.6
Requires PHP: 8.1
Stable tag: 1.3.3
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html

Создание миниатюр изображений «на лету» с автоматической конвертацией в WebP и AVIF.

== Description ==

ACH Thumbnail — плагин для разработчиков, который кропит и ресайзит изображения по запросу из шаблонов темы и автоматически генерирует современные форматы WebP и AVIF.

Подробная документация на русском: https://alekseychikun.ru/plugins/ach-thumbnail/#usage

= Возможности =

* Кроп и ресайз через Imagick / GD.
* Автоматическая генерация WebP и AVIF companion-файлов.
* `<picture>` рендер со всеми форматами через `ach_picture()`.
* Retina-варианты (`@2x`).
* Registry зарегистрированных размеров через `ach_register_size()`.
* Очередь фоновой обработки через WP-Cron — страница не блокируется на медленной AVIF-генерации.
* Безопасное удаление кэша при удалении вложения.
* Graceful fallback если AVIF недоступен.

= Использование =

`add_action( 'ach_thumbnail_inited', function() {
    ach_register_size( 'PRODUCT', [ 'w' => 800, 'h' => 600, 'crop' => true ] );
} );

// В шаблоне:
echo ach_picture( 'PRODUCT', $url, [ 'alt' => '...' ] );`

== Installation ==

1. Загрузите папку `ach-thumbnail` в `wp-content/plugins/`.
2. Активируйте через **Плагины** в админке.
3. Зарегистрируйте размеры в `functions.php` темы через `ach_register_size()`.
4. Используйте `ach_picture()`, `ach_thumb_src()`, `ach_thumb_img()` в шаблонах.

== Changelog ==

= 1.3.3 =
* Тик воркера очереди не дольше 50 секунд, сколько бы ни разрешал PHP. Если другой плагин ставит
  set_time_limit(3600) на каждую загрузку WordPress, тик растягивался до 51 минуты: форматы
  догенерировались часами, а сигналы тика (сброс кэша, массовая нарезка) приходили раз в час.

= 1.3.2 =
* Массовая нарезка: если в очереди форматов больше 200 задач (фильтр `ach_thumb_backlog_threshold`),
  сигнал `ach_thumb_worker_tick_done` отдаёт пустой список картинок и четвёртым параметром `true`,
  а когда очередь опустеет, один раз срабатывает `ach_thumb_backlog_drained`. Раньше точечные
  сбросы кэша по тысячам картинок сливались в полный сброс кэша страниц каждую минуту.
* Папки и файлы кэша, созданные процессом от root (крон контейнера), отдаются владельцу папки кэша —
  веб-процесс больше не получает «Permission denied» в папках, созданных кроном.

= 1.3.1 =
* Адреса миниатюр, собранные вне веб-запроса (крон, WP-CLI, прокси без HTTPS=on), получали
  http:// на https-сайте: схема бралась из is_ssl(). Теперь — из настройки home сайта.
  Касается папки кэша, адреса заглушки и адресов вида //host/path.
* Обновления плагина приходят в админку сайта с alekseychikun.ru: новая версия появляется
  в списке плагинов и ставится одной кнопкой.

= 1.3.0 =
* В очереди генерации форматов сохраняется исходник картинки (колонка `src`, схема БД v2 —
  добавляется автоматически через dbDelta при первом запросе после обновления).
* Сигнал `ach_thumb_worker_tick_done` получил третий параметр — массив исходников, форматы
  которых сгенерированы за тик. Подписчик может точечно инвалидировать кэш только тех
  страниц, где эти картинки используются, вместо сброса всего кэша сайта.
* `Queue::push()` принимает необязательный `$src` — обратная совместимость сохранена.
* webp-исходники теперь тоже получают avif-вариант: раньше companion ставился в очередь
  только для jpg/png thumb'ов, и картинка, загруженная в webp, оставалась без самого
  компактного формата навсегда.
* Убран лишний `<source type="image/webp">` (и дубль строки в `image-set`) у webp-исходников:
  companion-путь совпадал с самим thumb'ом, и один и тот же адрес попадал в разметку дважды.

= 1.0.0 =
* Phase 1: фундамент. Синхронная генерация JPG/PNG через Imagick / GD, registry размеров, удаление кэша при delete_attachment.
