Диагностика проблем с автообновлениями в WooCommerce плагинах
Часто после добавления системы активации лицензий в WooCommerce плагины возникают ошибки с автообновлениями. Признаки:
- Обновления плагина не появляются в админке WordPress;
- При попытке обновления появляется ошибка «Invalid license» или «License expired»;
- Автообновление происходит, но плагин деактивируется после обновления;
- В логах сервера или WordPress debug видны ошибки взаимодействия с лицензионным сервером.
Основные причины:
- Неправильная реализация проверки лицензии в хуках автообновления;
- Отсутствие или неверная обработка HTTP-запросов к лицензионному серверу;
- Проблемы с кешированием результатов проверки лицензии;
- Несоответствие версии API лицензирования и версии плагина.
Пошаговое решение проблем с автообновлениями WooCommerce и лицензиями
1. Корректная интеграция с системой автообновлений WordPress
Для управления автообновлениями в WordPress плагинах с лицензиями нужно использовать фильтр site_transient_update_plugins и хук plugins_api. Пример базовой реализации проверки лицензии при автообновлении:
add_filter('site_transient_update_plugins', 'check_plugin_license_for_updates');
function check_plugin_license_for_updates($transient) {
if (empty($transient->checked)) {
return $transient;
}
$license_key = get_option('my_plugin_license_key');
$response = wp_remote_post('https://license-server.example.com/api/check', [
'body' => [
'license_key' => $license_key,
'plugin_slug' => 'my-plugin-slug',
'version' => '1.0.0'
]
]);
if (is_wp_error($response)) {
return $transient; // не блокируем обновления при ошибке связи
}
$data = json_decode(wp_remote_retrieve_body($response));
if ($data->valid) {
$plugin_file = 'my-plugin/my-plugin.php';
if (version_compare($data->new_version, $transient->checked[$plugin_file], '>')) {
$transient->response[$plugin_file] = (object) [
'slug' => 'my-plugin',
'new_version' => $data->new_version,
'url' => 'https://example.com/my-plugin',
'package' => $data->package_url
];
}
}
return $transient;
}2. Обработка запроса информации о плагине
Хук plugins_api отвечает за показ информации о плагине в админке. Необходимо проверять лицензию и возвращать актуальные данные:
add_filter('plugins_api', 'my_plugin_plugins_api', 10, 3);
function my_plugin_plugins_api($res, $action, $args) {
if ($args->slug !== 'my-plugin') {
return $res;
}
$license_key = get_option('my_plugin_license_key');
$response = wp_remote_post('https://license-server.example.com/api/info', [
'body' => ['license_key' => $license_key]
]);
if (is_wp_error($response)) {
return $res;
}
$data = json_decode(wp_remote_retrieve_body($response));
if (!$data->valid) {
return new WP_Error('license_invalid', 'License invalid or expired');
}
$res = (object) [
'name' => 'My Plugin',
'slug' => 'my-plugin',
'version' => $data->new_version,
'author' => 'My Company',
'homepage' => 'https://example.com/my-plugin',
'download_link' => $data->package_url,
'sections' => [
'description' => $data->description
]
];
return $res;
}Проверка результата после внедрения
- В админке WordPress в разделе «Обновления» появляется новая версия плагина;
- Обновление плагина проходит без ошибок, плагин остается активным;
- В логах ошибок WordPress отсутствуют ошибки, связанные с лицензией;
- Проверка лицензии через REST API или UI лицензионного сервера возвращает статус "valid" без ошибок.
Частые ошибки и способы их исправления
- Ошибка: Автообновление не появляется — проверьте, вызывается ли фильтр
site_transient_update_pluginsи правильно ли указаны пути к файлам плагина. - Ошибка: Плагин деактивируется после обновления — проверьте, что проверка лицензии не блокирует установку обновления при временных ошибках сети.
- Ошибка: Ошибки HTTP при обращении к лицензионному серверу — проверьте SSL-сертификат и timeout запроса в
wp_remote_post. - Ошибка: Несовпадение версий API — синхронизируйте версию API на сервере лицензий и в плагине.
Практические советы по безопасности и производительности
- Кешируйте результаты проверки лицензии на 10-15 минут, чтобы не перегружать лицензионный сервер.
- Используйте безопасное соединение HTTPS для всех запросов к серверу лицензий.
- Обрабатывайте ошибки сети аккуратно, чтобы не блокировать обновления из-за временных проблем.
- Логируйте запросы к лицензионному серверу для отладки и анализа проблем.
Сравнение способов реализации автообновлений с лицензиями
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Фильтр site_transient_update_plugins + plugins_api | Стандартный способ, интеграция с ядром WP | Гибкость, контроль, работает с любыми плагинами | Требует дополнительной реализации серверной части |
| Использование плагинов автообновления (например Easy Updates Manager) | Готовые решения для управления обновлениями | Простота настройки | Может конфликтовать с лицензиями, меньше гибкости |
| Встроенные автообновления WooCommerce с подписками | Использование стандартных механизмов WooCommerce | Интеграция с подписками и лицензиями | Ограничение по кастомизации, требует WooCommerce |