Зачем

Когда у тебя десяток 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') и накатывает изменения по одной за раз с явным логированием. Никаких «всё в одной функции активации» — это работает только пока обновлений нет.