Можно ли подключиться к процессу регистрации пользователя *до* его создания?
Я хочу ограничить регистрацию в зависимости от домена, связанного с их email-адресом. Я рассматривал хук user_register
, но он срабатывает после того, как пользователь уже создан, что, хотя и можно заставить работать, далеко не идеально. Я хочу предотвращать регистрацию, а не удалять недопустимых пользователей задним числом.
Я изучил исходный код в wp-includes/user.php
, но ничего полезного там не нашел. Я заметил фильтр pre_user_email
, но он, похоже, не предоставляет возможностей для выполнения чего-то полезного, так как я не вижу способа что-то с ним сделать.

Вы ищете не в том месте.
Когда пользователь впервые пытается зарегистрироваться, его имя пользователя и email обрабатываются и очищаются внутри функции register_new_user()
в файле wp-login.php
. Именно здесь вам нужно выполнять фильтрацию.
Перед созданием пользователя WordPress передаст очищенные логин пользователя, адрес электронной почты и массив ошибок через действие 'register_post'. Если после этого есть какие-либо ошибки, пользователь не будет добавлен, и он увидит ошибки в интерфейсе.
Следующая непроверенная функция может помочь:
function prevent_email_domain( $user_login, $user_email, $errors ) {
if ( strpos( $user_email, '@baddomain.com' ) != -1 ) {
$errors->add( 'bad_email_domain', '<strong>ОШИБКА</strong>: Этот домен электронной почты не разрешён.' );
}
}
add_action( 'register_post', 'prevent_email_domain', 10, 3 );

В чем разница между фильтром "registration_errors" и действием "register_post"?

Это зависит от того, создаете ли вы свою собственную форму регистрации, где реализуете процесс регистрации пользователя, или используете стандартную форму регистрации WordPress.
Если вы используете первый вариант, ограничений нет, так как у вас будет доступ к данным POST
, и вы сами будете отвечать за вызов функций wp_insert_user()
или wp_create_user()
, а также за проверку корректности обязательных данных, таких как имя пользователя, email и т.д.
Во втором случае (при использовании стандартной формы WordPress) нужно использовать хук register_post
. Этот хук находится в файле wp-login.php
, внутри функции register_new_user()
.
/**
* Фрагмент кода...
*/
} elseif ( email_exists( $user_email ) ) {
$errors->add( 'email_exists', __( '<strong>ОШИБКА</strong>: Этот email уже зарегистрирован, пожалуйста, выберите другой.' ) );
}
do_action( 'register_post', $sanitized_user_login, $user_email, $errors );
$errors = apply_filters( 'registration_errors', $errors, $sanitized_user_login, $user_email );
/** остальной код после... **/
