web-dev-qa-db-ja.com

3つのフィールドをユーザー名に連結するログインフォームを追加する

1つのUSERNAME値ではなく、3つの値でユーザーを認証する必要がある場合があります。VALUE1VALUE2VALUE3と呼びましょう。特定のPASSWORDは要求されません。

3つの値を要求し、それら3つの値に基づいてユーザーを認証するようにログイン・ルーチンを変更することを検討しました(ここで説明されているもの と同じ )。しかし、Wordpressは一意のUSERNAMEフィールドを必要とし、ログインページに入力された値の1つが事実上USERNAMEである必要があるので、これは機能しません。ユニークなのは、3つすべての値の組み合わせです。

これは、WPに格納されているUSERNAMEが、必要な3つの値(VALUE1VALUE2VALUE3)を連結して得られる値である可能性があるという考えにつながります。そのためUSERNAMEVALUE1VALUE2VALUE3になります。

ユーザーが要求している3つの値を知っている場合は、ユーザーに別のパスワードを入力するように要求しないため、この連結値もPASSWORDとして使用します。

質問1

私の最初の質問は、上記の論理的根拠が正確かどうかです。ログインルーチンにフィールドを追加したとしても、それらのフィールドの1つがUSERNAME値に対応する必要があり、その値が一意である必要があるというのは本当ですか?

質問2

上記の内容が正しい場合、次の質問は、3つのフィールド(およびパスワード)を要求し、それらのフィールドをUSERNAMEに対して認証される1つの値に連結するログインフォームの作成方法です。

例えば

カスタムログインページは以下を要求します。

VALUE1VALUE2VALUE3

次にそれらを連結してVALUE1VALUE2VALUE3にし、それをUSERNAMEおよびPASSWORDの値として標準のWPログインルーチンに渡します。


明らかに、私はコアファイルを変更せずにこれらすべてを達成したいと思います。このサイトは子テーマを持っているので、その中ですべて実行できます。

1
omega33

これがうまくいった結果です。これが似たようなことをしたいと思っている誰かにとって有用である場合には。

子テーマでカスタムテンプレートを作成しました。

最後の連結値は、USERNAMEとPASSWORDとして使用されます。

典型的なカスタムページテンプレートに必要な他のすべてのコードが利用されていると仮定すると、私はカスタムページテンプレートファイルの最初の部分を投稿するだけです。

<?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();
      }
    }

これがログインを処理するものです。その後にヘッダがあります。

    get_header(); ?>

その後に、ループなどの標準的なPHPと、エラーが発生した場合にそれを表示するためのコードが追加されます。

<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]; ?>

次に、VALUE1、VALUE2、およびVALUE3を集めるフォーム。 postアクションは""に設定されています。これがform宣言です。

フッターを挿入して閉じます。

それはそれについてです。

0
omega33

入力した値をそれらを組み合わせた関数に渡してユーザーを作成した場合は、wp_insert_userを呼び出す別のユーザーからそれを呼び出すことができます。その後、必要に応じてユーザー名/パスを保存し、WP用に準備するときに同じ機能とフォームを使用してログインを確認できます。以下のコードはすべてデモンストレーション専用です。それを十分に強調することはできません。間違いなくnonceと検証登録を調べます。

繰り返しますが、これはアイデアのデモであり、一般的な方向性を示しているにすぎません。

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

それからエントリの結合を処理する関数があります。

<?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;
 }

それからフックされた関数 - (例えば、フォームを管理するためにContact Form 7を使った場合、wpcf7_before_send_mailをフックしてpostオブジェクトへのアクセスを得ることができます。) - 以下の関数を呼び出して新しいユーザーを構築することができます。

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()はここに文書化されています

カスタム登録の取り扱いに関する詳細はこちら

ログイン用

何らかの方法でログインするためにフックされている別の関数内で呼び出されることによって、値1,2,3を持つあなたのフォームはgetting_post_valuesを再び実行するでしょう。フォームのargs配列を編集できる login_form_defaultsフィルタ 。以下は、動作しない例としての完全な推測です。

しかし、もしあなたがそれらの値をuser/passとして(おそらくあなたのリンクされた例で言及されたauthenticateフィルタを通して)WPの通常のプロセスに渡すことができるなら、あなたは自分でチェックをすることをやめることができるということです。

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);        
}

それは間違いなく面白い試みです。それが役立つことを願っています。

1
hwl