В процессе поддержки и развития WordPress плагинов важной задачей является регулярная проверка статуса лицензий на стороне сервера. Ручная проверка неудобна, а встроенные механизмы обновления не всегда покрывают все случаи, особенно если вы реализуете собственную систему лицензирования.
Почему автоматизация проверки лицензий важна
Если проверять лицензии плагинов вручную или только при закрытии/открытии админки, есть риск, что пользователь будет использовать плагин с истекшим сроком или с отозванной лицензией. Автоматическая периодическая проверка помогает:
- Обеспечить своевременное обнаружение недействительных лицензий.
- Минимизировать нагрузку на сервер, делая проверки строго по расписанию.
- Автоматически деактивировать или ограничивать функционал плагина при проблемах с лицензией.
Рассмотрим, как это реализовать с помощью WP-Cron — штатного планировщика задач WordPress.
Настройка WP-Cron для проверки лицензий
WP-Cron — это система имитации планировщика задач, которая запускает запланированные события при посещении сайта. Для нашей задачи мы создадим событие, которое будет вызываться, например, раз в сутки и проверять статус лицензий.
Регистрация события в WP-Cron
Добавим в файл плагина или в functions.php темы следующий код для регистрации события:
function wplicense_schedule_license_check() {
if ( ! wp_next_scheduled( 'wplicense_daily_license_check' ) ) {
wp_schedule_event( time(), 'daily', 'wplicense_daily_license_check' );
}
}
add_action( 'wp', 'wplicense_schedule_license_check' );Этот код проверит, запланировано ли событие wplicense_daily_license_check, и если нет, создаст его с интервалом 'daily' (один раз в сутки).
Обработка события проверки лицензий
Далее нужно добавить функцию, которая будет выполнять проверку лицензий при срабатывании события:
function wplicense_handle_license_check() {
$licenses = get_option( 'wplicense_licenses', [] );
foreach ( $licenses as $license_key => $license_data ) {
$response = wp_remote_post( 'https://your-license-server.com/api/check', [
'body' => [
'license_key' => $license_key,
'domain' => home_url(),
],
'timeout' => 15,
] );
if ( is_wp_error( $response ) ) {
// Логируем ошибку
error_log( 'Ошибка проверки лицензии ' . $license_key . ': ' . $response->get_error_message() );
continue;
}
$body = json_decode( wp_remote_retrieve_body( $response ), true );
if ( empty( $body['valid'] ) || ! $body['valid'] ) {
// Лицензия недействительна, обновим статус
$licenses[ $license_key ]['status'] = 'invalid';
// Можно дополнительно отключить функционал или уведомить пользователя
} else {
$licenses[ $license_key ]['status'] = 'valid';
}
}
update_option( 'wplicense_licenses', $licenses );
}
add_action( 'wplicense_daily_license_check', 'wplicense_handle_license_check' );В этом примере мы обращаемся к внешнему API сервера лицензий, передавая ключ и домен, получаем ответ с информацией о статусе и обновляем локальное хранилище данных лицензий.
Расширение функционала: уведомления и деактивация плагина
После получения статуса лицензии можно уведомлять администратора сайта о проблемах, используя стандартные уведомления WordPress в админке. Например:
function wplicense_admin_notices() {
$licenses = get_option( 'wplicense_licenses', [] );
foreach ( $licenses as $license_key => $license_data ) {
if ( isset( $license_data['status'] ) && $license_data['status'] === 'invalid' ) {
echo '<div class="notice notice-error is-dismissible">';
echo '<p>Лицензия "' . esc_html( $license_key ) . '" недействительна. Пожалуйста, обновите или активируйте лицензию.</p>';
echo '</div>';
}
}
}
add_action( 'admin_notices', 'wplicense_admin_notices' );Для ограничения функционала плагина при недействительной лицензии в коде плагина проверяйте статус лицензии из опций и отключайте соответствующие возможности.
Как тестировать и отлаживать автоматическую проверку
Для отладки можно временно изменить интервал запуска задачи на часовой или даже минутный. Это позволит быстро проверить логику. Например, для этого добавьте кастомный интервал:
function wplicense_custom_cron_intervals( $schedules ) {
$schedules['every_five_minutes'] = [
'interval' => 300,
'display' => 'Каждые 5 минут'
];
return $schedules;
}
add_filter( 'cron_schedules', 'wplicense_custom_cron_intervals' );И замените вызов wp_schedule_event на использование 'every_five_minutes'. Не забудьте вернуть интервал к 'daily' после тестирования.
Также полезно использовать плагины для управления WP-Cron, например, WP Crontrol, которые позволяют вручную запускать задачи и просматривать запланированные события.
Альтернативный вариант: использование внешнего cron-сервиса
WP-Cron запускается при посещении сайта, что не всегда надежно для сайтов с низким трафиком. Если нужна более точная регулярность, стоит настроить системный cron на сервере и вызывать wp-cron.php напрямую:
* * * * * wget -q -O - https://yoursite.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Так вы гарантируете выполнение задач независимо от посещаемости.
Выводы
Автоматизация проверки лицензий с помощью WP-Cron — эффективный способ поддерживать актуальность данных и обеспечивать защиту плагинов от несанкционированного использования. Важно грамотно организовать взаимодействие с сервером лицензий, обрабатывать ошибки и информировать администратора о проблемах.
Если вы используете плагины из WPShop, например, Clearfy Pro, можно дополнительно оптимизировать работу WP-Cron и повысить безопасность.