Управление пользовательскими ролями и правами — одна из ключевых задач при администрировании WordPress, особенно если у вас несколько сайтов, которые должны иметь одинаковую структуру доступа для пользователей. В этой статье мы подробно рассмотрим, как синхронизировать пользовательские роли и права между сайтами WordPress с помощью готовых плагинов и на примере собственного кода.
Почему важно синхронизировать роли и права в WordPress
В стандартной установке WordPress есть базовые роли, такие как администратор, редактор, автор, подписчик и т.д. Однако при развитии сайта часто появляется необходимость создавать собственные роли с уникальными правами доступа или модифицировать стандартные. Если у вас несколько сайтов, и вы хотите, чтобы у пользователей были одинаковые роли и права на всех ресурсах, то ручное дублирование настроек — это неэффективно и рискованно.
Синхронизация ролей гарантирует, что права доступа и возможности пользователей будут идентичны, что важно для безопасности и удобства администрирования. К тому же это существенно экономит время при управлении несколькими сайтами.
Обзор популярных плагинов для синхронизации ролей и прав
Плагин User Role Sync
User Role Sync — это специализированный плагин, который позволяет экспортировать и импортировать пользовательские роли и их права между сайтами WordPress. Он работает путем создания JSON-файла с описанием ролей и предоставляет простой интерфейс для импорта на другой сайт.
Основные возможности:
- Экспорт кастомных и стандартных ролей.
- Импорт ролей на целевой сайт.
- Поддержка мультисайтовых установок.
Однако плагин не всегда обновляет роли автоматически, поэтому при частых изменениях потребуется повторять экспорт/импорт.
Плагин WP Remote User Sync
Данный плагин решает задачу синхронизации пользователей, ролей и прав в реальном времени между несколькими сайтами. Он работает по принципу API и позволяет автоматически обновлять данные пользователей, включая их роли и capabilities.
Преимущества:
- Автоматическая синхронизация в реальном времени.
- Поддержка нескольких сайтов.
- Легко интегрируется с REST API.
Недостаток — требует настройки API и определенных навыков программирования.
Как создать собственное решение для синхронизации ролей и прав
Если готовые плагины не подходят или хочется контролировать процесс, можно написать собственный скрипт для экспорта и импорта ролей. Для этого воспользуемся функциями WordPress для работы с ролями: get_role(), add_role(), remove_role() и get_editable_roles().
Экспорт ролей в JSON
Для начала нам нужно получить все роли и их права, а затем сохранить их в JSON-файл, который можно передать на другой сайт.
function wpsync_export_roles_to_json() {
if ( ! current_user_can('administrator') ) {
return;
}
$roles = get_editable_roles();
$export = [];
foreach ( $roles as $role_name => $role_info ) {
$export[$role_name] = $role_info['capabilities'];
}
$json = json_encode($export, JSON_PRETTY_PRINT);
file_put_contents(WP_CONTENT_DIR . '/roles-export.json', $json);
}
// Запускайте функцию вручную или добавьте вызов через admin hook
Этот код создаст файл roles-export.json в папке wp-content с описанием всех ролей и их capabilities.
Импорт ролей из JSON
Теперь рассмотрим функцию, которая будет читать JSON-файл и создавать/обновлять роли на целевом сайте.
function wpsync_import_roles_from_json() {
if ( ! current_user_can('administrator') ) {
return;
}
$file = WP_CONTENT_DIR . '/roles-export.json';
if ( ! file_exists($file) ) {
return;
}
$json = file_get_contents($file);
$roles = json_decode($json, true);
if ( ! is_array($roles) ) {
return;
}
// Удаляем все кастомные роли перед импортом
global $wp_roles;
foreach ( $wp_roles->roles as $role_name => $role_info ) {
if ( ! in_array($role_name, ['administrator','editor','author','contributor','subscriber']) ) {
remove_role($role_name);
}
}
foreach ( $roles as $role_name => $capabilities ) {
// Если роль существует, обновляем capabilities
if ( get_role($role_name) ) {
$role = get_role($role_name);
foreach ( $capabilities as $cap => $granted ) {
if ( $granted ) {
$role->add_cap($cap);
} else {
$role->remove_cap($cap);
}
}
} else {
// Создаем новую роль
add_role($role_name, ucfirst(str_replace('_', ' ', $role_name)), $capabilities);
}
}
}
// Запускайте функцию вручную или через admin hook
Этот код очищает предыдущие кастомные роли и создает новые согласно JSON-файлу, что гарантирует идентичность ролей на разных сайтах.
Настройка автоматической синхронизации ролей
Для удобства можно объединить экспорт и импорт в API-запросы или использовать cron-задачи для периодической синхронизации.
Например, на одном сайте можно создать endpoint REST API, который будет отдавать JSON с ролями:
add_action('rest_api_init', function () {
register_rest_route('wpsync/v1', '/roles', [
'methods' => 'GET',
'callback' => 'wpsync_api_get_roles',
'permission_callback' => function () {
return current_user_can('administrator');
}
]);
});
function wpsync_api_get_roles() {
$roles = get_editable_roles();
$export = [];
foreach ($roles as $role_name => $role_info) {
$export[$role_name] = $role_info['capabilities'];
}
return $export;
}
На другом сайте можно создать функцию, которая будет обращаться к этому API и обновлять роли:
function wpsync_fetch_and_update_roles() {
$response = wp_remote_get('https://example.com/wp-json/wpsync/v1/roles', [
'headers' => [
'Authorization' => 'Basic ' . base64_encode('user:password')
]
]);
if ( is_wp_error($response) ) {
return;
}
$roles = json_decode(wp_remote_retrieve_body($response), true);
if ( ! is_array($roles) ) {
return;
}
// Аналогично импортуем роли
global $wp_roles;
foreach ( $wp_roles->roles as $role_name => $role_info ) {
if ( ! in_array($role_name, ['administrator','editor','author','contributor','subscriber']) ) {
remove_role($role_name);
}
}
foreach ( $roles as $role_name => $capabilities ) {
if ( get_role($role_name) ) {
$role = get_role($role_name);
foreach ( $capabilities as $cap => $granted ) {
if ( $granted ) {
$role->add_cap($cap);
} else {
$role->remove_cap($cap);
}
}
} else {
add_role($role_name, ucfirst(str_replace('_', ' ', $role_name)), $capabilities);
}
}
}
// Рекомендуется запускать эту функцию по расписанию через wp-cron
Советы и рекомендации по безопасности
Синхронизация ролей — это мощный инструмент, но он требует аккуратности. Не забывайте:
- Ограничивать доступ к API только надежным администраторам или по IP.
- Использовать защищённое соединение HTTPS.
- Регулярно делать бэкапы базы данных перед изменениями ролей.
- Тестировать изменения на тестовом сайте перед применением в продакшене.
Также учитывайте, что удаление ролей может привести к потере доступа пользователей, поэтому будьте внимательны при автоматическом удалении кастомных ролей.
Заключение
Синхронизация пользовательских ролей и прав — важная задача для администраторов нескольких WordPress-сайтов. Использование готовых плагинов упрощает процесс, но собственные решения дают гибкость и контроль. В статье мы рассмотрели основные подходы, показали примеры кода для экспорта, импорта и автоматической синхронизации через REST API.
Если вы хотите настроить синхронизацию ролей в своем проекте, начните с простого экспорта/импорта, а затем постепенно добавляйте автоматизацию и безопасность.