Автоматическое обновление плагинов — важный аспект поддержки качества и безопасности WordPress-сайтов. Если вы разрабатываете собственный плагин и хотите не зависеть от репозитория WordPress.org, полезно реализовать механизм автообновлений через свой сервер. В этой статье мы подробно разберём, как создать такой плагин с минимальными затратами и максимальной безопасностью, а также рассмотрим практические примеры кода.
Почему важно реализовать автообновления для собственного плагина WordPress
Автообновления позволяют своевременно поставлять исправления и новые функции пользователям без их участия. Это повышает безопасность, уменьшает количество обращений в техподдержку и улучшает пользовательский опыт. Если плагин размещён не в официальном репозитории, WordPress не будет автоматически получать обновления, поэтому разработчику нужно самостоятельно внедрить этот механизм.
Собственный сервер обновлений — это удобный способ контролировать процесс доставки обновлений, а также вести статистику версий и загрузок.
Примеры популярных решений для автообновлений
- Easy Digital Downloads Software Licensing — коммерческое решение с поддержкой лицензий и обновлений.
- GitHub Updater — позволяет обновлять плагины из репозиториев GitHub.
- WP Pusher — обновления из GitHub, Bitbucket и GitLab.
В этой статье мы реализуем простой и надёжный механизм обновлений без сторонних сервисов.
Основные шаги для создания автообновляемого плагина
Чтобы внедрить автообновления, необходимо выполнить следующие задачи:
- Создать API на сервере, который будет отдавать метаданные о последней версии плагина.
- Добавить в плагин обработчик, который будет проверять наличие обновлений.
- Реализовать загрузку и установку обновления через стандартный интерфейс WordPress.
Рассмотрим каждый шаг подробнее.
1. Создание API сервера обновлений
На стороне сервера нужно подготовить скрипт, который при запросе возвращает JSON с информацией о новой версии плагина:
<?php
// update-server.php
header('Content-Type: application/json');
$plugin_slug = 'wpkit-auto-update';
$latest_version = '1.2.0';
$download_url = 'https://yourdomain.com/downloads/wpkit-auto-update-1.2.0.zip';
// Проверяем параметр запроса
if (isset($_GET['slug']) && $_GET['slug'] === $plugin_slug) {
echo json_encode([
'version' => $latest_version,
'download_url' => $download_url,
'tested' => '6.3',
'requires' => '6.0'
]);
} else {
echo json_encode([]);
}
?>Этот скрипт принимает параметр slug и возвращает версию плагина, ссылку для скачивания, минимальную и максимальную версии WordPress, с которыми совместим плагин.
2. Добавление проверки обновлений в плагин
Внутри плагина нужно добавить фильтр pre_set_site_transient_update_plugins, чтобы внедрить свой источник обновлений. Вот пример функции для wpkit:
function wpkit_check_for_update($transient) {
if (empty($transient->checked)) {
return $transient;
}
$plugin_slug = 'wpkit-auto-update/wpkit-auto-update.php';
$current_version = $transient->checked[$plugin_slug] ?? false;
if (!$current_version) {
return $transient;
}
$response = wp_remote_get('https://yourdomain.com/update-server.php?slug=wpkit-auto-update');
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) != 200) {
return $transient;
}
$data = json_decode(wp_remote_retrieve_body($response));
if (version_compare($current_version, $data->version, '<')) {
$plugin = [
'slug' => 'wpkit-auto-update',
'new_version' => $data->version,
'package' => $data->download_url,
'tested' => $data->tested,
'requires' => $data->requires
];
$transient->response[$plugin_slug] = (object) $plugin;
}
return $transient;
}
add_filter('pre_set_site_transient_update_plugins', 'wpkit_check_for_update');Эта функция проверяет текущую версию плагина, запрашивает обновления с сервера, и если есть новая версия, сообщает WordPress о доступном обновлении.
3. Обработка детальной информации об обновлении
WordPress также запрашивает данные о плагине — описание, изменения и т.п. Для этого можно использовать фильтр plugins_api:
function wpkit_plugin_info($res, $action, $args) {
if ($args->slug !== 'wpkit-auto-update') {
return $res;
}
$response = wp_remote_get('https://yourdomain.com/update-server.php?slug=wpkit-auto-update&info=1');
if (is_wp_error($response)) {
return $res;
}
$data = json_decode(wp_remote_retrieve_body($response));
if (!$data) {
return $res;
}
$res = new stdClass();
$res->name = 'WPKit Auto Update';
$res->slug = 'wpkit-auto-update';
$res->version = $data->version;
$res->author = 'WPKit';
$res->homepage = 'https://wpkit.ru/?utm_source=wpkit.ru&utm_medium=article&utm_campaign=kak-sozdat-avtoobnovlyaemyj-plugin-dlya-wordpress';
$res->sections = [
'description' => 'Плагин с поддержкой автообновлений из собственного сервера.',
'changelog' => $data->changelog ?? 'Обновления отсутствуют.'
];
return $res;
}
add_filter('plugins_api', 'wpkit_plugin_info', 10, 3);Практические советы и рекомендации
Безопасность и проверка целостности
Для безопасности обновлений можно добавить проверку подписи пакета обновления, например, используя хеш SHA256. Это защитит от подмены файлов на сервере. В ответ API можно добавить поле package_hash и проверять его перед установкой.
Управление лицензиями и активацией
Если плагин коммерческий, стоит добавить механизм проверки лицензии перед выдачей обновления. Это можно реализовать через отдельный API и хранение ключа в настройках плагина.
Обзор полезных плагинов для контроля обновлений
- Clearfy Pro — плагин для оптимизации и управления обновлениями на сайте.
- WPRemark — для оценки и управления отзывами, полезен при поддержке плагина.
Тестирование и отладка автообновлений
При разработке важно тщательно протестировать процесс обновления на тестовом сайте. Используйте логи WordPress и инструменты отладки, например, WP_DEBUG. Можно добавить в код плагина логирование шага загрузки и установки обновления:
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log('WPKit: новая версия доступна - ' . $data->version);
}Также полезно проверять корректность скачивания ZIP-архива и целостность перед установкой.
Заключение
Создание собственного механизма автообновлений для плагина WordPress — задача вполне выполнимая и крайне полезная для разработчиков. Она обеспечивает удобство для пользователей и упрощает поддержку продукта. Используя описанные подходы и примеры кода, вы сможете быстро внедрить такую функциональность и масштабировать её в дальнейшем.