九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、ここ数年特に感じることなんですけど、wordpressが人気をあつめていて、ブログじゃなくてもwordpressをカスタマイズしてウェブサイト開発したいという案件を目にすることが増えてきました。
もちろんwordpressはブログとして開発されているので、何か複雑ことをしようとするとLaravelなどで独自の開発をするべきだと思いますけど、ランディングページなど簡易的なページでしたら、問題なく活用できると思っています。(メリットとしてクライアントさんが自分自身でコンテンツを変更できる点が大きいですね)
で、もしLaravelからwordpressのデータベースにアクセスしたいとなったときはどうすればいいのかを今後のためにもまとめておくことにしました。
結論からすると、たった2つのファイルだけで完了します。
では、実際の方法を見てみましょう。
開発環境
- Laravel 5.6
- wordpress 4.9.5
- PHP 7.2
- Apache 2.4
- MySQL 5.7
やりたいこと
ゴールは、LaravelのEloquent(モデル)を使ってwordpressのデータベースにアクセスし、投稿した全記事を取得して表示する、というものです。
実際の手順
データベース接続情報を追加する
wordpressとLaravelのデータベース構造は少し違っているので、デフォルトの接続情報を変更するのではなく、新しくwordpress専用の接続情報を追加しましょう。
変更するファイルは、
/config/database.php
です。
このファイルを開いてみると、中が配列になっていて、「connections」という項目が見つかると思います。
そして、デフォルトでは以下のように、「mysql」という名前で接続情報が書かれています。
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ],
では、wordpressのデータベースへの接続情報として、同じように「mysql_wp」を追加します。
/* 'mysql' => [...], */ 'mysql_wp' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => '(YOUR-DATABASE)', 'username' => '(YOUR-USERNAME)', 'password' => '(YOUR-PASSWORD)', 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ],
重要なのは、以下の3つです。
それぞれ必要な情報を書き込んで下さい。
- database ・・・ 接続するデータベース名。
- username ・・・ 接続するデータベースにログインするユーザー名。
- password ・・・ 接続するデータベースにログインするパスワード。
※ちなみに、実行環境の切り替えがしやすいので、本来ならデフォルトのように「.env」を使った記述をしておくべきですが、今回はサンプルなので割愛しています。
モデルを作成
では、データベースにアクセスするモデルをコマンドで作ってみましょう。
php artisan make:model WpPost
これで、「/app/WpPost.php」が作成されているので、接続先をさっき追加した「mysql_wp」に変更します。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class WpPost extends Model { protected $connection = 'mysql_wp'; }
はい。
準備はこれで完了です。
ちなみに、Laravelのルールでモデル名が「Post」なら、「posts」というテーブルを、「Item」なら「items」を、というように複数形のテーブル名を参照するように決まっています。
ただ、そうなると「wp_postmeta」には接続ができなくなってしまうので、そんな場合は、以下のように「$table」も追加します。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class WpPostMeta extends Model { protected $connection = 'mysql_wp'; protected $table = 'wp_postmeta'; }
さぁ、すべてこれで準備は完了です!
実際にデータにアクセスしてみる
では、どこでもいいのでコントローラーを作って、wordpressのデータベースにアクセスしてみましょう。
と、いっても通常通りLaravelのやり方でコードを書くだけです。
public function wp_db() { $posts = \App\WpPost::all(); $posts->dd(); }
はい。
うまくデータが表示されました。
もちろん、createやupdate、deleteなどでデータの追加/変更/削除もできます。(ただし、wordpress内部でいろいろなデータ操作が同時に行われている可能性があるため、むやみに変更するのはおすすめしません。)
もっとシンプルに
もし、「モデルをつくるほど頻繁に使わないんだけど??」という場合は、以下のように「DB::table()」を使でばいいでしょう。
$posts = \DB::connection('mysql_wp')->select('SELECT * FROM wp_posts');
※select()の中身がSQL文になっていることに注意してください。
このやり方を使えば、動的な切り替えも可能ですね。
もっと簡潔に
もし、wordpressのテーブルにある項目に「wp_」などプリフィックスが入っている場合は、接続情報の「prefix」を設定してやれば、「wp_」は省略することが可能です。
'mysql_wp' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => '(YOUR-DATABASE)', 'username' => '(YOUR-USERNAME)', 'password' => '(YOUR-PASSWORD)', 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => 'wp_', 'strict' => true, 'engine' => null, ],
例えば、「Post」とすれば、「wp_posts」にアクセスできますし、
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { protected $connection = 'mysql_wp'; }
テーブル名を指定するときでも、「wp_」を書かずに済みます。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { protected $connection = 'mysql_wp'; protected $table = 'postmeta'; }
書くコードが「少ない=バグ」が少ないということにつながるので、こういうテクニックも活用してみてはいかがでしょうか。
おわりに
ということで今回は、Laravel側からwordpressのデータベースにアクセスする方法を紹介しました。逆にwordpressから別のデータベースにアクセスする方法も需要としてはあると思いますので、そのうち時間ができたら記事にしてみたいと思います。
ではでは〜。