如果用户通过编辑wp-登录操作暂停登录,如何限制用户登录?

时间:2016-11-29 作者:Prasad Patel

我写了一个功能,比如超级管理员可以将用户帐户置于“暂停”状态。我必须确保将其帐户挂起的用户帐户无法登录。这里的问题是,如果用户的帐户仍处于保留状态,则用户可以登录。我正在使用一个名为“holdUser”的“自定义用户元”字段,而超级管理员将用户置于挂起状态。当用户登录时,我正在使用wordpress的wp登录操作,如何编辑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登录”。php“hook”基于user\\u元字段“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\\u hold\\u error”挂钩中获取暂停消息?

2 个回复
最合适的回答,由SO网友:P1nGu1n 整理而成

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_passwordwp_authenticate_email_password 优先级为20。它们返回以下类型的对象WP_User 如果他们可以对用户进行身份验证。因此,如果用户经过身份验证,请检查他是否处于等待状态。如果是,则向用户显示一个错误。

编辑:为什么不使用默认登录表单?

SO网友:Dan.

使用wp_authenticate_user 过滤并返回aWP_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