Pages protégées par mot de passe, modèle de page et personnalisation

Pour un projet j’ai dû jouer un peu avec la fonction bien pratique, native dans WordPress, des pages protégées par un mot de passe.

Comment activer la protection

Lock iconCa se passe dans la partie Publier des pages et articles. C’est une option de Visibilité. Cliquez sur Modifier et vous pouvez alors choisir trois visibilités : Public, protégé par un mot de passe et privé. Si vous choisissez protégé par un mot de passe il vous est demandé de choisir un mot de passe. Une fois celui ci choisi, il ne reste plus qu’à cliquer sur Ok et mettre à jour votre article ou page.

Modèle de page

Ma page était une page un peu particulière car elle affichait une liste de produits. Les produits étant des custom post type. En fait, si je n’avais pas eu besoin de protéger cette page par un mot de passe j’aurais utilisé le template d’archive de mon custom post type. Tout ça pour dire qu’après avoir créé mon modèle de page et l’avoir assigné à ma page protégée, la protection ne marchait plus. Bizarre.
J’ai donc entrepris quelques recherches sur comment marche cette protection et comment je pourrais la faire marcher dans mon modèle de page.
Il s’avère que cette protection filtre la fonction get_the_content(). Si le mot de passe n’a pas été rentré elle change le contenu par un formulaire, sinon la fonction renvoie bien le contenu de la page.
Mon problème c’est que je n’utilise pas cette fonction car j’affiche tout autre chose dans sur cette page. Heureusement, j’ai trouvé la fonction qui me permet de faire ce que je veux post_password_required() c’est cette fonction qui fait la vérification que le mot de passe a bien été renseigné par le visiteur. Je l’utilise donc comme suit :

if( post_password_required() ){
    the_content();
} else {
  //Mon super affichage personalisé
}
Capture du formulaire par défaut pour les pages protégé par mot de passe
Formulaire par défaut pour les pages protégé par mot de passe

Filtrer le titre pour enlever le « Protégé »:

Comme toujours avec WordPress il s’agit de trouver le bon filtre, voilà celui qui marche et comment l’utiliser

function remove_private_title( $title ) {
    // Return only the title portion as defined by %s, 
    // not the additional
    // 'Private: ' as added in core
    return "%s";
}
add_filter( 'protected_title_format', 'remove_private_title' );

Modifier le formulaire

Encore une fois il s’agit de jouer avec un filtre WordPress

function custom_password_prompt($content) {
  $output = $content . 'Et oui je suis protégé et personnalisé'; 
  return $output; 
} 
add_filter('the_password_form', 'custom_password_prompt');

L’idée ici est de créer une chaine de caractère à retourner contenant le code HTML. IL ne faut pas faire d’affichage. Si vous ne voulez pas du tout utliser le contenu créé par WordPress vous devez juste créer au minimum un formulaire comme ceci pour que l’enregistrement du mot de passe fonctionne.

$output = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" method="post">
    <input name="post_password" type="password" />
    <input type="submit" name="Submit" value="ok" />
</form> ';

Vous pouvez y ajouter ce que vous voulez mais il faut garder les « name » des inputs et les réglages du form

Sources