Зачем
Когда у тебя десяток WP-сайтов и общий кастомный плагин, ручное обновление перестаёт работать после третьего сайта. Нужно чтобы плагин сам проверял удалённый JSON с информацией о свежей версии и предлагал обновиться через стандартный UI WordPress.
Минимальная схема
Плагин периодически тянет URL с plugins-info.json, в котором лежит номер последней версии и URL к ZIP-архиву. Если версия больше текущей — встроенный auto-updater делает remaining работу.
{
"name": "My Plugin",
"slug": "my-plugin",
"version": "1.6.2",
"download_url": "https://updates.example.com/my-plugin-1.6.2.zip",
"requires": "6.0",
"tested": "6.5"
}
Грабли
Первая — кэширование. Если просто отдавать JSON, WP его кэширует на 12 часов. Решение — версионировать URL и явно прокидывать Cache-Control. Вторая — права доступа. Auto-updater работает от того же пользователя, что и PHP-FPM, и если права на wp-content неправильные — апдейт молча падает в фоне.
Третья — обратная совместимость БД. Если новая версия мигрирует схему — нужен механизм version_check в самом плагине, иначе после autoupdate'а у вас получится плагин 1.6.2 с БД 1.6.1 и неочевидные ошибки в логах.
Чему я научился
Любая миграция БД — отдельный шаг, который проверяет get_option('plugin_db_version') и накатывает изменения по одной за раз с явным логированием. Никаких «всё в одной функции активации» — это работает только пока обновлений нет.