アカウントの作成
仮登録用データベースの作成
wp_pending_users | ||
id | int | AI |
user_login | text | |
user_pass | text | |
user_email | text | |
token | text | |
created_at | date |
アクティベーションが完了していないユーザーのことをpending userといいます。
仮登録してメールを送信
page-register.php
if (isset($_POST['submit_register'])) {
$user_login = sanitize_text_field($_POST['input_name']);
$user_pass = $_POST['input_pass']; // まだハッシュ化しない
$user_email = sanitize_email($_POST['input_email']);
// 入力チェック
if (empty($user_login)) { $errors[] = 'ユーザー名を入力してください'; }
if (empty($user_pass)) { $errors[] = 'パスワードを入力してください'; }
if (empty($user_email)) { $errors[] = 'メールアドレスを入力してください'; }
if (empty($errors)) {
global $wpdb;
$table_name = $wpdb->prefix . 'pending_users';
// ランダムな認証トークンを生成
$token = wp_generate_password(32, false);
// 仮登録データをDBに保存
$wpdb->insert($table_name, [
'user_login' => $user_login,
'user_pass' => $user_pass,
'user_email' => $user_email,
'token' => $token,
]);
// 認証メール送信
$verification_url = site_url("/verify/?token=$token");
$subject = 'アカウント登録の確認';
$message = "こんにちは、$user_login さん。\n\n" .
"以下のリンクをクリックして登録を完了してください。\n\n" .
"$verification_url";
$headers = ['Content-Type: text/plain; charset=UTF-8'];
wp_mail($user_email, $subject, $message, $headers);
// ユーザーに案内
echo '<p>認証メールを送信しました。メールを確認してください。</p>';
}
}
トークンを検証して認証
verify.php
<?php
/*
Template Name: Verify Account
*/
get_header();
global $wpdb;
if (isset($_GET['token'])) {
$token = sanitize_text_field($_GET['token']);
$table_name = $wpdb->prefix . 'pending_users';
// DBからトークンに該当するユーザーを取得
$user_data = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE token = %s", $token));
if ($user_data) {
// WordPressユーザーとして登録
$new_user_data = [
'user_login' => $user_data->user_login,
'user_pass' => $user_data->user_pass,
'user_email' => $user_data->user_email,
'role' => 'subscriber',
];
$user_id = wp_insert_user($new_user_data);
if (!is_wp_error($user_id)) {
// 仮登録データを削除
$wpdb->delete($table_name, ['id' => $user_data->id]);
echo "<p>アカウントが作成されました!</p>";
echo '<a href="' . site_url('/login/') . '">ログインする</a>';
} else {
echo '<p>エラーが発生しました: ' . $user_id->get_error_message() . '</p>';
}
} else {
echo "<p>無効なトークンです。</p>";
}
} else {
echo "<p>トークンが見つかりません。</p>";
}
get_footer();
?>