Как синхронизировать пользовательские роли и права в WordPress между сайтами

Управление пользовательскими ролями и правами — одна из ключевых задач при администрировании 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.

Если вы хотите настроить синхронизацию ролей в своем проекте, начните с простого экспорта/импорта, а затем постепенно добавляйте автоматизацию и безопасность.

Как сделать свойства пользователя в WordPress через пользовательские мета-поля
03.04.2026
Как синхронизировать WooCommerce между сайтами WordPress
08.12.2025
Как запретить загрузку внешних iframe в WordPress для безопасности сайта
18.02.2026
Как сделать свойства пользователя в WordPress без плагинов
15.02.2026
Как избежать ошибок при синхронизации WooCommerce атрибутов между сайтами WordPress
27.05.2026