§ 29. Come «potenziare» le password degli articoli su WordPress

L’autore, il redattore o l’amministratore di un sito realizzato con il WordPress può proteggere con una password qualsiasi articolo, pagina o altro tipo di pubblicazione. Più o meno tutti gli utenti del WordPress sanno come eseguire questa operazione-base, ma, per rendere completo il presente paragrafo, inizio riassumendola brevemente.
Se per la pubblicazione e la modifica dei vostri articoli e pagine utilizzate l’editor a blocchi (quello introdotto con la versione 5.0 del WordPress), bisogna sulla pagina di modifica della pubblicazione e selezionare la voce «Stato e visibilità» nel menu a destra. Quindi cliccare sul link «Pubblico» collocato vicino alla voce «Visibilità», scegliere l’opzione «Protetto da password», inserire la password che si vuole e premere l’invio sulla tastiera. Infine, cliccare sul buttone «Aggiorna».

Se, invece, state ancora utilizzando l’editor classico (è possibile mantenerlo anche sulle versioni recenti del WordPress), bisogna andare sulla pagina di modifica della pubblicazione, cliccare sul link «modifica» collocato vicino alla voce «Visibilità» (nel menu a destra), scegliere l’opzione «Protetto da password», poi cliccare su «OK» e «Aggiorna».

Dal momento in cui è stata impostata la password, il visitatore vedrà, al posto della pagina della pubblicazione protetta con la password, solo questo:

Sempre dallo stesso momento, il contenuto e il riassunto di quella pubblicazione scompariranno da tutte le possibili pagine del sito (per esempio, dalla pagina principale e dalle pagine dei vari elementi della tassonomia). Ma è comunque possibile rendere visualizzabile il riassunto della pubblicazione protetta e, volendo, modificare il testo di tale riassunto (per farlo comparire comunque dove serve). In questo ultimo compito ci aiuta il codice da inserire nel file functions.php del nostro tema: si veda – più in basso – il punto 4 del presente paragrafo.
Inoltre, la password può essere impostata o modificata nella sezione «modifica rapida» di ogni pubblicazione. Per farlo, bisogna trovare l’articolo o la pagina da proteggere nella lista delle pubblicazioni e cliccare sul rispettivo link, appunto, chiamato «modifica rapida». Con l’editor a blocchi si inserisce la password e poi si clicca su «Aggiorna»:

Sull’editor classico l’operazione è altrettanto semplice:

Oltre alle nozioni banali appena elencate, i semplici utenti devono sapere anche alcune altre cose sulle password delle pubblicazioni:
– le password vengono registrate sul database (tabella wp_posts) in un formato non criptato;
– la lunghezza massima di una password è di 20 caratteri, quella minima è di 1 carattere;
– dopo l’accesso a una pubblicazione tramite l’inserimento della password, questa ultima viene memorizzata nei cookies, quindi non bisognerà inserirla dopo ogni reload della pagina. Inoltre, funzionerà allo stesso modo per tutte le altre pubblicazioni protette con la stessa password;
– nei cookies viene memorizzata solo una password, quindi vi rimarrà l’ultima inserita;
– se una password dovesse essere modificata, bisogna inserire quella nuova per accedere alla pagina protetta.
E ora, finalmente, andiamo a vedere come è possibile rendere una password più utile e funzionale.
1. Come proteggere i campi meta della pagina con la password?
Per default, la protezione offerta dalla password non si estende ai campi personalizzati. Bisogna quindi proteggerli inserendo la funzione post_password_required() nel file functions.php del tema utilizzato:

if ( ! post_password_required() ) {
    // mostriamo il valore di un campo solo se la protezione viene rimossa
    echo 'Indirizzo: ' . get_post_meta( get_the_ID(), 'addr', true );
}

2. Come cambiare il tempo di memorizzazione della password?
Per default, la password inserita dall’utente per accedere a un articolo o una pagina viene memorizzata per 10 giorni. È possibile modificare la lunghezza di questo periodo utilizzando il filtro post_password_expires:

add_filter( 'post_password_expires', 'true_change_pass_exp', 25 );
 
function true_change_pass_exp( $exp ){
	return time() + 5 * DAY_IN_SECONDS; // per esempio, 5 giorni (ora corrente + 5 giorni)
}

3. Come si fa a modificare la form per l’inserimento della password?
L’internet è pieno di soluzioni perverse, mentre in realtà è inutile complicarsi la vita:

add_filter( 'the_password_form', 'true_new_post_pass_form' ); // aggiungiamo la funzione al filtro the_password_form
 
function true_new_post_pass_form() {
	/*
	 * in sostanza, bisogna essere attenti a tre aspetti:
	 * 1) a cosa si riferisce la form e method=post
	 * 2) il valore dell'attributo name del campo di inserimento della password - post_password
	 * 3) gli attributi size e maxlength del campo di inserimento della password devono essere inferiori o uguali a 20 (si veda la lunguezza massima di una password indicata in precedenza)
	 * Per il resto avete la piena liberta di azione!
	 */
	return '<form action="' . site_url( 'wp-login.php?action=postpass', 'login_post' ) . '" method="post">
	<input name="post_password" type="password" size="20" placeholder="Password articolo" maxlength="20" />
	<input type="submit" name="Submit" value="Accedere" />
	</form>';
}

4. Come si fa a cambiare il testo del riassunto dell’articolo protetto con una password?
Per cambiarlo e renderlo visualizzabile possiamo servirci della funzione post_password_required e del filtro the_excerpt:

add_filter( 'the_excerpt', 'true_protected_excerpt_text' );
 
function true_protected_excerpt_text( $excerpt ) {
	if ( post_password_required() ) {
		$excerpt = '<em>[Articolo protetto da una password. Per accedere contatti gli amministratori del sito.]</em>';
	}
	return $excerpt; // se un articolo non e protetto, mostriamo la citazone standard
}

5. Come si fa a nascondere completamente tutti gli articoli (e pagine) protetti con delle password?
A questo scopo è possibile utilizzare il filtro pre_get_posts (è importante specificare che il suo utilizzo non comporta dei problemi nella navigazione tra le pagine):

/*
 * Una piccola modifica alla query SQL che riceve gli articoli
 */
function true_exclude_pass_posts( $where ) {
	global $wpdb;
	return $where .= " AND {$wpdb->posts}.post_password = '' "; 
}
 
/*
 * Usiamo questo filtro per determinare su quali pagine verranno nascosti gli articoli protetti
 */
add_action( 'pre_get_posts', 'true_where_to_exclude' );
 
function true_where_to_exclude( $query ) {
	if( is_home() || is_archive() ) {
		add_filter( 'posts_where', 'true_exclude_pass_posts' );
	}
}

Ecco, questo è tutto ciò che avevo da comunicarvi sull’argomento. Almeno per ora.
Spero di avere risolto qualche vostro problema!