Laravelのユーザーでwordpressへログインできるようにする

さてさて、外観をみていただくと分かる人にはすぐ分かると思いますが、このブログはwordpressで運用しています。

現在、wordpressはCMS(運営者自身がコンテンツを管理することができるシステム。例えばブログ)では圧倒的にシェアを獲得していますので、もしかすると皆さんも過去に一度ぐらいはwordpressでブログなどのサイトを作ったことがあるんじゃないでしょうか。

さて、そんなwordpressですが、こちらもLaravelと同じくログインから記事の管理まで数多くの機能を初期状態で用意してくれています。

ただ、だからこそ「ある機能」をつくろうとするとある問題が起きることがあります。

その問題点とは・・・・・他のサイトやフレームワークとの統合が難しいという点です。(これはwordpressだけではなく、Laravelもそうです)

そこで!

今回はLaravelで登録されたログイン情報を使ってwordpressにログインできるようにしてみます。

ぜひ参考にしてみてくださいね。

※ 開発環境: Laravel 5.7、wordpress 5.0

前提条件

まず、Laravelにログイン機能がインストールされていて、さらに以下のようにユーザーが登録されているものとします。

もし、ログイン機能をインストールしていない場合は、【Laravel5.6】インストール直後にやること3点の「ログイン、パスワードリマインダー機能を構築」を参考にしてインストールしておいてください。

また、wordpressLaravelと同じサーバーの中にある(つまりwordpressからLaravelのDBにアクセスできる)ものとします。

ログインを実行する手順

実行手順としては次のようになります。

  1. wordpressログインフォームからログインする
  2. Laravel側のDBに登録されているユーザーを取得
  3. 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ユーザーを取得

個人的にはその昔良く書いたコードですが、やっていることはLaravelusersテーブルからメールアドレスが一致するデータを取得しているだけです。

取得するフィールドは次の3つです。

  • name
  • email
  • 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とか使ってたけどあれってどうなったんでしょうね??

といったところで今回は終了です。

ではでは〜!

この記事が役立ちましたらシェアお願いします😊✨