Не удается отобразить сообщение об ошибке с помощью действия входа в wp
Моя цель - показать сообщение об ошибке, когда я проверяю, заблокирован пользователь или нет, проблема в том, что, когда функция завершается, она перенаправляется на страницу, которая должна появиться после успешного входа в систему. Цели:
- Проверьте, заблокирован ли пользователь "решен"
- Если это так, создайте сообщение об ошибке
- Отобразите сообщение об ошибке на странице, которая должна появиться после успешного входа в систему.
Вот соответствующий код, который у меня есть на данный момент:
function userLockedControl($user_login, $user) {
$sitesManager = \VirtualReal\Web\SitesManager::getInstance();
$vrapi = \VirtualReal\NATS\VRAPI::getInstance();
$nats_user_locked = $vrapi->get("xxxxxxxxxxxxxxxxx");
$user_is_locked = $nats_user_locked["locked"];
//$lock_message = "<div class='natsLoginError'><span>Dear user, Your account has been blocked because an strange behaviour. Please, contact with [email protected]</span></div>";
if($user_is_locked == 0){
//Cerrar sesion del usuario y mostrar el mensaje de error
function doer_of_stuff() {
return new WP_Error( 'broke', __( "I've fallen and can't get up", "my_textdomain" ) );
}
$return = doer_of_stuff();
if( is_wp_error( $return ) ) {
echo $return->get_error_message();
}
}
}
add_action('wp_login', 'userLockedControl', 10, 2);
2 answers
Основная проблема с вашим кодом заключается в том, что вы используете действие wp_login
. Крючок действия wp_login запускается, когда пользователь входит в систему с помощью функции wp_signon()
. Это самое последнее действие, выполняемое в функции, сразу после вызова wp_set_auth_cookie()
.
Итак, прежде всего - пользователь уже аутентифицирован, и его файл cookie аутентификации уже установлен - так что он в основном вошел в систему.
Другая проблема заключается в том, что ваше действие вызывается до того, как будет напечатан какой-либо HTML-код, поэтому, если вы повторяете что-либо в нем, то это вывод будет напечатан перед открытием тега <html>
.
Если вы хотите запретить пользователю входить в систему и отображать некоторые ошибки, вам следует использовать authenticate
вместо этого отфильтруйте.
Он вызывается во время аутентификации пользователя:
/**
* Filters whether a set of user login credentials are valid.
*
* A WP_User object is returned if the credentials authenticate a user.
* WP_Error or null otherwise.
*
* @since 2.8.0
* @since 4.5.0 `$username` now accepts an email address.
*
* @param null|WP_User|WP_Error $user WP_User if the user is authenticated.
* WP_Error or null otherwise.
* @param string $username Username or email address.
* @param string $password User password
*/
$user = apply_filters( 'authenticate', null, $username, $password );
Таким образом, вы можете использовать его следующим образом:
function userLockedControl( $user, $username, $password ) {
// ... rest of your code here
if ($user_is_locked == 0 ) {
return new WP_Error( 'broke', __( "I've fallen and can't get up", "my_textdomain" ) ); // you don't need all those functions returning errors and so one - just return an instance of the WP_Error instead of WP_User
}
}
add_filter( 'authenticate', 'userLockedControl', 10, 3 );
Решено, вместо этого лучше использовать фильтр wp_authenticate_user, потому что он используется для выполнения дополнительной проверки/аутентификации каждый раз, когда пользователь входит в WordPress. Это было как раз то, что мне было нужно, потому что я хотел запретить вход в систему, если мое условие было ложным, добавив дополнительную проверку. Это функциональный код:
function userLockedControl( $user, $password ) {
require 'config.php';
$sitesManager = \VirtualReal\Web\SitesManager::getInstance();
$vrapi = \VirtualReal\NATS\VRAPI::getInstance();
$nats_user_locked = $vrapi->get("xxxx");
$user_is_locked = $nats_user_locked["locked"];
$lock_message = "Dear user, Your account has been blocked because an strange behaviour. Please, contact with [email protected]";
if ($user_is_locked == 0 ) {
return new WP_Error( 'broke', __( $lock_message, "my_textdomain" ) );
}
return $user;
}
add_filter( 'wp_authenticate_user', 'userLockedControl', 10, 2 );