Обновления плагинов — важнейшая часть поддержания безопасности и функциональности сайта на WordPress. Однако в больших проектах или при управлении множеством сайтов ручное обновление становится неудобным и затратным по времени. В этой статье мы рассмотрим, как с помощью WPAPI создать механизм автоматизации обновлений плагинов через REST API, что позволит централизованно управлять процессом обновления и интегрировать его в собственные системы мониторинга и деплоя.
Почему важна автоматизация обновлений плагинов WordPress
Обновления плагинов — это не только добавление новых функций, но и устранение уязвимостей, повышение производительности и совместимости с ядром WordPress. Отсутствие своевременного обновления повышает риски взлома и нестабильной работы сайта.
Тем не менее, автоматизация обновлений часто ограничивается использованием встроенных возможностей WordPress или сторонних плагинов, которые обновляют всё подряд, без гибкой настройки и контроля. Используя REST API, мы можем создать собственный контроллер обновлений, который будет:
- Обновлять только нужные плагины;
- Проводить предварительные проверки совместимости;
- Логировать процесс обновления и ошибки;
- Интегрироваться с внешними системами мониторинга.
Как создать кастомный REST API эндпоинт для запуска обновлений плагинов
Начнем с регистрации собственного REST API эндпоинта, который позволит инициировать обновление выбранных плагинов по безопасному запросу.
add_action('rest_api_init', function () {
register_rest_route('wpapi/v1', '/update-plugins', [
'methods' => 'POST',
'callback' => 'wpapi_update_plugins_handler',
'permission_callback' => function () {
return current_user_can('update_plugins');
},
]);
});Этот код регистрирует маршрут /wpapi/v1/update-plugins, который принимает POST-запросы. Права доступа ограничены пользователями с возможностью update_plugins.
Далее реализуем обработчик wpapi_update_plugins_handler, который принимает массив с идентификаторами плагинов для обновления и запускает процесс.
function wpapi_update_plugins_handler(WP_REST_Request $request) {
$plugins = $request->get_param('plugins');
if (!is_array($plugins) || empty($plugins)) {
return new WP_REST_Response(['error' => 'No plugins specified'], 400);
}
include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
include_once ABSPATH . 'wp-admin/includes/plugin.php';
$upgrader = new Plugin_Upgrader();
$results = [];
foreach ($plugins as $plugin_slug) {
$plugin_file = wpapi_get_plugin_file_by_slug($plugin_slug);
if (!$plugin_file) {
$results[$plugin_slug] = 'Plugin not found';
continue;
}
$result = $upgrader->upgrade($plugin_file);
if (is_wp_error($result)) {
$results[$plugin_slug] = $result->get_error_message();
} elseif ($result === false) {
$results[$plugin_slug] = 'No update available or failed';
} else {
$results[$plugin_slug] = 'Updated successfully';
}
}
return new WP_REST_Response($results);
}
// Вспомогательная функция для получения файла плагина по слагу
function wpapi_get_plugin_file_by_slug($slug) {
$all_plugins = get_plugins();
foreach ($all_plugins as $plugin_file => $plugin_data) {
if (strpos($plugin_file, $slug . '/') === 0 || strpos($plugin_file, $slug . '.php') === 0) {
return $plugin_file;
}
}
return false;
}Разбор кода и особенности
В функции wpapi_update_plugins_handler мы:
- Принимаем параметр
plugins— массив с идентификаторами плагинов; - Подключаем необходимые файлы ядра WordPress для работы с обновлениями и плагинами;
- Создаем объект
Plugin_Upgraderдля запуска обновления; - Для каждого плагина ищем его основной файл и вызываем обновление;
- Формируем массив результатов с успешным или ошибочным статусом для каждого плагина.
Вспомогательная функция wpapi_get_plugin_file_by_slug помогает найти основной файл плагина по его слагу — это удобно, так как именно имя папки плагина или файла используется для идентификации.
Безопасность и права доступа
Очень важно ограничить доступ к эндпоинту обновления. В нашем примере это сделано через проверку current_user_can('update_plugins'). Это гарантирует, что только администраторы или авторизованные пользователи с нужными правами смогут запускать обновления.
Если вы планируете использовать этот REST API вне админки, например, через внешние системы деплоя, настройте аутентификацию через OAuth, JWT или Application Passwords, чтобы запросы были надежно защищены.
Как тестировать и использовать эндпоинт обновления
Для тестирования можно использовать инструменты, например Postman или curl, отправив POST-запрос на https://ваш-сайт.ru/wp-json/wpapi/v1/update-plugins с JSON телом:
{
"plugins": ["akismet", "hello-dolly"]
}Где akismet и hello-dolly — слаги плагинов, которые необходимо обновить.
Пример curl-запроса с базовой авторизацией (замените login и пароль):
curl -X POST https://ваш-сайт.ru/wp-json/wpapi/v1/update-plugins \
-u login:password \
-H "Content-Type: application/json" \
-d '{"plugins": ["akismet"]}'Дополнительные улучшения и интеграции
Логирование обновлений
Для контроля процесса можно добавить запись событий в лог-файл. Например, в обработчике после каждого обновления вызвать функцию записи в файл или использовать системный лог.
Проверка совместимости
Перед обновлением полезно проверять совместимость плагина с текущей версией WordPress и PHP. Для этого можно использовать функции ядра или дополнительные API, чтобы заблаговременно предотвращать ошибки.
Автоматический запуск через CRON
Можно настроить WP-Cron задачу, которая периодически вызывает данный REST API через wp_remote_post, чтобы обновления проходили автоматически по расписанию.
Заключение
Создание собственного REST API эндпоинта для автоматизации обновлений плагинов с помощью WPAPI дает гибкость и контроль над процессом обновления. Такой подход особенно полезен для агентств, разработчиков и крупных проектов, где важно управлять обновлениями централизованно, интегрировать их в CI/CD пайплайны и получать отчеты о состоянии обновлений.