Не удается отобразить сообщение об ошибке с помощью действия входа в wp


Моя цель - показать сообщение об ошибке, когда я проверяю, заблокирован пользователь или нет, проблема в том, что, когда функция завершается, она перенаправляется на страницу, которая должна появиться после успешного входа в систему. Цели:

  1. Проверьте, заблокирован ли пользователь "решен"
  2. Если это так, создайте сообщение об ошибке
  3. Отобразите сообщение об ошибке на странице, которая должна появиться после успешного входа в систему.

Вот соответствующий код, который у меня есть на данный момент:

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);
Author: Jose Manuel Lascasas Jimenez, 2019-03-15

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 );
 1
Author: Krzysiek Dróżdż, 2019-03-15 14:54:22

Решено, вместо этого лучше использовать фильтр 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 );
 0
Author: Jose Manuel Lascasas Jimenez, 2019-03-20 10:06:09