【wordpress】プラグインなしでユーザー登録フォームの関数にメール認証機能を追加してみた

今回の内容はwordpressのユーザー登録フォームにプラグインなしでメール認証機能をつけてしまおうという内容になっています。

もともとwordpressのユーザー登録用の関数であるwp_insert_userは存在しないメールアドレスでも自由にユーザー登録ができてしまうので、ちゃんと受信できるメールアドレスを登録してもらわないと登録できないようにしました。

wordpressで会員機能を作りたいという人に役立ててもらえるんじゃないでしょうか。

メール認証の認証の流れ

まず仮登録フォームにメールアドレスを入力しもらい、nonceと日付をデータベースに保存します。

保存する場所は、wordpressにもとからあるテーブルを使ってしまうとややこしくなりそうなので、独自テーブルを作成して保存した方が良いですね。

次に仮登録してもらったメールアドレスにパラメーター付きのURLをメールで送信。

そこからアクセスしてもらった時だけ、本登録用のフォームにアクセスできるような流れです。

本登録にアクセスできるかチェック項目は2つ。

  • 暗号化したnonceをリンクのパラーメーに付与しデータベースのnonce一致するか
  • データベースに保存した日付から24時間を超えていないか。

このような仕様となります。

ユーザーの登録に関してはこちらを参考にしてください。
【wordpress】自作のユーザー登録フォームにプロフィール画像を設定する方法

今回も参考用にテーマを作りましたので、よかったらどうぞ。

データベースの独自テーブルを操作できるようにする

activationというテーブルを作りました。

//新しいテーブルの設定
require_once(ABSPATH . WPINC . '/wp-db.php');
class my_wpdb extends wpdb
{
   public $tables = array( 'posts', 'comments', 'links', 'options', 'postmeta', 'terms', 'term_taxonomy', 'term_relationships', 'termmeta', 'commentmeta', 'activation');
}
if (!isset($wpdb)) {
   $wpdb = new my_wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
}

functions.php等にこれを書いておかないと、独自のテーブルに値を出し入れできないのでご注意ください。

仮登録の値を保存する

独自で作ったテーブルに仮登録の値を保存し、登録したメールアドレスに認証用のメールを送信します。

メール本文に記載するリンクはパラーメータの暗号化をしておきます。

openssl_encryptというphpの関数でリンクのパラーメータを暗号化し、リンク先でパラメータの暗号化をもとに戻す時、データベースに保存したnonceを認証することができるのです。

public function save_data()
{
   global $wpdb;
   //postデータのチェック
   if (!empty($_POST['user_email'])
   && wp_verify_nonce($_REQUEST['_wpnonce'], 'prev-nonce')
   ) {
 
       //データ保存
       $nonce = $_REQUEST['_wpnonce'];
       $email = $_POST['user_email'];
       $parm_nonce = urlencode(openssl_encrypt($nonce, 'AES-128-ECB', $nonce));
       $date_time = new DateTime(null, new DateTimeZone('Asia/Tokyo'));
       $save_data = array(
           'nonce' => $nonce,
           'date' => $date_time->format('Y-m-d H:i:d'),
           'email' => $email
       );
       $result = $wpdb->insert($wpdb->prefix . 'activation', $save_data, array('%s','%s','%s'));
       if ($result) {
 
           //メール送信
           $url = sprintf('%s?id=%s&nonce=%s', home_url(), $wpdb->insert_id, $parm_nonce);
           $text = <<< EOT
24時間有効のURLです。
{$url}
EOT;
           wp_mail($email, '確認メールです。', $text);
 
           //リダイレクト
           wp_redirect(home_url());
           exit;
       }
   }
}

メールからのリンク先で値の確認はこちらのコードになります。

//テーブルを取得
public function set_db()
{
   global $wpdb;
   $query = "SELECT * FROM " . $wpdb->prefix . "activation WHERE id = " . $_GET['id'];
   $this->result = $wpdb->get_results($query, OBJECT);
}
 
 
//nonceのチェック
public function user_check()
{
   $nonce = openssl_decrypt($_GET['nonce'], 'AES-128-ECB', $this->result[0]->nonce);
   if ($nonce === $this->result[0]->nonce) {
       return true;
   } else {
       return false;
   }
}

24時間の有効期限を設けるので日付のチェックも忘れずに。

//日付チェック
public function date_check()
{
   $date_time = new DateTime(null, new DateTimeZone('Asia/Tokyo'));
   $save_date = new DateTime($this->result[0]->date, new DateTimeZone('Asia/Tokyo'));
   $save_date->modify('+24 hours');
   if ($date_time > $save_date) {
       return false;
   } else {
       return true;
   }
}

Webアプリ作るまでの課題はたくさんある

今回の内容でメール認証機能を追加することができましたが、ユーザー登録周りでもまだまだ課題はたくさんあります。

今の状態だと仮登録のデータ蓄積されてしまうので、48時間で削除するようにするか、本登録が完了したら削除するかどちらかの機能は入れておいたほうが良いかもしれませんね。

さらに、ajaxを使ったバリデーションも作っていきたいですね。

今回の内容をテーマにまとめましたので、興味のある方はご自由にダウンロードしていってください。

正社員という奴隷制度に中指を立てるWebエンジニアです。PHPが得意。繋がれた鎖を断ち切るために、自由を取り戻すために、プログラミングスキルを磨く日々です。プログラミングと個人でもできるビジネスについて、情報発信しています。

詳しくはこちら