我写了一个功能,比如超级管理员可以将用户帐户置于“暂停”状态。我必须确保将其帐户挂起的用户帐户无法登录。这里的问题是,如果用户的帐户仍处于保留状态,则用户可以登录。我正在使用一个名为“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”挂钩中获取暂停消息?
最合适的回答,由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_password 和
wp_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