Как установить ограничение по количеству активаций лицензий WordPress плагинов

Зачем ограничивать количество активаций лицензий в WordPress плагинах

При продаже WordPress плагинов с лицензиями часто возникает необходимость ограничить количество сайтов, на которых пользователь может активировать лицензию. Это защита от распространения одного ключа на множество проектов без оплаты, что помогает сохранить доход и контролировать распространение продукта.

Ограничение активаций — это важный инструмент монетизации и защиты авторских прав разработчика.

В этой статье разберём, как реализовать такое ограничение самостоятельно и какие готовые решения можно использовать.

Основные подходы к ограничению количества активаций

Ограничение количества активаций лицензии обычно реализуется на серверной стороне, где хранится база данных с информацией о лицензиях и связанных с ними активированных доменах или сайтах.

При попытке активации плагина на новом сайте происходит запрос на сервер лицензирования. Сервер проверяет, сколько активаций уже использовано, и разрешает или запрещает активацию.

Основные варианты хранения информации:

  • В собственной базе данных (MySQL, SQLite и др.)
  • В облачных сервисах или API лицензирования
  • Через сторонние сервисы лицензирования

Для WP плагинов часто используют REST API или AJAX запросы для проверки активации.

Пример реализации ограничения количества активаций: серверная часть

Представим, что у нас есть таблица wp_wplicense_activations, где хранятся записи с ключом лицензии и доменом активации.

Создадим функцию wplicense_check_activation_limit(), которая проверяет, не превышено ли максимальное количество активаций:

function wplicense_check_activation_limit($license_key, $max_activations = 3) {
    global $wpdb;
    $table = $wpdb->prefix . 'wplicense_activations';

    // Получаем количество уникальных активаций для ключа
    $count = $wpdb->get_var($wpdb->prepare(
        "SELECT COUNT(DISTINCT domain) FROM $table WHERE license_key = %s",
        $license_key
    ));

    if ($count >= $max_activations) {
        return false; // Превышен лимит
    }
    return true; // Можно активировать
}

Эта функция возвращает true, если активацию можно разрешить, и false при превышении лимита.

Пример обработки запроса активации лицензии в REST API WordPress

Для взаимодействия с плагином удобно использовать REST API. Создадим эндпоинт, который будет принимать ключ лицензии и домен сайта, и возвращать статус активации.

add_action('rest_api_init', function () {
    register_rest_route('wplicense/v1', '/activate', [
        'methods' => 'POST',
        'callback' => 'wplicense_activate_license',
        'permission_callback' => '__return_true',
    ]);
});

function wplicense_activate_license(WP_REST_Request $request) {
    $license_key = $request->get_param('license_key');
    $domain = $request->get_param('domain');

    if (empty($license_key) || empty($domain)) {
        return new WP_REST_Response(['error' => 'missing_parameters'], 400);
    }

    if (!wplicense_check_activation_limit($license_key)) {
        return new WP_REST_Response(['error' => 'activation_limit_reached'], 403);
    }

    // Добавляем новую активацию
    global $wpdb;
    $table = $wpdb->prefix . 'wplicense_activations';

    // Проверяем, есть ли уже активация с этим доменом
    $exists = $wpdb->get_var($wpdb->prepare(
        "SELECT COUNT(*) FROM $table WHERE license_key = %s AND domain = %s",
        $license_key, $domain
    ));

    if (!$exists) {
        $wpdb->insert($table, [
            'license_key' => $license_key,
            'domain' => $domain,
            'activated_at' => current_time('mysql'),
        ]);
    }

    return new WP_REST_Response(['success' => true], 200);
}

Такой подход позволяет централизованно контролировать активации, а клиентская часть плагина может отправлять запросы на данный API.

Пример клиентской части: запрос активации с плагина

Для отправки запроса на активацию можно использовать PHP-функцию wp_remote_post():

