WordPress で会員制のサイトを作成するためのプラグインを調査していた際に Theme My Login というプラグインを見つけました。このプラグインを利用すると簡単に会員制サイトが作成できるということでしたが、そもそもプラグインでの会員登録をどのようにして実現しているか興味があって調査してみました。
きっかけはプラグインのエラー表示から
早速 Theme My Login プラグインを有効化し、登録ページを表示してみると「現在、ユーザー登録はできません」というメッセージが表示されまして。
原因を調査すると、WordPress のダッシュボードの『設定 > 一般』から『メンバーシップ』の『だれでもユーザー登録ができるようにする』をチェックする必要があるようです。このチェックボックスのオンオフが内部的にどのような挙動をするのか興味があって調べてみました。
users_can_register とは?
まず、この設定画面のソースコードである options-general.php を確認すると
get_option( ‘users_can_register’ ) した値を表示していることがわかりました。get_option は WordPress Codex によれば options テーブルからの値の取得です。
https://wpdocs.osdn.jp/関数リファレンス/get_option
つまりこのチェックボックスは users_can_register というキーでDBにデータを書き込みそれをもとに処理や表示を切り替えるためのフラグだとわかります。
users_can_register から会員登録(ユーザー登録)まで処理を追う
では実際に users_can_register を利用して処理や表示を切り替えている箇所を調べてみます。該当箇所は何か所かあるのですが、最も該当数が多いのは wp-login.php でした。どうやら users_can_register が有効の状態ではログイン画面に登録用のリンクが表示され、それをクリックするとユーザー登録用のページ wp-login.php?action=register へと遷移するようになっているようです。
register アクションの調査
register action については wp-login.php 内に
switch ( $action ) で処理を分岐させている箇所があり、その switch 節の中の case ラベルとして
confirm_admin_email
lostpassword
など様々なアクションごとの処理が定義されています。
アクションごとの処理はさらにGETの場合(テンプレートの表示処理)と、POSTの場合(『登録』などのフォームボタンクリック時の処理)に分かれており、if ( $http_post ) から始まる if 節の中身が POST の場合の処理です。
POST の場合の処理を確認すると、register_new_user というメソッドがWordPress標準の会員登録処理の実処理であることがわかります。
register_new_user の処理から、会員情報(ユーザー情報)の登録処理と管理しているDBを調べる
register_new_user については残念ながら日本語サイトで解説はないのですが(2020/05/06 現在)下記WordPressの開発者向けサイトから概要や、ソースコードそのものの確認が可能です。
https://developer.wordpress.org/reference/functions/register_new_user/
ソースコードを読む限りでは、パスワードを自動生成し、DBへのユーザーの登録処理は wp_create_user に任せているようです。
wp_create_user も user_login, user_email, user_pass で compact した Array を生成して wp_insert_user に処理を任せています。
wp_insert_user まで読み進むと、ようやく $wpdb->users に対して $wpdb->update または $wpdb->insert していることがわかります。
つまり、 WordPress 標準機能で追加されたユーザーは users テーブルに挿入されます。なお、ここで気になるのがユーザー生成時のロールですが、wp_insert_user 呼び出し時の引数オブジェクトに role というプロパティが設定されていればそれが設定されますし、設定されていなければデフォルトのロールが用いられます。
ただしロールについては users テーブルには格納されていません。というのも users テーブルに格納されているのは認証に必要な情報のみで、それ以外のデータはすべて usermeta テーブルに格納されているからです。
usermeta テーブルには meta_key = wp_capabilities のレコードがあり、meta_value にシリアライズされた ロール情報が格納されています。
ここまでで、WordPress のデフォルト機能がユーザー情報をどのように格納しているかがわかりました。
実際のプラグインではどのようにユーザー情報を登録しているか?
それでは、その他のプラグインではどのようにユーザー情報を登録、管理しているのでしょうか?あるプラグインを例にとって調べてみると、まず wp-login.php をそのまま使用するのではなく、add_action によるフックを行い、ログインページや登録ページを別に用意しているようです。また、ユーザーの登録には wp_create_user を利用していました。
この場合、ユーザー情報自体はusersテーブルに登録されてしまいますから、
wp-login.php からログインできてしまいます。その結果、プロフィールの編集はともかくとして、ダッシュボードも閲覧できてしまいます。
調べてみると、このプラグインでは Profiles など各種機能は有償の別エクステンションとなっているようでした。そのため、有償エクステンションなしではそれほど凝った管理方法になっていない可能性があります。次回は Simple Membership など、プロフィール登録機能がついているといわれているプラグインなどを参考 WordPressプラグインによる会員サイト構築のやりかたについて考察を進めていきます。