В этой статье рассмотрим, как реализовать ограничение на количество активаций лицензии 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.
Рекомендуется дополнительно интегрировать механизм деактивации и автоматического сброса лимитов для удобства пользователей и гибкости системы лицензирования.