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

В этой статье рассмотрим, как реализовать ограничение на количество активаций лицензии WordPress плагина с учётом ролей пользователей. Такая настройка полезна, если вы хотите дифференцировать доступ и активации для, например, администраторов, редакторов и подписчиков.

Почему важно ограничивать лицензии по ролям пользователей

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

Ограничение по ролям помогает управлять использованием лицензий более гибко и защищать продукт от несанкционированного распространения.

Кроме того, это позволяет создавать различные тарифы и условия для разных категорий пользователей.

Как реализовать проверку роли пользователя при активации лицензии

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

Пример кода функции проверки роли пользователя, которую назовём wplicense_check_user_role_for_activation():

function wplicense_check_user_role_for_activation($user_id, $allowed_roles = array()) {
    $user = get_userdata($user_id);
    if (!$user) {
        return false; // Пользователь не найден
    }
    foreach ($user->roles as $role) {
        if (in_array($role, $allowed_roles)) {
            return true; // Роль разрешена
        }
    }
    return false; // Роль не разрешена
}

Эта функция принимает ID пользователя и массив разрешённых ролей. Если у пользователя есть хотя бы одна из этих ролей, функция вернёт true.

Пример использования в процессе активации лицензии

Предположим, у вас есть REST API для активации лицензии. В обработчике запроса добавить проверку:

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

function wplicense_activate_license_handler(WP_REST_Request $request) {
    $user_id = get_current_user_id();
    $allowed_roles = array('administrator', 'editor');
    if (!wplicense_check_user_role_for_activation($user_id, $allowed_roles)) {
        return new WP_REST_Response(array(
            'success' => false,
            'message' => 'У вас нет прав для активации лицензии'
        ), 403);
    }
    // Логика активации лицензии
    return new WP_REST_Response(array('success' => true, 'message' => 'Лицензия активирована'));
}

Таким образом, только пользователи с ролями administrator и editor смогут активировать лицензию.

Как ограничить количество активаций по ролям

Проверка роли — это только первый шаг. Чтобы ограничить количество активаций, нужно хранить данные об активациях в базе и учитывать их при каждой попытке активации.

Реализуем простейшую систему хранения с помощью пользовательских мета-данных и опций.

Хранение количества активаций по ролям

Можно завести опцию, например wplicense_activations_count, где будет массив с ролями и количеством активаций:

function wplicense_get_activations_count() {
    $counts = get_option('wplicense_activations_count', array());
    return $counts;
}

function wplicense_update_activations_count($role, $delta = 1) {
    $counts = wplicense_get_activations_count();
    if (!isset($counts[$role])) {
        $counts[$role] = 0;
    }
    $counts[$role] += $delta;
    update_option('wplicense_activations_count', $counts);
}

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

function wplicense_can_activate_by_role($role, $max_activations) {
    $counts = wplicense_get_activations_count();
    $current = isset($counts[$role]) ? $counts[$role] : 0;
    return $current < $max_activations;
}

Интеграция с активацией лицензии

Расширим функцию активации из предыдущего примера:

function wplicense_activate_license_handler(WP_REST_Request $request) {
    $user_id = get_current_user_id();
    $allowed_roles = array('administrator', 'editor');
    $max_activations_per_role = array(
        'administrator' => 5,
        'editor' => 3
    );

    $user = get_userdata($user_id);
    if (!$user) {
        return new WP_REST_Response(array('success' => false, 'message' => 'Пользователь не найден'), 404);
    }

    // Проверяем роли и лимиты
    $can_activate = false;
    foreach ($user->roles as $role) {
        if (in_array($role, $allowed_roles)) {
            if (wplicense_can_activate_by_role($role, $max_activations_per_role[$role])) {
                $can_activate = true;
                $current_role = $role;
                break;
            }
        }
    }

    if (!$can_activate) {
        return new WP_REST_Response(array('success' => false, 'message' => 'Превышен лимит активаций для вашей роли или нет доступа'), 403);
    }

    // Здесь логика сохранения активации лицензии
    wplicense_update_activations_count($current_role, 1);

    return new WP_REST_Response(array('success' => true, 'message' => 'Лицензия успешно активирована'));
}

Дополнительные советы и рекомендации

Учет деактиваций и отзывов лицензий

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

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

function wplicense_deactivate_license($user_id) {
    $user = get_userdata($user_id);
    if (!$user) return false;
    foreach ($user->roles as $role) {
        $counts = wplicense_get_activations_count();
        if (isset($counts[$role]) && $counts[$role] > 0) {
            wplicense_update_activations_count($role, -1);
            return true;
        }
    }
    return false;
}

Интеграция с плагинами для лицензирования

Если вы используете готовые решения, такие как Clearfy Pro, часть функционала по учёту пользователей и ролей уже реализована. Вы можете расширить их API для добавления своих ограничений.

Использование WP-Cron для сброса лимитов

Если по договору лицензирования лимиты должны сбрасываться, например, ежемесячно, используйте WP-Cron для автоматического обнуления счётчиков:

function wplicense_reset_activations_count() {
    update_option('wplicense_activations_count', array());
}

if (!wp_next_scheduled('wplicense_monthly_reset')) {
    wp_schedule_event(time(), 'monthly', 'wplicense_monthly_reset');
}
add_action('wplicense_monthly_reset', 'wplicense_reset_activations_count');

Это позволит управлять лицензиями динамично и не блокировать пользователей навсегда.

Итоги

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

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

Как сделать отзыв лицензии в WordPress плагине с использованием REST API
18.12.2025
Как автоматизировать проверку лицензий WordPress плагинов с помощью WP-Cron
21.03.2026
Как автоматизировать процесс возврата лицензий WordPress плагинов
28.02.2026
Как установить ограничение на лицензию WordPress плагина по геолокации
20.04.2026
Оптимальные настройки WordPress для управления лицензиями плагинов
02.12.2025