function wplicense_activate_remote($license_key) {
    $domain = $_SERVER['SERVER_NAME'];
    $response = wp_remote_post('https://wplicense.ru/wp-json/wplicense/v1/activate', [
        'body' => [
            'license_key' => $license_key,
            'domain' => $domain,
        ]
    ]);

    if (is_wp_error($response)) {
        return false;
    }

    $data = json_decode(wp_remote_retrieve_body($response), true);

    if (!empty($data['success'])) {
        return true;
    }

    return false;
}

Эту функцию можно вызвать при активации плагина, чтобы проверить и зарегистрировать активацию.

Готовые решения и плагины для управления лицензиями с ограничениями

Если хочется не строить систему с нуля, есть проверенные плагины и сервисы:

  • Clearfy Pro — оптимизация и безопасность, включает модули для управления лицензиями и активациями;
  • WPRemark — позволяет создавать сложные формы и интеграции, подходит для реализации системы активации;
  • Сторонние сервисы лицензирования, например, Easy Digital Downloads с лицензиями, хотя они требуют интеграции с вашим сайтом.

Эти инструменты помогут сэкономить время и получить расширенный функционал — например, отчёты по активациям, автоматический отзыв, интеграция с WooCommerce.

Как учитывать отзыв лицензии и изменение домена активации

Одна из сложностей — что пользователь может сменить домен, удалить сайт или переносить лицензию. Нужно предусмотреть возможность отзыва лицензии с одного домена и повторной активации на другом.

Для этого реализуйте API-метод отзыва лицензии, который удалит запись с доменом из базы:

add_action('rest_api_init', function () {
    register_rest_route('wplicense/v1', '/deactivate', [
        'methods' => 'POST',
        'callback' => 'wplicense_deactivate_license',
        'permission_callback' => '__return_true',
    ]);
});

function wplicense_deactivate_license(WP_REST_Request $request) {
    $license_key = $request->get_param('license_key');
    $domain = $request->get_param('domain');

    if (empty($license_key) || empty($domain)) {
        return new WP_REST_Response(['error' => 'missing_parameters'], 400);
    }

    global $wpdb;
    $table = $wpdb->prefix . 'wplicense_activations';

    $deleted = $wpdb->delete($table, [
        'license_key' => $license_key,
        'domain' => $domain
    ]);

    if ($deleted) {
        return new WP_REST_Response(['success' => true], 200);
    } else {
        return new WP_REST_Response(['error' => 'not_found'], 404);
    }
}

Так пользователь сможет деактивировать лицензию на старом сайте и активировать на новом, не превышая лимит.

Рекомендации по безопасности и производительности

При реализации системы лицензирования важно обеспечить безопасность данных и устойчивость к взлому:

  • Используйте проверку nonce и авторизацию для REST API, если возможно.
  • Шифруйте и валидируйте все входящие данные.
  • Минимизируйте количество запросов к базе данных.
  • Реализуйте логирование попыток активации и ошибок для анализа.

Это поможет защитить вашу систему от злоумышленников и повысить стабильность работы.

Выводы и практические советы

Ограничение количества активаций лицензий — важный элемент системы защиты и монетизации WordPress плагинов. Его можно реализовать самостоятельно с помощью REST API и базы данных или использовать готовые решения.

Реализация должна учитывать возможность отзыва лицензий, смены доменов и обеспечивать безопасность.

Для ускорения разработки и удобства можно использовать плагины от WPSHOP, которые помогут в управлении лицензиями и активациями.

Решение проблем с лицензиями в WooCommerce при использовании комплексных подписок
04.05.2026
Как автоматизировать проверку лицензий WordPress плагинов с помощью WP-Cron
21.03.2026
Как автоматизировать отзыв лицензий WordPress плагинов по IP адресу
04.02.2026
Автоматический отчет об использовании лицензий WordPress плагинов с распределением по пользователям
21.02.2026
Решение проблем с автообновлениями WooCommerce плагинов после смены домена
04.06.2026