Вопрос или проблема
Когда новый сайт создается в моей мультисайтовой установке, я автоматически добавляю нового пользователя на основной сайт (потому что мне нужен этот пользователь для заказа товара):
add_user_to_blog( 1, $user_id, 'customer' );
Я хотел бы, чтобы пользователи автоматически входили на все свои сайты, как только они войдут на один из сайтов, к которым относятся.
Я надеялся привязаться к действию wp_login
и просто установить auth_cookie
для каждого сайта, к которому принадлежит пользователь, что-то вроде этого:
add_action('wp_login','autologin');
function autologin($user_login, $user) {
$user_blogs = get_blogs_of_user($user->ID);
foreach ($blogs as $blog) {
switch_to_blog($blog->blog_id);
wp_set_current_user ( $user->ID );
wp_set_auth_cookie ( $user->ID);
restore_current_blog();
}
}
Тем не менее, это не работает. Есть ли решение для этого?
Вы можете автоматически добавлять каждого пользователя на каждый сайт в вашей сети. Например, вот простая функция для добавления идентификатора пользователя к идентификатору блога. Вы можете пройти по всем сайтам и добавить пользователя к каждому блогу с указанной ролью.
function join_site( $user_id = 0, $blog_id = 0, $role="editor" ) {
if ( 0 === $user_id )
return false;
if ( 0 === $blog_id )
return false;
if ( ! is_user_logged_in() )
return false;
if ( ! is_user_member_of_blog( $user_id, $blog_id ) )
add_user_to_blog( $blog_id, $current_user->ID, $role );
}
Вы можете запустить эту функцию при регистрации пользователя или также при входе. При регистрации это менее затратно по производительности, только один запрос после регистрации, а не при каждом входе. Но функция проверяет, является ли пользователь частью плагина с помощью is_user_member_of_blog()
.
Преимуществом является то, что каждый пользователь является полноценной частью блога, возможно, с разными ролями. Результат заключается в том, что у вас есть все возможности, также для других плагинов, для выполнения функций пользователей.
Для входа вам следует установить постоянную переменную для определения всегда одного и того же cookie.
define( 'COOKIE_DOMAIN', '' );
Это даст пользователям возможность входить на каждый сайт сети, если пользователь добавлен к сайту. Для получения дополнительной информации в этом контексте смотрите этот вопрос/ответ.
Ответ или решение
Чтобы автоматизировать процесс входа пользователей на все сайты в сети WordPress Multisite после их входа на одном из этих сайтов, вы можете использовать следующие подходы:
1. Добавление пользователя к каждому блогу
Для начала, вы можете использовать вспомогательную функцию, которая будет добавлять нового пользователя к каждому блогу с определенной ролью. Это делается один раз, когда пользователь регистрируется или добавляется, а не при каждом входе, что экономит ресурсы.
Вот пример функции, которую вы можете использовать:
function join_site( $user_id = 0, $blog_id = 0, $role = "editor" ) {
if ( 0 === $user_id || 0 === $blog_id ) {
return false;
}
if ( ! is_user_logged_in() ) {
return false;
}
// Добавляем пользователя к блогу, если он еще не добавлен
if ( ! is_user_member_of_blog( $user_id, $blog_id ) ) {
add_user_to_blog( $blog_id, $user_id, $role );
}
}
2. Вызов функции при регистрации или входе
Вы можете вызывать эту функцию в нужных вам хуках, например, при регистрации пользователя или при его входе. Например, если хотите добавить пользователя к другим блогам при регистрации, используйте следующий код:
add_action( 'wp_signup_new_user', 'add_user_to_multisite', 10, 1 );
function add_user_to_multisite( $user_id ) {
$sites = get_sites();
foreach ( $sites as $site ) {
join_site( $user_id, $site->blog_id, 'editor' ); // Замените 'editor' на нужную роль
}
}
3. Установка куки для сети
Чтобы пользователи могли авторизовываться на всех сайтах без повторного ввода пароля, вы должны установить общие куки для всей сети. Это делается через файл wp-config.php
. Добавьте следующую строку:
define( 'COOKIE_DOMAIN', '' );
Это позволит пользователю оставаться авторизованным на всех сайтах, к которым он был добавлен.
4. Автоматический вход при входе на один из сайтов
Этот метод не является прямым решением проблемы автоматического входа, так как в WordPress пока нет встроенного способа делать это «из коробки» для нескольких сайтов одновременно. Однако вы можете настроить wp_login
хук, чтобы убедиться, что пользователи входят в системы.
add_action('wp_login', 'autologin');
function autologin($user_login, $user) {
$user_blogs = get_blogs_of_user($user->ID);
foreach ($user_blogs as $blog) {
switch_to_blog($blog->blog_id);
wp_set_current_user($user->ID);
wp_set_auth_cookie($user->ID);
restore_current_blog();
}
}
Имейте в виду, что использование этого кода может создаст нежелательные эффекты при работе с плагинами, которые зависят от процесса аутентификации, поэтому рекомендуется тщательно тестировать это решение.
Заключение
С упомянутыми методами вы сможете автоматически добавлять пользователей на разные сайты в вашей сети Multisite и поддерживать их авторизацию во всех сайтах. Оптимизируйте решение согласно вашим требованиям и тестируйте его в разных сценариях, чтобы убедиться, что оно работает корректно и эффективно.