web-dev-qa-db-fra.com

Ajout d'un formulaire de connexion qui concatène trois champs dans un nom d'utilisateur

Dans certaines situations, je dois authentifier les utilisateurs avec trois valeurs (par opposition à une seule valeur USERNAME. Appelons-les VALUE1, VALUE2, VALUE3. On ne leur demandera pas une PASSWORD spécifique.

J'ai étudié la possibilité de modifier la routine de connexion de sorte qu'elle demande trois valeurs et authentifie l'utilisateur sur la base de ces trois valeurs (similaire à ce qui est décrit ici ). Mais comme Wordpress a besoin d’un champ USERNAME unique et que l’une des valeurs entrées dans la page de connexion doit être la valeur USERNAME, cela ne fonctionnera pas, cela est simple car aucune des trois valeurs n’est unique. Ce qui est unique, c'est la combinaison des trois valeurs.

Cela a conduit à l’idée que la USERNAME stockée dans WP pourrait être une valeur dérivée de la concaténation des trois valeurs que j’ai besoin (VALUE1, VALUE2, VALUE3). Donc, la USERNAME sera VALUE1VALUE2VALUE3.

J'utiliserais également cette valeur concaténée en tant que PASSWORD, car je ne demande pas à l'utilisateur de saisir un mot de passe distinct s'il connaît les trois valeurs que je demande.

QUESTION 1

Ma première question est de savoir si la justification ci-dessus est exacte ou non. Est-il vrai que même si j'ajoute des champs supplémentaires à la routine de connexion, l'un de ces champs devra correspondre à la valeur USERNAME, et cette valeur devra être unique?

QUESTION 2

Si ce qui précède est correct, ma question suivante est la suivante: comment créer un formulaire de connexion qui demande trois champs (plus le mot de passe) et les concatène en une valeur authentifiée par la variable USERNAME?

Par exemple

La page de connexion personnalisée demandera ce qui suit:

VALUE1, VALUE2, VALUE3

Il les concaténera ensuite dans VALUE1VALUE2VALUE3 et le transmettra à la routine de connexion standard WP en tant que valeurs USERNAME et PASSWORD.


Évidemment, je voudrais réaliser tout cela sans modifier les fichiers de base. Le site a un thème pour enfants, donc tout peut être fait ici.

1
omega33

Voici ce qui a fini par fonctionner. Si cela est utile à quelqu'un qui souhaite faire quelque chose de similaire.

Nous avons créé un modèle personnalisé dans le thème de l'enfant.

La dernière valeur concaténée est utilisée en tant que USERNAME et PASSWORD.

En supposant que tout le code nécessaire pour un modèle de page personnalisé typique soit utilisé, je vais simplement publier le début de mon fichier de modèle de page personnalisé:

<?php
    /**
    Template Name: Custom Login Page
    */
    if ( is_user_logged_in() ) {
        wp_redirect( LOGIN_REDIRECT );  // LOGIN_REDIRECT is set in the config.php file.
    }
    $WP_Error = new WP_Error();

    if(isset($_POST['form-action']) && $_POST['form-action']=='login') {
      $VALUE1 = trim($_POST['log-sname']);
      $VALUE1 = preg_replace("/[^A-Za-z0-9\- ']/", '', $VALUE1);
      $VALUE2 = $_POST['VALUE2'];
      $VALUE3 = $_POST['VALUE3'];
      $usernm = strtoupper(trim($VALUE1)).$VALUE2.$VALUE3;
      $passwd = strtoupper(trim($VALUE1)).$VALUE2.$VALUE3;
      $login_data = array();
      $login_data['user_login'] = $usernm;
      $login_data['user_password'] = $passwd;
      $login_data['remember'] = false;
      $user_verify = wp_signon( $login_data, false ); 
      if ( is_wp_error($user_verify) ) 
      {
        $WP_Error->add('my_error', '<p align="center">We were unable to validate your user credentials. ETC ETC... error message instructions ETC</p>');
      } else {  
        wp_redirect( LOGIN_REDIRECT ); // LOGIN_REDIRECT is set in the config.php file.
        exit();
      }
    }

C'est ce qui gère le login. Après cela vient l'en-tête ..

    get_header(); ?>

Après cela, il y a le PHP standard pour la boucle, etc., ainsi que du code pour afficher l'erreur, le cas échéant:

<div id="primary" <?php PARENT_THEME_SPECIFIC_content_class( 'content-area' ); ?> > // use content_class suitable to your theme scenario
    <main id="main" class="site-main" role="main">
      <?php while ( have_posts() ) : the_post(); ?>
        <?php get_template_part( 'template-parts/content', 'page' ); ?>
      <?php endwhile; // End of the loop. ?>
      <?php echo $WP_Error->errors['my_error'][0]; ?>

, puis une forme qui regroupe VALUE1, VALUE2 et VALUE3. L'action post est définie sur "". Voici la déclaration form:

Fermez en insérant le pied de page et tout ce que vous souhaitez.

C'est à peu près ça.

0
omega33

Si vous créez l’utilisateur en transmettant les valeurs saisies à une fonction qui les combine, vous pouvez l’appeler depuis une autre qui appelle wp_insert_user. Ensuite, vous pouvez enregistrer le nom d'utilisateur/pass selon vos besoins, et utiliser la même fonction et le même formulaire lors de leur préparation pour WP afin de vérifier la connexion. Tout le code ci-dessous est destiné à la démonstration uniquement. Je ne saurais trop insister sur cela. Certainement regarder dans le nonce et valider l'enregistrement.

Encore une fois, il s’agit SEULEMENT d’une démonstration de l’idée à indiquer dans la direction générale.

<form>
    <input type="text" name"value1" />
    <input type="text" name"value2" />
    <input type="text" name"value3" />
</form>

Ensuite, nous avons une fonction pour gérer la combinaison des entrées:

<?php 
function getting_posted_values() {
    if(isset($_POST['value1']) && (isset($_POST['value2']) && (isset($_POST['value3']) {
       $value1 = $_POST['value1'];
       $value2 = $_POST['value2'];
       $value3 = $_POST['value3'];
       $new_value = $value1 . $value2 . $value3;
    }
  return $new_value;
 }

Ensuite, une fonction accrochée - (par exemple, si vous utilisiez le formulaire de contact 7 pour gérer le formulaire, vous pourriez accrocher wpcf7_before_send_mail et accéder à l’objet post.) - pourrait appeler la fonction ci-dessous et créer le nouvel utilisateur:

function build_a_new_user($posted_form) {
    $new_value = getting_posted_values($posted_form);
    $userdata = array(
          'user_login'   => $new_value,
          'user_pass'    => $new_value, //normally: wp_generate_password( 12, false );
          'user_email'   => //note: not sure but may be required?
          'nickname'     => $new_value,
          'display_name' => $new_value,
          'first_name'   => $new_value,
          'last_name'    => $new_value,
          'role'         => 'subscriber'
         );
     wp_insert_user($userdata);

}

wp_insert_user () est documenté ici .

Pour en savoir plus sur la gestion de l'enregistrement personnalisé, cliquez ici.

Pour vous connecter

Votre formulaire avec les valeurs 1, 2, 3 exécuterait à nouveau get_post_values ​​en étant appelé dans une autre fonction branchée pour vous connecter d'une manière ou d'une autre. Peut-être le filtre login_form_defaults qui peut modifier le tableau args du formulaire. Ce qui suit est une spéculation complète sous forme d’exemple non fonctionnel .

Mais l'idée est que si vous pouvez transmettre ces valeurs au processus normal de WP (peut-être via le filtre authenticate mentionné dans votre exemple lié?) En tant qu'utilisateur/pass, vous pouvez vous abstenir d'effectuer la vérification vous-même.

function log_in_handler($posted_form) {
    $pass_and_username = getting_posted_values($posted_form);
    $args_array = array(
       'username_id' => $pass_and_username, 
       'password' => $pass_and_username);        
}

C'est certainement une entreprise intéressante. J'espère que cela pourra aider.

1
hwl