九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、外観をみていただくと分かる人にはすぐ分かると思いますが、このブログはwordpress
で運用しています。
現在、wordpress
はCMS(運営者自身がコンテンツを管理することができるシステム。例えばブログ)では圧倒的にシェアを獲得していますので、もしかすると皆さんも過去に一度ぐらいはwordpress
でブログなどのサイトを作ったことがあるんじゃないでしょうか。
さて、そんなwordpress
ですが、こちらもLaravelと同じくログインから記事の管理まで数多くの機能を初期状態で用意してくれています。
ただ、だからこそ「ある機能」をつくろうとするとある問題が起きることがあります。
その問題点とは・・・・・他のサイトやフレームワークとの統合が難しいという点です。(これはwordpress
だけではなく、Laravel
もそうです)
そこで!
今回はLaravelで登録されたログイン情報を使ってwordpress
にログインできるようにしてみます。
ぜひ参考にしてみてくださいね。
※ 開発環境: Laravel 5.7、wordpress 5.0
目次
前提条件
まず、Laravelにログイン機能がインストールされていて、さらに以下のようにユーザーが登録されているものとします。
もし、ログイン機能をインストールしていない場合は、【Laravel5.6】インストール直後にやること3点の「ログイン、パスワードリマインダー機能を構築」を参考にしてインストールしておいてください。
また、wordpress
はLaravel
と同じサーバーの中にある(つまりwordpress
からLaravel
のDBにアクセスできる)ものとします。
ログインを実行する手順
実行手順としては次のようになります。
- wordpressログインフォームからログインする
- Laravel側のDBに登録されているユーザーを取得
- wordpressにユーザー登録されていなければLaravelの情報を使って自動登録し、すでに登録されていればユーザー情報を更新する
なお、これを実行するためにwordpress
に「laravel-authentication」という独自プラグインを作ります。
では、実際に開発をしていきましょう!
独自プラグインをつくる
プラグイン開発の準備をする
では、まずは独自プラグインの開発準備をしましょう。
wordpress
に独自プラグインを追加するには、wp-content/plugins
フォルダの中に新しくフォルダを作成し、そこに同名のphpファイルを設置します。
今回はlaravel-authentication
ですので、次のようになります。
Laravelユーザーでログインできるプラグインをつくる
では、今回のメインの部分です。
まずは実際のコードから見てみましょう。
<?php /* Plugin Name: Laravel Authentication Description: A plugin that allows to authenticate by Laravel users. Version: 1.0.0 Author: Sukohi Kuhoh Author URI: https://blog.capilano-fw.com */ // LaravelのDB情報 define('LARAVEL_DB_TYPE', 'mysql'); define('LARAVEL_DB_HOST', 'localhost'); define('LARAVEL_DB_PORT', '3306'); define('LARAVEL_DB_DATABASE', 'YOUR-LARAVEL-DB-NAME'); define('LARAVEL_DB_USERNAME', 'YOUR-USER-NAME'); define('LARAVEL_DB_PASSWORD', 'YOUR-PASSWORD'); define('LARAVEL_DB_USER_TABLE', 'users'); // 名前が違う場合は変えてください // アクション追加 add_action('wp_authenticate', 'laravel_authenticate', 30, 2); function laravel_authenticate($username, $password) { // DB接続 try { $pdo = new PDO( LARAVEL_DB_TYPE .':'. 'host='. LARAVEL_DB_HOST .';'. 'port='. LARAVEL_DB_PORT .';'. 'dbname='. LARAVEL_DB_DATABASE .';'. 'charset=utf8mb4', // DSN LARAVEL_DB_USERNAME, LARAVEL_DB_PASSWORD ); } catch (Exception $e) { return; } // Laravelユーザーを取得 $sql = $pdo->prepare('SELECT name,email,password FROM '. LARAVEL_DB_USER_TABLE .' WHERE email=:email'); $sql->bindParam(':email', $username); $sql->execute(); $laravel_user = $sql->fetch(); // Laravelにユーザーが存在している場合 if($laravel_user) { $laravel_name = $laravel_user['name']; $laravel_email = $laravel_user['email']; $laravel_password = $laravel_user['password']; // Laravelのパスワードチェック if(password_verify($password, $laravel_password)) { $wp_user = get_user_by('email', $laravel_email); if(!$wp_user) { // ユーザー登録 wp_insert_user([ 'user_login' => md5(uniqid(rand(), 1)), 'user_pass' => $password, 'user_email' => $laravel_email, 'display_name' => $laravel_name, 'role' => 'author' ]); } else { // ユーザー更新 wp_update_user([ 'ID' => $wp_user->ID, 'user_pass' => $password, 'user_email' => $laravel_email, 'display_name' => $laravel_name ]); } } } }
ではひとつずつ説明していきます。
プラグイン情報
まず一番上のコメントアウトされた部分。
ここに書いたプラグイン情報がwordpress
で表示されることになります。
LaravelのDB情報
Laravel側のDBへ接続する情報です。
すでにサイトがあるのなら、.env
から情報を写すといいでしょう。
※ なお、ユーザーテーブルの名前が例えば、lv_users
などのように通常のものと異なっている場合はLARAVEL_DB_USER_TABLE
を変更しておいてください。
アクション追加
wordpressで用意されているadd_action()
を使ってログイン時にlaravel_authenticate()
を実行するようにしています。
DB接続
今回はPDO
を使ってDBにアクセスしています。
ちなみに、日本語を利用したい場合はcharset
をLaravelと同じくutf8mb4
などにしておかないと文字化けの原因になりますので注意してください。
Laravelユーザーを取得
個人的にはその昔良く書いたコードですが、やっていることはLaravel
のusers
テーブルからメールアドレスが一致するデータを取得しているだけです。
取得するフィールドは次の3つです。
- name
- password
Laravelのパスワードチェック
そして、もしLaravel
にユーザーが見つかった場合、そのパスワードが本当に正しいかをチェックしなければいけません。そのために、PHP関数のpassword_verify()
を使います。(Laravelも内部的にこの関数を使っています)
ユーザー登録 or ユーザー更新
もし、パスワードのチェックも問題がなければ今度はwordpress
側にユーザーが存在しているかどうかをチェックします。
そして、次の2パターンで処理を実行します。
- wordpressにユーザーが存在しない ・・・ 新規ユーザー登録
- すでに存在している ・・・ ユーザー情報をLaravelに登録されたものに更新
なお、role
は権限のひとつで、今回は自分の記事を投稿、編集、公開ができるauthor
に設定しています。
また、ユーザー名になるuser_login
は今回Laravel
側には存在していないので、ランダムな文字列をつけるようにしていますが、もしLaravel
側にも英数字のユーザー名があるのでしたらそれを使うのもいいかもしれません。(ただし、一意である必要がありますので注意してください)
プラグインを有効にする
では、プラグインのコードは完了したので、wordpress
にログインしてlaravel-authentication
を有効にしましょう。
ページ左側の「プラグイン」をクリックし、表示されたLaravel Authentication
の有効化をクリックします。
これで準備は完了です!
実際にテストしてみる
では準備はすべて完了したので、実際にLaravelユーザーでログインしてみましょう。
現在のwordpress
側のユーザーテーブルです。
まだインストールしたばかりなので、管理者データだけです。
ではログインページから「太郎」さんでログインしてみます。
うまくログインできました。
ページ右上にはLaravel側で登録したユーザー名が表示されています。
なお、「太郎」さんはauthor
として登録されているので、ページ左側にプラグインなどの設定ページが存在していません。
なお、この時点でDBテーブルは次のようになっています。
お疲れ様でした!
ちなみに
今回のプラグインを使ってwordpress
にログインした後、プロフィールページなどからパスワードの変更や、ログインページのパスワード再発行は機能しなくなってしまいます。ユーザーが混乱しないようにするため、それらの表示は消しておいたほうがいいでしょう。
また、Laravelのデータベースへの接続情報は直接プラグインの中に書かずwp-config.php
などに書いておくほうが保守しやすいでしょう。
おわりに
これまでwordpress
のプラグインを作ったことはなかったのですが、フォルダを用意するだけで作れるはシンプルですごくいいですね。
さらに、独自プラグインの中でもwordpress
が用意してくれている数々の関数を使えるのはとても魅力的です。
ただ、記事の中でも少し言いましたが、今回久しぶりに過去によく使っていたようなコードを書いて、Laravel
がいかにコードを書きやすいかがわかりました。
特にPDO
を使ったデータベース接続。
これはwordpress
ではなく純粋なPHPコードですが、できればあまりもう使いたいとは思いませんでした。^^;
そういえばもっと昔は、Pearとか使ってたけどあれってどうなったんでしょうね??
といったところで今回は終了です。
ではでは〜!