Accueil » Conseils & tutoriels sites internet » Tutoriels Wordpress » WordPress : changer le mot de passe d’une page verrouillée

WordPress : changer le mot de passe d’une page verrouillée

Posté dans : Tutoriels Wordpress 0

Sous WordPress, une page peut disposer de plusieurs états. Celle-ci peut être en état brouillon, en attente de relecture, publiée, privée… Elle peut être également verrouillée par un mot de passe, ce qui peut répondre à beaucoup de besoins en terme de contenu privé, personnel ou possédant des informations relatives à la protection des données personnelles.

J’avais évoqué dans un article la création de « custom post types », à savoir un contenu personnalisé. Le but de cette démarche était de mettre en avant les images à la une des pages verrouillées par un mot de passe, la personne administrant le site (l’excellente Cécile de l’Instant C – Révélatrice d’espaces et d’instants, avec qui j’ai la joie de partager des formations) proposant des photos de mariage et d’enfants. Le contenu en est donc totalement privé.

Pour un autre site, concernant cette fois-ci un pub-restaurant pour un ancien joueur de rugby très populaire, un des managers m’a fait part de son envie de proposer un formulaire de réservations à ses clients, en mode privé, verrouillé par un mot de passe. Mais pour éviter que le mot de passe ne soit trop souvent divulgué, il faut en conséquence le changer une fois par semaine.

Le pub-restaurant en question se nomme le Brennan’s Bar. Si vous avez l’occasion de passer à Castelginest, peut-être m’y croiserez-vous, et arrêtez-vous pour siroter une bière à la santé de Trevor et mes amis qui y travaillent.

Le topo – suite à mon rendez-vous avec un des managers – a donc été celui-ci :

Sortez les bières et les chips, on part en petite modification WordPress et une touche de webdesign !

Création d’une page privée avec formulaire

Ici, et comme le site a préalablement été conçu avec un thème enfant WordPress (la base !), je n’ai pas non plus grand-chose à faire. Je vais donc utiliser deux extensions en place pour réaliser mon formulaire, et designer rapidement ma page.

Le site du Brennan’s Bar (Castelginest ou Seilh) est à cette URL : https://www.brennansbar.fr/

Création du formulaire avec Contact Form 7

Je sais bien que l’utilisation de ce plugin manque d’originalité, mais je tenais à en parler car j’ai tendance à l’utiliser en ajoutant pas mal de HTML.

Pour chaque champ renseigné, je précise systématiquement une class et un id, sait-on jamais quelles sont les modifications que j’aurais à apporter, notamment en terme de validation des données et de design.

Par la suite, j’encapsule la totalité de mon formulaire dans une div, que je nomme également. Le formulaire est celui-ci :

<div class="tapas_form">
<label> Votre nom*
    [text* your-name] </label>

<label> Votre adresse de messagerie*
    [email* your-email] </label>

<label> Nombre de personnes*
    [number* number-877] </label>

<label> Date*
    [date* date-201] </label>

<span> Choix des tapas*
    [checkbox* checkbox-169 id:tapas_id class:tapas_class use_label_element "Patatas Bravas" "Bouchées de camembert pané 6 pièces" "Planche de charcuterie" "Planche de fromage" "Chili cheese nuggets 8 pièces (fromage au piment vert)" "Timbale de guacamole et tortillas de maïs" "Pépites de calamars" "Chiken Wings tex-mex 8 pièces" "Emincés de Bœuf façon thaï" "Brochettes de poulet mariné curry & gingembre" "Wraps au saumon fumé et fromage frais"]</span>

<span>Extra migniardise sucré (5€ de supplement par personne)
[radio radio-778 default:1 "Oui" "Non"]</span>

[submit "Envoyer"]
</div>

Je peux à présent facilement modifier l’aperçu en CSS, voire envoyer des messages avec un peu de Jquery, rien de bien méchant, mais la préparation est la plus importante afin d’envisager un maximum de possibilités.

Création de la page, verrouillage et webdesign

Créer une page sous WordPress, rien de plus facile. Par-dessus le marché, le site utilise le plugin Elementor, toujours à jour grâce aux mises à jour automatiques de WordPress. Restons safe !

Le verrouillage de la page, c’est un peu particulier, et plutôt rare de l’utiliser.

Création d'une page verrouillée sous WordPress

Vous devez pour cela, dans la partie de droite de l’outil, modifier le paramètre de visibilité (avec le petit œil sur le côté) pour sélectionner l’option « Protégé par mot de passe ». Un mot de passe vous sera bien évidemment demandé.

En base de données, c’est très simple. Le mot de passe est en clair (top la sécurité au passage, m’enfin…) et on peut facilement le mettre à jour.

Mot de passe d'une page verrouillée sous WordPress

Ma page est prête et je vois bien mon mot de passe, reste à le mettre à jour de manière automatisée, et tous les lundis.

Création d’une fonction de changement de mot de passe

L’idée est de modifier le mot de passe tous les lundis. Idéalement, la seule chose que le Brennan’s ne devrait gérer, ce sont les e-mails, et encore.

