Позвольте пользователям регистрироваться на мультисайте через WooCommerce, используя один и тот же адрес электронной почты.

Вопрос или проблема

Я работаю над настройкой многосайтовой среды и столкнулся с возможной ситуацией, когда пользователь пытается зарегистрироваться на подсайте с тем же адресом электронной почты, который он использовал на основном сайте. Я нашел код здесь, который устраняет ошибку дублирования адреса электронной почты и выполняет эту задачу.

Вот соответствующий код из ответа по ссылке выше:

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;
}
Как это работает
  1. Хук woocommerce_register_post – Он вызывается при попытке регистрации нового пользователя. Обработчик функции получает имя пользователя, электронный адрес и объект с ошибками валидации.

  2. Проверка существования электронной почты – Функция email_exists() помогает определить, существует ли уже пользователь с данным адресом электронной почты. Если это так, то мы удаляем ошибку валидации, связанную с использованием данного адреса.

  3. Обработка валидационных ошибок – После удаления ошибки пользователю будет разрешено зарегистрироваться с тем же адресом электронной почты, что и у него на главном сайте.

Дополнительные рекомендации

  • Обработка существующих пользователей: Если пользователь зарегистрирован в главной сети, можно перенаправить его на страницу входа в систему, где он сможет использовать тот же адрес электронной почты для входа в систему на под-сайте.

  • Информирование пользователей: Настоятельно рекомендуется уведомлять пользователей о том, что они могут использовать один и тот же адрес электронной почты на разных под-сайтах, чтобы минимизировать путаницу.

  • Тестирование: Перед внедрением изменений обязательно протестируйте новый процесс регистрации на тестовом сайте, чтобы убедиться, что все работает корректно.

Заключение

Разрешение регистрации с использованием одного и того же адреса электронной почты в многосайтовой сети WooCommerce требует небольших модификаций в коде. Приведенный код демонстрирует, как можно использовать существующие хуки для обхода стандартного поведения WordPress, что позволяет обеспечить удобство для пользователей. Пожалуйста, протестируйте решение в безопасной среде перед его развертыванием на живом сайте.

При правильной настройке ваша многосайтовая установка будет соответствовать современным требованиям бизнеса и пользовательскому опыту, что, безусловно, положительно скажется на удовлетворенности клиентов.

Оцените материал
Добавить комментарий

Капча загружается...