web-dev-qa-db-fra.com

Forcer l'utilisateur à changer son mot de passe lors de la première connexion au site à l'aide d'un shortcode

Je travaille sur un WP 4.9.8 et suis à la recherche d'un script pour forcer les utilisateurs à modifier leur mot de passe lors de leur première consultation du site. C'est un site Web d'entreprise, les utilisateurs sont ajoutés par l'importation d'un fichier csv avec fausse adresse électronique. L'email ne peut pas être changé.

Le formulaire pour changer le mot de passe doit être dans une page, il ne peut s'agir de la page profile.php.

J'ai trouvé le code de Simon Blackbourn ( https://github.com/lumpysimon/wp-force-password-change ) mais:

  • le formulaire est dans un modèle de page et je souhaite un shortcode pour l'afficher dans une page créée avec Elementor. Je ne sais pas comment créer ce shortcode
  • le formulaire est bien affiché à la première connexion mais rien ne se passe après le soumettre.
  • la redirection après l'envoi réussi doit être une autre page en fonction du rôle de l'utilisateur (j'ai créé 3 rôles d'utilisateur: responsable national, responsable d'agence et personnel). J'ai installé la redirection de rôle de Peter (si je me souviens bien du nom du plugin)

J'ai trouvé un plugin sur le site Web WP mais il ouvre la page profile.php (Forcer le changement du mot de passe).

J'ai trouvé le code de la page pippinsplugins ( https://pippinsplugins.com/change-password-form-short-code/ ) qui affiche le formulaire avec le shortcode.

Mais je ne sais pas comment faire avec eux pour faire ce dont j'ai besoin. Merci beaucoup et désolé si je ne suis pas très compréhensible, je suis française ;-)


Je pense que je vais devenir fou :-( Rien ne fonctionne. La page de connexion est une page personnalisée avec un shortcode affichant le formulaire. 1. La redirection avec le plug-in Forcer le changement de mot de passe ne fonctionne pas. Elle ne fonctionne que si la redirection de Peter est activée. le lien vers la page pour changer le mot de passe. J'essaie différemment. Si je n'ai plus d'erreur, ce n'est pas bon. L'utilisateur est connecté, mais n'est pas redirigé vers la page de modification du mot de passe, c'est toujours la page avec le formulaire à connectez-vous. Le dernier test que j'ai fait concerne le plug-in Force Change Password en ajoutant des lignes après wp_get_current_user ():

function force_password_change_redirect() {

    global $current_user;

    if ( is_admin() ) {
        $screen = get_current_screen();
        if ( 'profile' == $screen->base )
            return;
        if ( 'plugins' == $screen->base )
            return;
    }

    if ( !is_user_logged_in() )
        return;

    wp_get_current_user();
if( isset($user->ID) ) {
     $changed_password = get_user_meta( $current_user->ID, 'force-password-change', true ) ;
  if( $changed_password == true ) {
        return get_site_url('/changement-mdp/');
        } else {
         return $redirect_to;
       }
        }
}
  1. J'ai ajouté une ligne dans le code Pippin pour supprimer l'usermeta force-password-change après la modification, mais cela ne fonctionne pas. Pas d'erreur mais je vois toujours cette meta_key et sa valeur dans la base de données

    if (empty ($ errors)) {// change le mot de passe ici $ user_data = array ('ID' => $ user_ID, 'user_pass' => $ _POST ['pippin_user_pass']); wp_update_user ($ user_data); delete_user_meta ($ user_id, 'force-password-change', 1); // envoie le courrier électronique de modification du mot de passe ici (si WP ne l'est pas) wp_redirect (add_query_arg ('réinitialisation du mot de passe', 'true', $ _POST ['pippin_redirect'])); sortie; }

  2. La redirection après le changement de mot de passe ne fonctionne pas. Le mot de passe est changé mais je reviens sur la page pour changer le mot de passe.

J'ai installé la redirection de Peter pour rediriger les utilisateurs par son rôle. Comment faire pour le rediriger APRÈS avoir changé son mot de passe et pas avant?

Merci pour l'aide je suis complètement perdu!


Edit 19 décembre

Je cherche toujours une solution. J'ai essayé de modifier le plugin Force Change Password en ajoutant le code de pippinplugins. Mais il y a certainement beaucoup d'erreurs parce que j'ai une page blanche sur le front-end et sur l'admin. Pourriez-vous m'aider à trouver les erreurs?

Merci beaucoup

<?php
/*
Plugin Name:  Force Password Change
Description:  Require users to change their password on first login.
Version:      0.6
License:      GPL v2 or later
Plugin URI:   https://github.com/lumpysimon/wp-force-password-change
Author:       Simon Blackbourn
Author URI:   https://Twitter.com/lumpysimon
Author Email: [email protected]
Text Domain:  force-password-change
Domain Path:  /languages/



About this plugin
-----------------

This plugin redirects newly-registered users to the Admin -> Edit Profile page when they first log in.
Until they have changed their password, they will not be able to access either the front-end or other admin pages.
An admin notice is also displayed informing them that they must change their password.

New administrators must also change their password, but as a safety measure they can also access the Admin -> Plugins page.

Please report any bugs on the WordPress support forum at http://wordpress.org/support/plugin/force-password-change or via GitHub at https://github.com/lumpysimon/wp-force-password-change/issues

Development takes place at https://github.com/lumpysimon/wp-force-password-change (all pull requests will be considered)



About me
--------

I'm Simon Blackbourn, co-founder of Lumpy Lemon, a small & friendly UK-based
WordPress design & development company specialising in custom-built WordPress CMS sites.
I work mainly, but not exclusively, with not-for-profit organisations.

Find me on Twitter, Skype & GitHub: lumpysimon



License
-------

Copyright (c) Lumpy Lemon Ltd. All rights reserved.

Released under the GPL license:
http://www.opensource.org/licenses/gpl-license.php

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.



*/



$force_password_change = new force_password_change;



class force_password_change {



// just a bunch of functions called from various hooks
function __construct() {

    add_action( 'init',                    array( $this, 'init' ) );
    add_action( 'user_register',           array( $this, 'registered' ) );
    add_action( 'personal_options_update', array( $this, 'updated' ) );
    add_action( 'template_redirect',       array( $this, 'redirect' ) );
    add_action( 'current_screen',          array( $this, 'redirect' ) );
    add_action( 'admin_notices',           array( $this, 'notice' ) );

}



// load localisation files
function init() {

    load_plugin_textdomain(
        'force-password-change',
        false,
        dirname( plugin_basename( __FILE__ ) ) . '/languages'
        );

}



// on ajoute un champ meta dans la table users_meta avec la valeur 1 lors de l'enregistrement
function registered( $user_id ) {

    add_user_meta( $user_id, 'force-password-change', 1 );

}
    // on efface cette valeur quand le mot de passe a été changé
function updated( $user_id ) {

    if($_POST['pippin_user_pass'] == $_POST['pippin_user_pass_confirm']) {

    delete_user_meta( $user_id, 'force-password-change' );
    }
}

/*shortcode pour modifier le mdp*/
function pippin_change_password_form() {
global $post;

if (is_singular()) :
    $current_url = get_permalink($post->ID);
else :
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") $pageURL .= "s";
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
    else $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    $current_url = $pageURL;
endif;
if(empty($errors)){
$redirect = home_url();}
else {
$redirect = $current_url;}

ob_start();

    // afficher les éventuelles erreurs lors de la saisie du nouveau mot de passe
    pippin_show_error_messages(); ?>

    <?php if(isset($_GET['password-reset']) && $_GET['password-reset'] == 'true') { ?>
        <div class="pippin_message success">
            <span><?php _e('Password changed successfully', 'rcp'); ?></span>
        </div>
    <?php } ?>
    <form id="pippin_password_form" method="POST" action="<?php echo esc_url($url); ?>">
        <fieldset>
            <p>
                <label for="pippin_user_pass"><?php _e('New Password', 'rcp'); ?></label>
                <input name="pippin_user_pass" id="pippin_user_pass" class="required" type="password"/>
            </p>
            <p>
                <label for="pippin_user_pass_confirm"><?php _e('Password Confirm', 'rcp'); ?></label>
                <input name="pippin_user_pass_confirm" id="pippin_user_pass_confirm" class="required" type="password"/>
            </p>
            <p>
                <input type="hidden" name="pippin_action" value="reset-password"/>
                <input type="hidden" name="pippin_redirect" value="<?php echo $redirect; ?>"/>
                <input type="hidden" name="pippin_password_nonce" value="<?php echo wp_create_nonce('rcp-password-nonce'); ?>"/>
                <input id="pippin_password_submit" type="submit" value="<?php _e('Change Password', 'pippin'); ?>"/>
            </p>
        </fieldset>
    </form>
<?php
return ob_get_clean();
}

// le formulaire de modification de mot de passe
function pippin_reset_password_form() {
if(is_user_logged_in()) {
    return pippin_change_password_form();
}
}
add_shortcode('password_form', 'pippin_reset_password_form');


// si:
// - on est loggé,
// - le champ meta est présent pour cet utilisateur,
// - on est sur le front-end ou n'importe quel écran sauf la page d'édition de profil ou plugins,
// alors on redirige vers la page de changement de mot de passe (modif code Force Password Change)
function force_password_change_redirect() {

    global $current_user;

    if ( is_admin() ) {
        $screen = get_current_screen();
        if ( 'profile' == $screen->base )
            return;
        if ( 'plugins' == $screen->base )
            return;
    }

    if ( !is_user_logged_in() )
        return;

    wp_get_current_user();

     $changed_password = get_user_meta( $current_user->ID, 'force-password-change', true ) ;
  if( $changed_password == true ) {
        return get_site_url('/changement-mdp/');
        } else {
         return $redirect_to;
       }

}

function pippin_reset_password() {
// reset a users password
if(isset($_POST['pippin_action']) && $_POST['pippin_action'] == 'reset-password') {

    global $user_ID;

    if(!is_user_logged_in())
        return;

    if(wp_verify_nonce($_POST['pippin_password_nonce'], 'rcp-password-nonce')) {

        if($_POST['pippin_user_pass'] == '' || $_POST['pippin_user_pass_confirm'] == '') {
            // password(s) field empty
            pippin_errors()->add('password_empty', __('Please enter a password, and confirm it', 'pippin'));
        }
        if($_POST['pippin_user_pass'] != $_POST['pippin_user_pass_confirm']) {
            // passwords do not match
            pippin_errors()->add('password_mismatch', __('Passwords do not match', 'pippin'));
        }

        // retrieve all error messages, if any
        $errors = pippin_errors()->get_error_messages();

        if(empty($errors)) {
            // change the password here
            $user_data = array(
                'ID' => $user_ID,
                'user_pass' => $_POST['pippin_user_pass']
            );
    delete_user_meta( $user_id, 'force-password-change',1 );
            wp_update_user($user_data);

            // send password change email here (if WP doesn't)
            wp_redirect(add_query_arg('password-reset', 'true', $_POST['pippin_redirect']));
            exit;
        }
    }
}
}
add_action('init', 'pippin_reset_password');

if(!function_exists('pippin_show_error_messages')) {
// displays error messages from form submissions
function pippin_show_error_messages() {
    if($codes = pippin_errors()->get_error_codes()) {
        echo '<div class="pippin_message error">';
            // Loop error codes and display errors
           foreach($codes as $code){
                $message = pippin_errors()->get_error_message($code);
                echo '<span class="pippin_error"><strong>' . __('Error', 'rcp') . '</strong>: ' . $message . '</span><br/>';
            }
        echo '</div>';
    }
}
}

if(!function_exists('pippin_errors')) {
// used for tracking error messages
function pippin_errors(){
    static $wp_error; // Will hold global variable safely
    return isset($wp_error) ? $wp_error : ($wp_error = new WP_Error(null, null, null));
}
}
// if the user meta field is present, display an admin notice
function notice() {

    global $current_user;

    wp_get_current_user();

    if ( get_user_meta( $current_user->ID, 'force-password-change', true ) ) {
        printf(
            '<div class="error"><p>%s</p></div>',
            __( 'Please change your password in order to continue using this website', 'force-password-change' )
            );
    }

}



} // class

Merci de votre aide !

1
user2898349

Vous avez déjà presque tout ce dont vous avez besoin (en supposant que les plugins ci-dessus que vous avez listés fonctionnent). Il vous suffit de les lier:

  1. Activer pippins changer le mot de passe plug-in et créer une page avec le shortcode correspondant. Vérifiez que cette page permet à un utilisateur connecté de changer son mot de passe. Notez l'URL de la page et ne le changez pas.
  2. Maintenant, éditez le plugin wp-force-password-change (ou vérifiez s’il permet de spécifier l’url dans un paramètre). Recherchez la partie où vous spécifiez l'URL à rediriger systématiquement. Vous avez dit que c'est le profile.php? Modifiez cette URL pour qu'elle soit celle de la page que vous avez créée. Enregistrer, télécharger, activer, tester.

Si les deux plugins et cela ressemble à ce que vous décrivez, alors vous devriez le faire.

Il est toujours bon de vérifier qu'une fois qu'un utilisateur a été contraint de changer son mot de passe, lorsqu'il se déconnecte et se reconnecte, il n'est plus obligé de le changer. ;)

1
anmari