Работа с мультисайтом WordPress часто требует синхронизации различных пользовательских данных между сайтами сети. Особенно это важно, если на каждом сайте пользователи имеют разные настройки профиля, метаданные или персональные параметры, которые должны оставаться актуальными и консистентными во всей сети.
Зачем нужна синхронизация пользовательских настроек в мультисайте
В мультисайте WordPress каждый сайт хранит свои данные отдельно, включая пользовательские метаданные и настройки. Это значит, что при изменении настроек на одном сайте, они не обновляются автоматически на остальных. Если ваша задача — обеспечить единообразие пользовательского опыта или централизованное управление настройками, необходимо реализовать механизм синхронизации.
Например, если у вас в сети несколько магазинов на WooCommerce, и вы хотите, чтобы настройки профиля клиента, его адреса, предпочтения и другие данные были доступны на всех сайтах без разрывов, синхронизация обязательна.
Основные подходы к синхронизации пользовательских настроек
1. Использование глобальных пользовательских таблиц и метаданных
WordPress мультисайт хранит данные пользователей в единой таблице wp_users, но метаданные пользователей хранятся в wp_usermeta каждой подсети. Для синхронизации можно использовать центральную таблицу метаданных или создавать пользовательские таблицы, доступные для всех сайтов.
Однако такой подход требует серьезных доработок и может нарушить логику мультисайта, поэтому часто его избегают.
2. Реализация кросс-сайтовой синхронизации через хуки и REST API
Более гибкий и современный способ — настроить обмен данными между сайтами через REST API и хуки WordPress. При изменении пользовательских настроек на одном сайте, отправлять данные на остальные.
Это позволяет обеспечить обновление данных в реальном времени или по расписанию, без прямого вмешательства в базу данных.
3. Использование плагинов для синхронизации
Существуют плагины, которые упрощают задачу синхронизации пользовательских данных в мультисайте. Например, Clearfy Pro имеет функции для управления кэшированием и оптимизации, которые можно адаптировать для синхронизации настроек. Также есть специализированные решения, которые можно доработать под свои нужды.
Практическая реализация синхронизации пользовательских метаданных через REST API
Рассмотрим пример, как реализовать синхронизацию пользовательских метаданных между сайтами мультисайта с помощью REST API и хуков.
Регистрация REST API эндпоинта для приема данных
add_action('rest_api_init', function () {
register_rest_route('wpsync/v1', '/user-meta-sync', array(
'methods' => 'POST',
'callback' => 'wpsync_handle_user_meta_sync',
'permission_callback' => function () {
return current_user_can('manage_network');
},
));
});
function wpsync_handle_user_meta_sync(WP_REST_Request $request) {
$user_id = $request->get_param('user_id');
$meta = $request->get_param('meta');
if (empty($user_id) || empty($meta) || !is_array($meta)) {
return new WP_Error('invalid_data', 'Некорректные данные', array('status' => 400));
}
foreach ($meta as $key => $value) {
update_user_meta($user_id, sanitize_text_field($key), sanitize_text_field($value));
}
return rest_ensure_response(array('status' => 'success'));
}Этот код создает REST API маршрут /wp-json/wpsync/v1/user-meta-sync, который принимает POST-запрос с ID пользователя и массивом метаданных для обновления.
Отправка данных при обновлении пользователя
Теперь нужно отловить момент, когда пользователь обновляет свои настройки, и отправить эти данные на остальные сайты сети.
add_action('profile_update', 'wpsync_send_user_meta_to_network', 10, 2);
function wpsync_send_user_meta_to_network($user_id, $old_user_data) {
$meta_keys = array('custom_setting_1', 'custom_setting_2'); // нужные мета ключи
$meta = array();
foreach ($meta_keys as $key) {
$meta[$key] = get_user_meta($user_id, $key, true);
}
$sites = get_sites(array('network_id' => 1)); // получить все сайты сети
foreach ($sites as $site) {
$url = get_site_url($site->blog_id) . '/wp-json/wpsync/v1/user-meta-sync';
wp_remote_post($url, array(
'body' => json_encode(array(
'user_id' => $user_id,
'meta' => $meta,
)),
'headers' => array('Content-Type' => 'application/json'),
'timeout' => 5,
));
}
}Этот код при обновлении профиля пользователя собирает нужные метаданные и отправляет их на REST API каждого сайта сети.
Обработка безопасности и оптимизация
При реализации синхронизации важно учитывать безопасность данных. Рекомендуется использовать авторизацию при вызове REST API, например, через OAuth или JWT. В примере выше стоит добавить проверку nonce или API ключей.
Также стоит контролировать нагрузку на сервер, чтобы массовая синхронизация не приводила к задержкам. Можно выполнять отправку данных асинхронно через WP-Cron или внешние очереди.
Альтернативные плагины для синхронизации пользовательских данных
Если хочется упростить задачу без собственного кода, можно рассмотреть плагины:
- WP Remote Users Sync — синхронизирует пользователей и метаданные между сайтами мультисайта.
- User Synchronization — позволяет переносить пользователей между сайтами с сохранением метаданных.
- Multisite User Sync/Unsync — добавляет возможность легко синхронизировать пользователей между сайтами.
Эти плагины можно дополнить собственным кодом для синхронизации именно нужных пользовательских настроек.
Выводы и рекомендации
Синхронизация пользовательских настроек в мультисайте WordPress — задача нетривиальная, но решаемая с помощью REST API, хуков и специальных плагинов. При этом важно продумать архитектуру, безопасность и производительность.
Реализуя свои функции синхронизации, используйте префиксы wpsync_ для функций и классов, чтобы избежать конфликтов.
Для расширения функционала можно интегрировать синхронизацию с плагинами оптимизации, такими как Clearfy Pro, которые помогут оптимизировать работу мультисайта при обмене данными.