Chacun son métier ! Le mot de passe sera donc automatisé. Pour ma part, l’automatisation est la clé pour avoir moins de travail à faire et pouvoir me concentrer sur autre chose (comme ce tutoriel) pendant que tout ce qu’ils auront à faire, c’est valider la réservation et imprimer l’email reçu, de manière à pouvoir simplement accrocher le mail en cuisine.

Simple, rapide, efficace.

Tout se passe sur deux choses : la génération d’un code aléatoire, et une requête SQL.

Comme le manager est mon ami Jeremy, aka Jerem’, je vais lui rendre hommage en me servant systématiquement de son nom comme base de mot de passe.

        $rand = rand(1, 1000000);
        $password = 'jerem'.$rand;

La requête SQL quant à elle, requiert l’identifiant de l’article, mais demeure simple :

       global $wpdb; 
       $sql = 'UPDATE '.$wpdb->prefix.'posts
        SET post_password = "'.$password.'"
        WHERE ID = 117';

Il ne faut pas non plus que le mot de passe se mettre à jour systématiquement, sans quoi jamais nous ne pourrons accéder à l’article. Partons sur une mise à jour tous les lundis. Nous en sommes donc à ceci


$timestamp = time();
if(date('D', $timestamp) === 'Mon'){
    $reset = get_post_meta(117, 'reset_password');
    // Prepare data
    global $wpdb;
    $rand = rand(1, 1000000);
    $password = 'jerem'.$rand;
    // SQL query : update password
    $sql = 'UPDATE '.$wpdb->prefix.'posts
    SET post_password = "'.$password.'"
    WHERE ID = 117';
    $result = $wpdb->query($sql);
    update_post_meta((int)117, 'reset_password', date('D-m-d', $timestamp));
}

Notez qu’outre l’utilisation de time() et de date() en PHP, j’utilise ces bonnes vieilles fonctions natives de WordPress get_post_meta et update_post_meta. Cela me permet de bien enregistrer la date à laquelle la page a été mise à jour.

« Mon », c’est « Monday », lundi en anglais. Déjà mon code ne fonctionnera que le lundi, je vais utiliser l’information issue de get_post_meta pour éviter que cela ne soit mis à jour plus d’une fois par lundi. Simple :


$timestamp = time();
if(date('D', $timestamp) === 'Mon'){
    $reset = get_post_meta(117, 'reset_password');
    foreach ($reset as $time) {
        if ($time == date('D-m-d', $timestamp)) {
            return;
        }
    }
    // Prepare data
    global $wpdb;
    $rand = rand(1, 1000000);
    $password = 'jerem'.$rand;
    // SQL query : update password
    $sql = 'UPDATE '.$wpdb->prefix.'posts
    SET post_password = "'.$password.'"
    WHERE ID = 117';
    $result = $wpdb->query($sql);
    update_post_meta((int)117, 'reset_password', date('D-m-d', $timestamp));
}

Donc si la date du jour est un lundi, mais que ce lundi en question la mise à jour a déjà été réalisée, on ne déclenche pas la mise à jour.

Envoyons le code par email. wp_mail() suffira amplement, pas besoin de paramètres extraordinaires ou même de code HTML.

wp_mail est pas trop mal documenté dans le Codex, et beaucoup de sites en parlent avec des exemples. Pour ma part, le code se résume à ceci :

        // Send email
        $to = 'contact@team-ever.com';
        $subject = 'Le mot de passe de réservation a été changé';
        $body = 'Désormais, le mot de passe est : '.$password;
        $headers = array('Content-Type: text/html; charset=UTF-8');
        $sent = wp_mail( $to, $subject, $body, $headers );

Reste à mettre tout cela dans une jolie fonction WordPress, disons sur le hook init()

/**
 * Change post password
 * @param int post id
 * @see https://www.team-ever.com/?p=33577
*/
function changePostPassword()
{
    $timestamp = time();
    if(date('D', $timestamp) === 'Mon'){
        $reset = get_post_meta(117, 'reset_password');
        foreach ($reset as $time) {
            if ($time == date('D-m-d', $timestamp)) {
                return;
            }
        }
        // Prepare data
        global $wpdb;
        $rand = rand(1, 1000000);
        $password = 'jerem'.$rand;
        // SQL query : update password
        $sql = 'UPDATE '.$wpdb->prefix.'posts
        SET post_password = "'.$password.'"
        WHERE ID = 117';
        $result = $wpdb->query($sql);
        // Send email
        $to = 'cchalamon@team-ever.com';
        $subject = 'Le mot de passe de réservation a été changé';
        $body = 'Désormais, le mot de passe est : '.$password;
        $headers = array('Content-Type: text/html; charset=UTF-8');
        $sent = wp_mail( $to, $subject, $body, $headers );
        delete_post_meta(117, 'reset_password');
        update_post_meta((int)117, 'reset_password', date('D-m-d', $timestamp));
    }
}
add_action( 'init', 'changePostPassword' );

Pour le moment, et comme la demande me semble un peu spécifique, je ne vois pas trop l’intérêt d’en faire un plugin. Mais si vous en avez besoin, demandez en commentaires, je vous le mettrai à disposition gratuitement sur la boutique WordPress WooCommerce de la Team Ever 🙂

Imprimer Imprimer
Suivre Cyssoo:

Développeur - formateur

Je cherche à display errors le monde, vous auriez pas la doc' ? Follow me on Twitter !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.