web-dev-qa-db-fra.com

Comment rediriger vers une page avec un mot de passe basé sur le mot de passe entré sur l'écran de connexion

Je cherche donc quelque chose comme la redirection de connexion de Peter , mais légèrement différente. Je souhaite créer un portail client pour un site Web de photographie et je me suis dit que le meilleur moyen serait d'ajouter un type de publication personnalisé pour les clients et d'utiliser des champs personnalisés avancés pour ajouter toutes les fonctionnalités supplémentaires nécessaires au CPT. Lorsqu'un nouveau client est ajouté, une nouvelle URL est créée pour la page d'accès du client. Cela semble simple.

Ensuite, nous pouvons simplement protéger par mot de passe chaque page et envoyer le mot de passe au client. C’est formidable, mais j’aimerais également l’accompagner d’un bouton de "connexion" dans la navigation principale du site. Lorsque quelqu'un clique sur ce bouton, je souhaite qu'un formulaire de mot de passe lui soit présenté pour lui permettre de saisir le mot de passe que nous lui avons envoyé par courrier électronique. Sur la base du mot de passe qu'ils entrent, ils seront redirigés vers la page CPT appropriée. Quelqu'un a une idée sur la façon dont je peux y arriver? J'ai supposé que je pouvais en quelque sorte exécuter une requête pour extraire des publications en fonction d'un mot de passe, mais je ne suis pas sûr que le cryptage utilisé dans la base de données le permette. Toute idée serait grandement apprécié.

2
Thought Space Designs

J'ai répondu à ma propre question. Voici un plugin qui fait presque exactement ce dont j'avais besoin, mais j'avais besoin de la même fonctionnalité pour les types de publication personnalisés:

Pages intelligentes avec mot de passe

Je viens de modifier le plugin et de créer le mien pour un usage personnel.

Éditer pour l'utilité:

Ce plugin contient un seul fichier PHP. Dans ce fichier se trouve une classe unique appelée "smartPWPages" qui contient 3 fonctions. La fonction "process_form" contient un appel à la fonction get_pages. Dans la version 3.8.1, le plug-in ne fonctionnait pas, alors j'ai supprimé les arguments "child_of" et "parent" de l'appel get_pages. Après avoir supprimé ces arguments, le plugin fonctionne, mais uniquement pour les pages. Pour que cela fonctionne avec un type de publication personnalisé, vous pouvez simplement changer l'argument "post_type" en votre type de publication personnalisé au lieu de "page".

Ces modifications mineures m'ont permis de configurer un portail client à l'aide d'un type de publication personnalisé, qui comporte une seule page de connexion dans laquelle les utilisateurs sont redirigés vers la zone appropriée en fonction du mot de passe saisi. Je pouvais voir de nombreuses utilisations de ce type pour des éléments tels que les systèmes de gestion de projet, etc. Certainement un plugin utile.

0
Thought Space Designs

Voici la solution que j'ai trouvée qui s'appuie sur les informations déjà présentes dans la base de données.

Contexte

Chaque poste protégé par mot de passe stocke le mot de passe en texte brut dans la table wp_posts (dans la colonne post_password). Nous pouvons utiliser cette information pour interroger la base de données de toutes les publications auxquelles ce mot de passe est attribué et obtenir les informations de publication en fonction. De là, nous pouvons rediriger vers la publication protégée par mot de passe.

Hypothèses/contraintes

Le PO a indiqué qu'un formulaire de connexion personnalisé serait utilisé pour permettre aux clients de saisir leur mot de passe spécial. Je suppose que le formulaire est créé et peut utiliser une demande GET pour envoyer le mot de passe car il s'agit déjà d'un texte en clair.

Le PO a également indiqué que chaque mot de passe protégeant la publication/la page serait unique. Je suppose que le mot de passe unique est généré séparément de cette réponse.

Comment ça marche

Une chaîne de requête de client_key est envoyée (via le GET du formulaire ou via un lien) et vérifiée à l'aide de get_query_var(). S'il est présent, vérifiez dans la table wp_posts la première publication pour laquelle un mot de passe est défini égal à client_key et renvoyez la ligne sous forme d'objet.

Contrôle d'intégrité: si un objet a été créé, créez quelques variables à utiliser dans notre fonction JavaScript.

Écho d'un élément script dans le DOM qui exécutera une fonction POST sur wp-login.php. Cela imite la publication d'un formulaire qui se produirait normalement lorsqu'une page protégée par mot de passe est visitée pour la première fois. Dans ce cas, le client serait invité à saisir le mot de passe pour afficher le contenu de la publication. Une fois qu'un cookie a été créé, un cookie est créé pour permettre un accès ultérieur au contenu. Cette fonction effectue la même soumission de formulaire en coulisse, les redirections vers le message approprié (basé sur le GUID).

Enfin, exécutez la fonction uniquement sur le front-end du site, lorsque wp_head est activé (lorsque jQuery est [généralement] chargé).

Le code

<?php
/**
 * Add our custom query string to the global query_vars.
 *
 * @param array $vars The global vars used throughout WP.
 *
 * @return array
 */
function wpse134962_add_query_vars_filter( $vars ) {
    $vars[] = 'client_key';

    return $vars;
}

add_filter( 'query_vars', 'wpse134962_add_query_vars_filter' );

/**
 * Redirect to a password-protected page based on the query string.
 *
 * If client_key is passed in the query string, check the database for a post that
 * has a password assigned that equals the client_key. If one is found, submit the
 * login form to create the cookie that allows entry, then redirect to the post.
 */
function wpse134962_password_redirect() {
    $client_key = get_query_var( 'client_key' ) ? get_query_var( 'client_key' ) : '';

    if ( ! empty( $client_key ) ) {
        /** @var wpdb $wpdb */
        global $wpdb;
        $query          = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_password = %s", $client_key );
        $password_posts = $wpdb->get_row( $query );

        if ( isset( $password_posts ) ) {
            $post_id   = $password_posts->ID;
            $login_url = site_url( 'wp-login.php' );

            echo <<<HTML
<script>
jQuery(function() {
var postURL = "$login_url?action=postpass",
    postData = {
        post_password: "$client_key"
    },
    postRedirect = function() {
        document.location = "{$password_posts->guid}";
    };
jQuery.post( postURL, postData, postRedirect() );
})();
</script>
HTML;

        }
    }

}

if ( ! is_admin() ) {
    /** Only fire on the front end of the site. */
    add_action( 'wp_head', 'wpse134962_password_redirect' );
}
2
Morgan Estes