Forcer le changement de mot de passe à la première connexion

  • WordPress :4.9.8
  • Statut : non résolu
2 sujets de 1 à 2 (sur un total de 2)
  • Auteur
    Messages
  • #2231581
    halloy
    Participant
    Initié WordPress
    41 contributions

    Bonjour,

    Soit un site où les utilisateurs seront inscrits via import d’un csv et recevront par mail un identifiant et un mot de passe provisoire.

    Lors de leur première connexion, après avoir entré ces données, une page s’ouvre, si c’est leur première visite, pour leur faire modifier ce mot de passe. C’est une page personnalisée et non la page de profil habituelle.
    Après avoir changé le mot de passe, ils devraient être redirigés en fonction de leur « rôle » sur l’une ou l’autre page du site.

    J’ai cherché un plugin mais n’en ai pas trouvé qui ne passe pas par la page de profil. J’ai donc trouvé ce code  .que j’ai dû un peu aménager car j’avais des erreurs

    Donc j’ai créé un modèle de page avec le code suivant :

    <?php  /* Template Name: Password Reset Form */  
    global $wpdb, $current_user; get_currentuserinfo(); $user_ID  = $current_user->ID;
    $redirect_url = $_GET['redirect_to'];
    $check_val   = 'wp-admin';
    $pos = strpos($redirect_url, $check_val);
    if ($pos === false) {
     $redirect_url = $_GET['redirect_to'];
    } else {
    $site_url = get_site_url();
     $redirect_url = $site_url;
    } 
    ?>
    
    <h1 style="display:none;"><?php the_title(); ?></h1>
    
    
    
    
    <form class="form-horizontal user_form" id="wp_reset_password" action="" method="post">
    <input type="hidden" value="<?php echo $user_ID; ?>" name="userid">
     <input type="hidden" value="<?php echo $redirect_url; ?>" name="redirect_to" id="redirect_to">
         
    <div class="resetpassword-error"></div>
     
      
    <div class="form-group">
    <label class="control-label col-sm-3 col-xs-12" >Nouveau mot de passe :</label>
     
    <div class="col-sm-9 col-xs-12">
      <input class="form-control" value="" name="resetnewpass" id="resetnewpass" type="password">
    </div>
     
     </div>
     
      
    <div class="form-group">
    <label class="control-label col-sm-3 col-xs-12" >Confirmer le nouveau mot de passe :</label>
     
    <div class="col-sm-9 col-xs-12">
      <input class="form-control" value="" name="restnewcpass" id="restnewcpass" type="password">
    </div>
     
     </div>
     
      
    <div class="form-group">
      
    <div class="col-sm-offset-3 col-sm-9 col-xs-12">
      
    <div class="formbtn">
      <input type="hidden" value="resetpwd" name="action">
     <?php wp_nonce_field( 'resetpwd', 'resetpassword' ); ?>
      <input type="submit" id="resetsubmitbtn" class="newreset_password" name="submit" value="Mise à jour du mot de passe" />
      </div>
     
       
    <div class="regwaiting" style="display:none;"></div>
     
     </div>
    </div>
    </div>
    </form>

    Puis j’ai créé une page avec le modèle, quand je l’appelle, elle s’affiche (brute de béton pour le moment)

    Ensuite dans functions.php, j’ai rajouté le code suivant :

    /*Forcer modif mdp a la première connexion*/
    /* on ajoute un champ force_login_meta  quand l'utilisateur se connecte au site*/
    add_action( 'user_register', 'force_login_meta_update', 10, 1 );
    function force_login_meta_update( $user_id ) {
    update_user_meta($user_id, 'force_login', 1);
    }
    /*l'user est redirigé vers la page de modification de mot de passe */
    function redirect_passwort_login_redirect($redirect_to, $url_redirect_to = '', $user = null) {
        
     if(isset($user->ID) ) {
    $changed_password = get_metadata("user", $user->ID, "force_login",true);
    if( $changed_password == 1 ) {
      return get_bloginfo('url') . "/nouveau-mot-de-passe";
    } else {
      return get_bloginfo('url');
    }
     }
     return $redirect_to;
    }
    add_filter('login_redirect', 'redirect_passwort_login_redirect',10,3);
    
    /*le mot de passe est réinitialisé*/
    // reset password update
    add_action('wp_ajax_nopriv_resetpwd', 'resetpwd');
    // add action for logged in user
    add_action('wp_ajax_resetpwd','resetpwd');
    add_action('admin_post_nopriv_resetpwd', 'resetpwd');
     
    function resetpwd(){
     global $wpdb, $user_ID;
     $error  = array();
     $id = $_POST['userid'];
     $new_password = $_POST['restnewcpass'];
     if (!isset( $_POST['resetpassword'] )  || ! wp_verify_nonce( $_POST['resetpassword'], $_POST['action'] ) ) {
      $error[] = 'Please refresh your page and then update';
     } else {
    $userdata['ID'] = $id; //admin user ID
      $userdata['user_pass'] = $new_password;
      wp_update_user( $userdata );
     
    update_metadata("user",$id,"force_login",0);
    echo json_encode(array('type' => 'success', 'message' => "
     
    Your password is updated successfully
     
    "));
    die;
     }
     
     if(sizeof($error)>0){
    echo json_encode(array('type' => 'error', 'message' => implode("
    ", $error)));
    die;
     }
    }

    Ensuite, je teste : j’arrive sur la page avec le pavé de connexion, je rentre les identifiants temporaires, la page de modification de mdp s’ouvre. Je change le mot de passe, la page se recharge, et je suis toujours sur la page de changement de mot de passe.

    Par rapport au code d’origine, j’ai dû modifier la ligne

    return get_bloginfo('url') . "/reset-password/?redirect_to=".$redirect_to;

    en

    return get_bloginfo('url') . "/nouveau-mot-de-passe;

     

    qui est le nom de la page appelant le modèle, parce que sinon l’url de la redirection me ramenait à la page d’accueil.
    J’ai aussi essayé en donnant une valeur à $redirect_to = « url complète » mais je revenais aussi sur la page d’accueil.

     

    Ca fait 24h que je m’arrache les cheveux, alors je viens voir si quelqu’un peut me dire ce qui cloche.

     

    Par la suite, j’aimerais créer un shortcode pour intégrer le formulaire de changement de mot de passe dans une page construite avec Elementor (comme j’ai fait pour le pavé de connexion)

     

    L’url est hsbc.kamilane.odns.fr. L’id de l’user est 2 et le mot de passe 123456 (user de test, bien sûr)
    Un tout grand merci d’avance à qui voudra bien m’éclairer de ses lumières !

    Pour le moment il n’y a que le pavé Collaborateur qui est réglé.

    #2233383
    halloy
    Participant
    Initié WordPress
    41 contributions

    Petit up please. J’ai finalement tenté avec le plugin Force change password pour voir comment il fonctionne. Mais il ouvre la page profile.php pour changer le mot de passe alors que je souhaite afficher la page créée pour cela, ne contenant que les cases pour mettre à jour le mot de passe.
    Quelqu’un aurait une idée ?
    Merci !

2 sujets de 1 à 2 (sur un total de 2)
  • Vous devez être connecté pour répondre à ce sujet.