Protéger les publications avec un mot de passe

Réglages de visibilité de la publication

Une fois que vous avez mis en ligne une publication sur WordPress, celle-ci est publiquement visible par défaut. Pour WordPress, cela signifie qu’une publication ayant l’état publié a une visibilité par défaut définie sur public. Cela est visible dans les réglages de la boîte de publication de l’Écran de modification des publications.

WordPress propose également deux options permettant de rendre vos publications moins publiques. Si vous cliquez sur le lien « Modifier » à côté de l’option Visibilité : publique, vous verrez trois boutons radio :

  • Publique, qui est sélectionné par défaut.
  • Protégée par mot de passe affichera un champ texte permettant de saisir un mot de passe. Le mot de passe est limité à 20 caractères.
  • Privée permet de ne rendre votre publication visible qu’aux utilisateurs et utilisatrices ayant le rôle Éditeur ou Administrateur.

Quand vous avez fini vos modifications, cliquez sur le bouton « OK ». Les réglages de visibilité seront alors modifiés par exemple par Visibilité : protégé par mot de passe.
Souvenez-vous : une modification de réglage ne prend pas effet tant que vous n’aurez pas cliqué sur le bouton « Publier » (ou « Mettre à jour » si la publication est déjà en ligne).

Retrouver ou modifier un mot de passe

Si vous avez le rôle Administrateur ou Éditeur, vous pouvez connaître le mot de passe attribué à une publication en allant sur l’écran de modification de cette publication puis en cliquant sur l’option de visibilité.

Pour aller plus vite, vous pouvez également utiliser le lien « Modifier » de l’option de visibilité sur l’option de modification rapide dans l’écran de liste des publications.

Publications protégées par mot de passe

WordPress affiche les publications protégées par mot de passe un peu différemment. Voici les changements apportés à vos publications :

  • Titre : ajout du texte « Protégé : » devant le titre de la publication.
  • Extrait : le texte « Il n’y a pas d’extrait car cette publication est protégée » s’affiche à la place de l’extrait.
  • Contenu : un formulaire de saisie de mot de passe s’affiche à la place du contenu de la publication.

Protéger plusieurs publications par mot de passe

WordPress enregistre le mot de passe saisi par les visiteurs dans les cookies de son navigateur, donc ils n’auront pas à le saisir à nouveau s’ils visitent la même page web plusieurs fois. De plus, si plusieurs publications portent le même mot de passe, les visiteurs n’auront pas à saisir le mot de passe à nouveau pour chaque publication (voir la mise en garde ci-après).

WordPress ne trace qu’un seul mot de passe à la fois. Donc si deux publications utilisent deux mots de passe différents et que vous saisissez le mot de passe pour la publication A, puis ensuite pour la publication B, vous devrez ressaisir le mot de passe pour la publication A.

Protection des champs personnalisés

WordPress n’affiche pas le contenu ou l’extrait d’une publication protégée avant que les visiteurs n’aient saisi le bon mot de passe. Cependant, les données des champs personnalisés ne sont pas protégées et peuvent toujorus s’afficher. Pour empêcher les champs personnalisés de s’afficher, vous devez encapsuler vos appels get_post_meta (par exemple dans single.php ou page.php) avec une condition utilisant la fonction : post_password_required. Cette fonction vérifie si à la fois la publication nécessite un mot de passe et si le bon mot de passe a été saisi :

<?php
if ( ! post_password_required() ) {
    // Code pour afficher les champs personnalisés, comme par exemple :
    $key_1_value_1 = get_post_meta( $post->ID, 'key_1', true );
        echo $key_1_value_1;
}
?>

La fonction post_password_required inclue dans une condition est aussi utile pour d’autres personnalisations, comme par exemple pour empêcher les publications protégées par mot de passe de s’afficher dans les listes.

Personnaliser le texte indiquant que la publication est protégée

Avec les filtres WordPress vous pouvez :

  • Modifier le texte par défaut dans le formulaire de saisie de mot de passe.
  • Modifier le texte par défaut remplaçant l’extrait de la publication et par exemple afficher le formulaire de saisie à l’intérieur de l’extrait.

Texte par défaut du formulaire de saisie de mot de passe

Le code suivant permet de modifier le texte et la structure HTML du formulaire de saisie de mot de passe :

<?php
function wporg_my_password_form() {
    global $post;
    $label = 'pwbox-'.( empty( $post->ID ) ? rand() : $post->ID );
    $o = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" method="post">
    Pour voir cette publication, saisissez le mot de passe :
    <label for="' . $label . '">Mot de passe :</label>
    <input name="post_password" id="' . $label . '" type="password" size="20" maxlength="20" /><input type="submit" name="Submit" value="OK" />
    </form>
    ';
    return $o;
}
add_filter( 'the_password_form', 'wporg_my_password_form' );
?>

Veuillez noter que la fonction wporg_my_password_form doit retourner une valeur, vous ne devez pas utiliser de print ou echo à l’intérieur.

Limitation de la taille du mot de passe

Assurez vous d’utiliser l’attribut maxlength="20" sur le champ de mot de passe, car WordPress ne permet pas d’avoir plus de 20 caractères.

Texte de l’extrait de la publication

Exemple de modification de l’extrait pour les publications protégées par mot de passe :

<?php
function wporg_my_excerpt_protected( $excerpt ) {
    if ( post_password_required() )
        $excerpt = '<em>[Protégé par mot de passe]</em>';
    return $excerpt;
}
add_filter( 'the_excerpt', 'wporg_my_excerpt_protected' );
?>

Remplacez <em>[Protégé par mot de passe]</em> par le texte de votre choix.

Ajouter le champ de saisie de mot de passe dans l’extrait

Vous pouvez également choisir d’afficher le formulaire de saisie de mot de passe directement dans l’extrait de la publication :

<?php
function wporg_my_excerpt_password_form( $excerpt ) {
    if ( post_password_required() )
        $excerpt = get_the_password_form();
    return $excerpt;
}
add_filter( 'the_excerpt', 'wporg_my_excerpt_password_form' );
?>

Masquer les publications protégées par mot de passe

Parfois, vous ne voulez pas que vos messages protégés par un mot de passe apparaissent à d’autres endroits de votre site, comme sur la page d’accueil ou les pages d’archives. Pour les cacher efficacement de ces pages sans affecter votre pagination, utilisez le code suivant :

<?php
// Masquer les publications protégées
function wporg_exclude_protected($where) {
	global $wpdb;
	return $where .= " AND {$wpdb->posts}.post_password = '' ";
}

// Choisir les fichiers modèles concernés
function wporg_exclude_protected_action($query) {
	if( !is_single() && !is_page() && !is_admin() ) {
		add_filter( 'posts_where', 'wporg_exclude_protected' );
	}
}

// Ajouter l’action sur le bon crochet d’action
add_action('pre_get_posts', 'wporg_exclude_protected_action');
?>

Ce code fonctionne en deux parties : la première partie retire effectivement toute publication protégée par mot de passe de toutes les requêtes SQL en utilisant le filtre posts_where. La seconde partie ajoute ce filtre sur toutes les pages à part les publications seules et les écrans d’administration.

Pour plus d’informations sur le filtre utilisé, consultez la documentation de l’action pre_get_posts.

Consulter la documentation du filtre post_password_expires.

Traduit par Jb Audras
Relu par Sébastien SERRE & Jenny Dupuy
Dernière mise à jour le 4 mai 2021

Journal des modifications

04 mai 2021Jenny Dupuy – Modification d’ancres de liens non traduites
03 janvier 2021Jenny Dupuy – Mise en conformité avec l’interface de WordPress des options de visibilité des publications.