web-dev-qa-db-fra.com

comment restreindre la connexion de l'utilisateur à chaque fois qu'un utilisateur est mis en attente en modifiant l'action de wp-login?

J'ai écrit une fonctionnalité telle que super admin peut mettre des comptes d'utilisateurs en "attente". Je dois m'assurer que le compte d'utilisateur qui a mis son compte en attente ne peut pas se connecter. Le problème ici est que l'utilisateur peut se connecter si son compte est toujours en attente. J'utilise un champ "méta utilisateur personnalisé" appelé "holdUser" pendant que le super administrateur met un utilisateur en attente. Pendant la connexion de l'utilisateur, j'utilise l'action wp-login de wordpress, comment modifier l'action wp-login afin qu'un utilisateur ne puisse pas se connecter sur la base d'un méta-champ utilisateur personnalisé dans wordpress. Alors que le compte utilisateur est mis en attente, je mets à jour la "méta utilisateur" comme ci-dessous:

if(isset($_GET['user_id']) && ($_GET['action']=='hold'))
{
  update_user_meta( $_GET['user_id'], 'holdUser',1 );
  wp_mail($email_to, $subject, $content,$headers);
}

Mon formulaire de connexion a le code suivant:

<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>

Ma question ici est de savoir comment éditer le hook 'wp-login.php' basé sur un champ user_meta 'holdUser' si sa valeur est 1 alors ne pas connecter cet utilisateur.?

Mise à jour: j'ai écrit un crochet séparé si la connexion de l'utilisateur échoue, comme ci-dessous:

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;
  }
}

comment puis-je obtenir ce message en attente à partir du crochet 'on_hold_error'?

1
Prasad Patel
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);

La priorité doit être 21, car wp_authenticate_username_password et wp_authenticate_email_password sont prioritaires 20. Ils renvoient un objet du type WP_User s'ils peuvent authentifier l'utilisateur. Donc, si l'utilisateur est authentifié, vérifiez s'il est en attente. Si c'est le cas, affichez une erreur à l'utilisateur.

Edit: pourquoi n'utilisez-vous pas le formulaire de connexion par défaut?

0
P1nGu1n

Utilisez le filtre wp_authenticate_user et renvoyez un WP_Error pour arrêter la connexion.

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;
}

(mettez ce qui précède dans le functions.php de votre thème)

De plus, je pense que vous devrez peut-être donner votre élément de formulaire name="loginform", pour que WordPress puisse le détecter et le traiter comme le formulaire de connexion natif WP et déclencher tous les mêmes points d'ancrage, mais vous n'êtes pas sûr de le ce.

PS: Il est recommandé d'utiliser wp_login_form() pour créer votre formulaire de connexion personnalisé, car vous obtiendrez d'autres fonctionnalités telles qu'un moyen simple de spécifier une URL de redirection. https://codex.wordpress.org/Function_Reference/wp_login_form

0
Dan.