1つのUSERNAME
値ではなく、3つの値でユーザーを認証する必要がある場合があります。VALUE1
、VALUE2
、VALUE3
と呼びましょう。特定のPASSWORD
は要求されません。
3つの値を要求し、それら3つの値に基づいてユーザーを認証するようにログイン・ルーチンを変更することを検討しました(ここで説明されているもの と同じ )。しかし、Wordpressは一意のUSERNAME
フィールドを必要とし、ログインページに入力された値の1つが事実上USERNAME
である必要があるので、これは機能しません。ユニークなのは、3つすべての値の組み合わせです。
これは、WPに格納されているUSERNAME
が、必要な3つの値(VALUE1
、VALUE2
、VALUE3
)を連結して得られる値である可能性があるという考えにつながります。そのためUSERNAME
はVALUE1VALUE2VALUE3
になります。
ユーザーが要求している3つの値を知っている場合は、ユーザーに別のパスワードを入力するように要求しないため、この連結値もPASSWORD
として使用します。
私の最初の質問は、上記の論理的根拠が正確かどうかです。ログインルーチンにフィールドを追加したとしても、それらのフィールドの1つがUSERNAME
値に対応する必要があり、その値が一意である必要があるというのは本当ですか?
上記の内容が正しい場合、次の質問は、3つのフィールド(およびパスワード)を要求し、それらのフィールドをUSERNAME
に対して認証される1つの値に連結するログインフォームの作成方法です。
カスタムログインページは以下を要求します。
VALUE1
、VALUE2
、VALUE3
次にそれらを連結してVALUE1VALUE2VALUE3
にし、それをUSERNAME
およびPASSWORD
の値として標準のWPログインルーチンに渡します。
明らかに、私はコアファイルを変更せずにこれらすべてを達成したいと思います。このサイトは子テーマを持っているので、その中ですべて実行できます。
これがうまくいった結果です。これが似たようなことをしたいと思っている誰かにとって有用である場合には。
子テーマでカスタムテンプレートを作成しました。
最後の連結値は、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
宣言です。
フッターを挿入して閉じます。
それはそれについてです。
入力した値をそれらを組み合わせた関数に渡してユーザーを作成した場合は、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);
}
それは間違いなく面白い試みです。それが役立つことを願っています。