Как автоматизировать проверку лицензий WordPress плагинов с помощью WP-Cron

В процессе поддержки и развития 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 и повысить безопасность.

Как создать уникальный лицензионный ключ для WordPress плагина
01.11.2025
Решение проблем с проверкой лицензии в WooCommerce плагинах WordPress
25.04.2026
Как отменить активацию лицензии WordPress плагина без ошибок
26.12.2025
Как сделать очистку базы данных от устаревших лицензий WordPress плагинов
02.04.2026
Как создать автоматическую проверку лицензии WordPress плагинов с помощью REST API
16.01.2026