Funzione WordPress per forzare l'utente al cambio password al primo login

← ritorno a WordPress

Introduzione

Questo articolo descrive come implementare manualmente una funzione che al primo login di un utente, gli proponga di cambiare la password.

Fonte: https://www.avyatech.com/force-users-change-password-first-login-wordpress/

1. Registrare il campo meta 'force_login'

Registrazione della variabile che indica che l'utente deve cambiare la propria password

Nel file function.php del tema

 
//
// Azione per richiedere il reset della password alla registrazione
//
add_action( 'user_register', 'force_login_meta_update', 10, 1 );
function force_login_meta_update( $user_id ) {
	update_user_meta($user_id, 'force_reset_password', 1);
}

2. Template per la pagina di reset

Creare il template da utilizzare per la pagina di reset della password, che nel nostro caso chiameremo template-pwdreset.php

<?php
/** 
 * Template Name: Password Reset Form 
 */ 
global $wpdb, $current_user; 

get_header();

echo '<h2>Reset Password</h2>';

// errore
if( !empty( get_query_var('rp-err') ) ) {
	$errore = null;
	if( get_query_var('rp-err') == 'nl' )
		$errore = '<div class="error">Utente non loggato.</div>';
	if( get_query_var('rp-err') == '2p' )
		$errore = '<div class="error">Le password non corrispondono.</div>';
	if( !empty( $errore ) ) {
		echo '<div class="woocommerce">'
			.'<ul class="woocommerce-error" role="alert">'
			.'<li><strong>Errore:</strong> '.$errore.'</li>'
			.'</ul>'
			.'</div>';		
	}
}

get_currentuserinfo(); 
$user_ID  = $current_user->ID;
if ($user_ID) { 
	//show only to logged in users
	$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;
	} 
	?>
	
	<form class="form-horizontal user_form" id="wp_reset_password" method="post" action="<?php echo esc_url( get_bloginfo('url') . "/reset-password" ); ?>">
		
		<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
			<label for="resetnewpass">Nuova password <span class="required">*</span></label>
			<input class="form-control" value="" name="resetnewpass" id="resetnewpass" type="password" />
		</p>
		
		<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
			<label for="restnewcpass">Conferma password <span class="required">*</span></label>
			<input class="form-control" value="" name="restnewcpass" id="restnewcpass" type="password" />
		</p>

	<div class="form-group"><div class="col-sm-offset-3 col-sm-9 col-xs-12"><div class="formbtn">
	  <input type="submit" id="resetsubmitbtn" class="newreset_password" name="submit" value="Aggiorna Password">
	  </div>
	</div></div></form>
	<?php
}

get_footer(); 

3. Creare la pagina di reset

Creare una pagina di nome "Reset Password" che utilizza il template Password Reset Form.

Di default viene assegnato un indirizzo univoco a questa pagina, in questo esempio .../reset-password.

4. Redirect alla pagina di reset al login

Nel file function.php inserire il codice che esegue il redirect alla pagina di reset se l'utente loggato deve resettarsi la password.

//
// Redirect al login nel caso l'utente debba cambiare password
//
function redirect_passwort_login_redirect( $user_login, $user ) {
 	if( isset( $user->ID ) ) {
		$changed_password = get_metadata("user", $user->ID, "force_reset_password",true);
		$url = get_bloginfo('url');
		if( $changed_password == 1 ) {
		  	$url = get_bloginfo('url') . "/reset-password";
			wp_redirect( $url );
			exit;
		}
 	}
}
add_action('wp_login', 'redirect_passwort_login_redirect', 10, 2);

Nota bene: controllare bene l'indirizzo della pagina di reset creata e inserirlo di conseguenza, in questo caso /reset-password.

5. Codice per resettare la password

Una volta confermato il form di reset della password, è necessario catturare l'azione ed eseguire il reset.

Ecco il codice che lo fa, in functions.php:

//
// Catturo la conferma della form RESET PASSWORD 
// Le traduzioni degli errori sono presenti nella pagina di reset password 
// 
if( $_SERVER['REQUEST_URI'] == "/reset-password" && array_key_exists( 'resetnewpass', $_POST )
  			&& array_key_exists( 'restnewcpass', $_POST ) ) {
  	$redirect_url = get_bloginfo('url') . "/reset-password";
	if( !isset( $user_ID ) || empty( $user_ID ) ) {
		wp_redirect( esc_url( add_query_arg( 'rp-err', 'nl', $redirect_url ) ) );
		exit;
	}
	if( $_POST['resetnewpass'] != $_POST['restnewcpass'] ) {
		wp_redirect( esc_url( add_query_arg( 'rp-err', '2p', $redirect_url ) ) );
		exit;
	}
	
	wp_update_user( array( 'ID' => $user_ID, 'user_pass' => $_POST['resetnewpass'] ) );
	
	update_user_meta( $user_ID, 'force_reset_password', 0 );
	
	wp_redirect( esc_url( get_bloginfo('url') ) );
	exit;
}

6. Passaggio dei messaggi di errore

Se la password viene cambiata con successo, si viene riportati alla home page, in caso contrario si viene riportati alla pagina di reset, con un mesasggio di errore.

Per far trasparire il messaggio di errore, viene passato un codice alla url tramite la variabile rp-err, che la pagina poi identificherà e mostrerà.

Per far passare questa variabile inserire queste righe

// Aggiungo la variabile in GET per passare un eventuale errore 
function add_query_vars_filter( $vars ){
  $vars[] = "rp-err";
  return $vars;
}
add_filter( 'query_vars', 'add_query_vars_filter' );

Per i dettagli: Utilizzo e passaggio di variabili GET in WordPress

7.

Per aggiungere la possibilità di impostare l'attributo meta dell'utente inserire questo codice:

// Aggiungo la possibilita' di impostare l'attributo (metadata) all'utente tramite REST API 
register_meta('user', 'force_reset_password', [
    'type' => 'string',
    'single' => true,
    'show_in_rest' => true, // <-- Importante
]);

Per i dettagli: Abilitare la modifica dei meta data dell'utente tramite REST API

fonte: https://www.avyatech.com/force-users-change-password-first-login-wordpress/