В системах лицензирования WordPress плагинов часто требуется не просто ограничить общее количество активаций лицензии, но и сделать это с учётом ролей пользователей сайта. Например, администраторы могут иметь больше активных лицензий, чем редакторы или подписчики. В этой статье мы разберём, как реализовать подобное ограничение с помощью собственного кода и рассмотрим практические примеры.
Почему важно учитывать роли пользователей при ограничении активаций
В большинстве случаев лицензия ограничивается фиксированным числом активаций — например, 3 активации на лицензию. Но такой подход не всегда удобен, если плагин используется на мультисайтах или в командах с разной ответственностью. Например, администраторы могут управлять разными проектами и им нужно больше активаций, а редакторы или обычные пользователи — меньше.
Учитывая роли, можно:
- Гибко управлять лицензиями в больших командах.
- Снизить риск превышения допустимого числа активаций.
- Автоматизировать контроль и отчётность по лицензиям.
Такой подход повышает удобство и безопасность использования плагинов.
Как реализовать ограничение активаций по ролям — общая схема
Для реализации нам потребуется:
- Определить роли, для которых будут разные лимиты активаций.
- При попытке активации лицензии проверять роль пользователя и текущее число активных активаций для этой роли.
- Если лимит превышен — блокировать активацию с сообщением.
- Обеспечить хранение статистики активаций по ролям на лицензионном сервере или в базе данных.
В реальном проекте это можно реализовать через расширение лицензионного API, добавление новых параметров и проверок.
Пример структуры данных для хранения лимитов
В базе данных или в конфигурации лицензионного сервера можно хранить массив с ограничениями:
$wplicense_role_limits = array(<br> 'administrator' => 5,<br> 'editor' => 3,<br> 'author' => 2,<br> 'subscriber' => 1,<br>);Это значит, что администратор может активировать лицензию на 5 сайтов, редактор — на 3 и так далее.
Код для проверки и блокировки активации по ролям
Ниже пример функции с префиксом wplicense_, которая проверяет возможность активации лицензии с учётом роли текущего пользователя. Предполагаем, что у вас есть функция получения текущих активаций по роли wplicense_get_active_activations_by_role().
function wplicense_can_activate_license_by_role( $user_id, $license_key ) {<br> // Массив ограничений по ролям<br> $role_limits = array(<br> 'administrator' => 5,<br> 'editor' => 3,<br> 'author' => 2,<br> 'subscriber' => 1,<br> );<br><br> $user = get_userdata( $user_id );<br> if ( ! $user ) {<br> return new WP_Error( 'invalid_user', 'Пользователь не найден' );<br> }<br><br> // Определяем роль пользователя, берем первую из массива ролей<br> $roles = $user->roles;<br> if ( empty( $roles ) ) {<br> return new WP_Error( 'no_role', 'У пользователя нет роли' );<br> }<br> $role = $roles[0];<br><br> // Проверяем наличие лимита для роли<br> if ( ! isset( $role_limits[ $role ] ) ) {<br> return new WP_Error( 'role_not_allowed', 'Роль пользователя не имеет доступа к активации лицензии' );<br> }<br><br> $max_activations = $role_limits[ $role ];<br> $current_activations = wplicense_get_active_activations_by_role( $license_key, $role );<br><br> if ( $current_activations >= $max_activations ) {<br> return new WP_Error( 'limit_exceeded', 'Достигнуто максимальное количество активаций для роли ' . $role );<br> }<br><br> return true;<br>}Эта функция возвращает true, если активация возможна, или WP_Error с описанием ошибки в противном случае.
Пример функции подсчёта активных активаций по роли
В реальной системе нужно реализовать хранение данных активаций. Ниже упрощённый пример, где данные берутся из базы данных wp_activations с полем user_role:
function wplicense_get_active_activations_by_role( $license_key, $role ) {<br> global $wpdb;<br> $table = $wpdb->prefix . 'activations';<br> $count = $wpdb->get_var( $wpdb->prepare(<br> "SELECT COUNT(*) FROM $table WHERE license_key = %s AND user_role = %s",<br> $license_key,<br> $role<br> ));<br> return (int) $count;<br>}В системе лицензирования необходимо при каждой активации сохранять роль пользователя.
Как интегрировать ограничение в процесс активации лицензии
Чтобы использовать проверку с ролями, добавьте вызов wplicense_can_activate_license_by_role() в точку входа активации лицензии на вашем лицензионном сервере или в коде плагина, который отвечает за валидацию ключа.
Пример упрощённой логики:
function wplicense_handle_license_activation( $user_id, $license_key ) {<br> $check = wplicense_can_activate_license_by_role( $user_id, $license_key );<br> if ( is_wp_error( $check ) ) {<br> return $check; // Возвращаем ошибку активации<br> }<br> // Продолжаем активацию<br> // Сохраняем активацию с учётом роли пользователя<br> wplicense_save_activation( $user_id, $license_key );<br> return true;<br>}Такой подход позволяет гибко контролировать активации и учитывать роли пользователей.
Практические советы и рекомендации
Хранение данных активаций
Для хранения информации об активациях создайте отдельную таблицу в базе данных с полями:
- ID
- license_key
- user_id
- user_role
- activation_date
- site_url (если нужно)
Это позволит быстро и эффективно фильтровать активации по ролям и лицензиям.
Обработка смены роли пользователя
Если роль пользователя изменится, подумайте, как это повлияет на лимиты. Можно при смене роли автоматически пересчитывать количество активаций или запрещать новые, если лимит превышен.
Интеграция с WPShop
Если вы используете плагин WP Licensing от WPShop, то настройка таких ограничений возможна через расширение API и фильтры. В документации WPShop есть примеры, как добавить кастомные проверки лицензий.
Заключение
Ограничение количества активаций лицензии WordPress плагинов с учётом ролей пользователей — эффективный способ гибко управлять лицензиями в командах разного уровня доступа. В статье приведены конкретные примеры кода и рекомендации по реализации. Используйте их, чтобы повысить контроль над лицензиями и адаптировать систему под нужды вашего проекта.