Вопрос или проблема
Я работаю над настройкой многосайтовой среды и столкнулся с возможной ситуацией, когда пользователь пытается зарегистрироваться на подсайте с тем же адресом электронной почты, который он использовал на основном сайте. Я нашел код здесь, который устраняет ошибку дублирования адреса электронной почты и выполняет эту задачу.
Вот соответствующий код из ответа по ссылке выше:
add_filter('wpmu_validate_user_signup', 'skip_email_exist');
function skip_email_exist($result){
if(isset($result['errors']->errors['user_email']) && ($key = array_search(__('Извините, этот адрес электронной почты уже используется!'), $result['errors']->errors['user_email'])) !== false) {
unset($result['errors']->errors['user_email'][$key]);
if (empty($result['errors']->errors['user_email'])) unset($result['errors']->errors['user_email']);
}
define( 'WP_IMPORTING', 'SKIP_EMAIL_EXIST' );
return $result;
}
Разница в моем случае заключается в том, что мы разрешаем пользователям регистрироваться только через покупку WooCommerce на подсайте и, очевидно, WooCommerce не использует те же хуки для валидации адреса электронной почты.
Существует ли действие, к которому я могу подключиться, чтобы выполнить ту же функциональность через WooCommerce?
Есть возможность не позволять пользователю регистрироваться на основном сайте, разрешая регистрироваться только на подсайте. Плагин network-subsite-user-registration позволяет это сделать, если пользователь уже зарегистрирован в сети, то он автоматически добавляется плагином на сайт, запрашивающий регистрацию. Хук, который это делает – ‘wpmu_validate_user_signup’..
// проверка и добавление пользователей, если они уже в сети
add_filter( 'wpmu_validate_user_signup', 'add_exting_user' );
/**
* Если пользователи уже зарегистрированы в сети, просто добавьте их
* на этот новый сайт.
*
* @return $result или выдает ошибку
*/
function add_exting_user( $result ) {
if ( is_user_logged_in() ) {
return $result;
}
$submitted_user_email = $result['user_email'];
$original_error = $result['errors'];
foreach( $original_error->get_error_codes() as $code ){
foreach( $original_error->get_error_messages( $code ) as $message ){
if( $code != 'user_email' && $message == __( 'Извините, это имя пользователя уже существует!') ){
$user = get_user_by( 'email', $submitted_user_email );
$user_id = $user->ID;
$blog_id = get_current_blog_id();
add_user_to_blog( $blog_id, $user_id, get_site_option( 'default_user_role', 'subscriber' ) );
$user_blogs = get_blogs_of_user( $user_id );
$user_blogs_sorted = array();
foreach ( $user_blogs AS $user_blog ) {
$user_blogs_sorted[ $user_blog->blogname ] = $user_blog->siteurl;
}
// Быстрый способ сделать нечувствительную к регистру сортировку массива, индексированного строками:
uksort($user_blogs_sorted , "strnatcasecmp");
$html = "<h1>";
$html .= sprintf( __('Привет %1$s, вы были добавлены на этот сайт, ваши текущие сайты в сети:', 'network-subsite-user-registration' ), "<strong>$submitted_user_email</strong>" );
$html .= "</h1></Br><ul>";
foreach ( $user_blogs_sorted AS $sitename => $siteurl ) {
if ( ! is_main_site( $user_blog->userblog_id ) ) {
$html .= '<li><h2><strong><a href="' . wp_login_url($siteurl ) . '" target="_blank" >' . $sitename . '</a></strong></h2></li>';
}
}
$html .= "</ul>";
die( $html );
}
}
}
return $result;
}
Ответ или решение
Позвольте пользователям регистрироваться на многосайтовой платформе через WooCommerce с использованием одного и того же адреса электронной почты
В процессе настройки многосайтового окружения WordPress, одной из основных задач является управление пользователями, которые пытаются зарегистрироваться на под-сайте с адресом электронной почты, уже использованным на главном сайте. Данная проблема может быть решена с помощью необходимых хуков и фильтров в WordPress, но стоит учитывать, что WooCommerce использует свои собственные механизмы для валидации данных пользователей.
Проблема
Стандартное поведение WordPress не позволяет двум пользователям регистрироваться с одинаковыми адресами электронной почты. Однако в условиях многосайтовой сети может потребоваться, чтобы один и тот же пользователь имел возможность зарегистрироваться на разных под-сайтах, не теряя доступ к своему уже созданному аккаунту. WooCommerce, в свою очередь, имеет свою логику регистрации пользователей, которая не использует те же хуки, что и стандартные механизмы WordPress.
Решение
Одним из самых простых решений является использование хука woocommerce_register_post
, который отвечает за обработку данных регистрации пользователей в WooCommerce. Давайте рассмотрим, как можно модифицировать этот процесс, чтобы разрешить регистрацию с использованием одного и того же адреса электронной почты.
Пример кода
add_action('woocommerce_register_post', 'allow_duplicate_email_registration', 10, 3);
function allow_duplicate_email_registration($username, $email, $validation_errors) {
// Проверяем, существует ли уже пользователь с данной электронной почтой
if (email_exists($email)) {
// Убираем ошибку "Email уже используется"
if (isset($validation_errors->errors['billing']['billing_email'])) {
unset($validation_errors->errors['billing']['billing_email']);
}
}
return $validation_errors;
}
Как это работает
-
Хук
woocommerce_register_post
– Он вызывается при попытке регистрации нового пользователя. Обработчик функции получает имя пользователя, электронный адрес и объект с ошибками валидации. -
Проверка существования электронной почты – Функция
email_exists()
помогает определить, существует ли уже пользователь с данным адресом электронной почты. Если это так, то мы удаляем ошибку валидации, связанную с использованием данного адреса. -
Обработка валидационных ошибок – После удаления ошибки пользователю будет разрешено зарегистрироваться с тем же адресом электронной почты, что и у него на главном сайте.
Дополнительные рекомендации
-
Обработка существующих пользователей: Если пользователь зарегистрирован в главной сети, можно перенаправить его на страницу входа в систему, где он сможет использовать тот же адрес электронной почты для входа в систему на под-сайте.
-
Информирование пользователей: Настоятельно рекомендуется уведомлять пользователей о том, что они могут использовать один и тот же адрес электронной почты на разных под-сайтах, чтобы минимизировать путаницу.
-
Тестирование: Перед внедрением изменений обязательно протестируйте новый процесс регистрации на тестовом сайте, чтобы убедиться, что все работает корректно.
Заключение
Разрешение регистрации с использованием одного и того же адреса электронной почты в многосайтовой сети WooCommerce требует небольших модификаций в коде. Приведенный код демонстрирует, как можно использовать существующие хуки для обхода стандартного поведения WordPress, что позволяет обеспечить удобство для пользователей. Пожалуйста, протестируйте решение в безопасной среде перед его развертыванием на живом сайте.
При правильной настройке ваша многосайтовая установка будет соответствовать современным требованиям бизнеса и пользовательскому опыту, что, безусловно, положительно скажется на удовлетворенности клиентов.