как ограничить вход пользователя в систему всякий раз, когда пользователь приостанавливает действие, редактируя действие wp-login?
Я написал такую функцию, как суперадминистратор, который может ставить учетные записи пользователей на "удержание". Я должен убедиться, что учетная запись пользователя, которая заблокировала его учетную запись, не может войти в систему. Проблема здесь в том, что пользователь может войти в систему, если его учетная запись все еще заблокирована. Я использую поле "пользовательские мета-данные пользователя" под названием "Удерживающий пользователь", в то время как суперадминистратор переводит пользователя в режим ожидания. Во время входа пользователя я использую действие wp-входа wordpress, как отредактировать действие wp-входа, чтобы пользователь не мог войти в систему на основе пользовательское мета-поле пользователя в wordpress. Пока учетная запись пользователя заблокирована, я обновляю "мету пользователя", как показано ниже:
if(isset($_GET['user_id']) && ($_GET['action']=='hold'))
{
update_user_meta( $_GET['user_id'], 'holdUser',1 );
wp_mail($email_to, $subject, $content,$headers);
}
Моя форма входа в систему имеет следующий код:
<form method="post" action="'.$this->SiteUrl.'wp-login.php">
<input type="text" id="user_login" name="log">
<input type="password" name="pwd">
<button target="" class="submit">Login</button>
</form>
Мой вопрос здесь заключается в том, как редактировать'wp-login.php "зацепить на основе поля user_meta "Holduser", если его значение равно 1, то не входить в систему этого пользователя.?
Обновление: Я написал отдельный хук, если не удается войти в систему пользователя, как показано ниже:
add_action( 'wp_login_failed', 'my_front_end_login_fail' );
function my_front_end_login_fail( $username ) {
$referrer = $_SERVER['HTTP_REFERER'];
if( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') )
{
if ( !strstr($referrer,'/?actiont=failed') )
{
wp_redirect( $referrer . '/?actiont=failed&message=authentication-failed' );
}
else
{
wp_redirect( $referrer );
}
exit;
}
}
Как я могу получить это сообщение на удержании с крючка "on_hold_error"?
2 answers
function myplugin_authenticate_on_hold($user)
{
// username and password are correct
if ($user instanceof WP_User) {
$on_hold = get_user_meta($user->ID, 'is_on_hold', true);
if ($on_hold) {
return new WP_Error('on_hold_error', 'You are on hold');
}
}
return $user;
}
add_filter('authenticate', 'myplugin_authenticate_on_hold', 21);
Приоритет должен быть 21, так как wp_authenticate_username_password
и wp_authenticate_email_password
имеют приоритет 20. Они возвращают объект типа WP_User
, если они могут аутентифицировать пользователя. Поэтому, если пользователь аутентифицирован, проверьте, находится ли он в режиме ожидания. Если это так, покажите пользователю ошибку.
Изменить: почему вы не используете форму входа по умолчанию?
Используйте фильтр wp_authenticate_user
и верните WP_Error
, чтобы остановить вход в систему.
add_filter( 'wp_authenticate_user', 'my_theme_authenticate_user', 1 );
function my_theme_authenticate_user( $user ) {
if ( is_wp_error( $user ) ) {
return $user;
}
$on_hold = get_user_meta($user->ID, 'holdUser', true );
if ( (int)$on_hold == 1) {
return new WP_Error( 'get lost' );
}
return $user;
}
(поместите вышесказанное в свою тему functions.php)
Кроме того, я думаю, что вам, возможно, потребуется указать свой элемент формы name="loginform"
, чтобы WordPress мог использовать его и относиться к нему так же, как к родной форме входа в WP, и запускать все те же крючки, но не уверен в этом.
PS: Рекомендуется использовать wp_login_form()
для создания пользовательской формы входа, так как вы получите другие функции, такие как простой способ указания перенаправления URL-адрес. https://codex.wordpress.org/Function_Reference/wp_login_form