无法使用wp_登录操作显示错误消息

时间:2019-03-15 作者:Jose Manuel Lascasas Jimenez

我的目标是在检查用户是否被锁定时显示一条错误消息,问题是当函数结束时,它会重定向到成功登录后必须显示的页面。目标:

检查用户是否已锁定“已解决”,如果已锁定,则创建错误消息,并在成功登录后必须显示的页面中显示错误消息以下是我目前拥有的相关代码:

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 xx@xx.com</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 个回复
最合适的回答,由SO网友:Jose Manuel Lascasas Jimenez 整理而成

解决后,wp\\u authenticate\\u user filter挂钩更好,因为它用于在用户登录WordPress时执行额外的验证/身份验证。这正是我所需要的,因为如果我的条件为false,我想拒绝登录并添加额外的验证。这是功能代码:

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 support@virtualrealporn.com";

    if ($user_is_locked == 0 ) {
        return new WP_Error( \'broke\', __( $lock_message, "my_textdomain" ) );
    }

    return $user;
}
add_filter( \'wp_authenticate_user\', \'userLockedControl\', 10, 2 );

SO网友:Krzysiek Dróżdż

代码的主要问题是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_list_tables bulk actions

如何在扩展的WP\\U List\\U表中触发批量操作。我一直在将以下批量操作添加到may table的选择框中,但在Apply上不会发生任何事情下面是我如何添加批量操作的function get_bulk_actions() { $actions = array( \'delete\' => \'Delete\', \'parsing\' => \'Parsen\' );