アカウントの作成

仮登録用データベースの作成

wp_pending_users
idintAI
user_logintext
user_passtext
user_emailtext
tokentext
created_atdate

アクティベーションが完了していないユーザーのことを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();
?>