現役プログラマのWordPressカスタマイズ相談

WordPress(ワードプレス)のお悩み、うまくいかなくてお困りなこと、不具合調査、新規制作依頼まで、ウェブアプリケーションエンジニアがあなたをサポートします。

WordPressとPHP/Laravelの共存をCloud9で検証

f:id:jsaz:20161210140622p:plain
共存という言葉だけだと理解しにくいですが、WordPressとLaravelを同じURLで扱うことを言います。
連携とか共存という言葉で検索されることが多いです。

実際にどのように連携するのかというと、考え方はとても簡単です。
WordPressのindex.phpとlaravelのindex.phpをそれぞれ動かしたい方に合わせてhtaccessで制御することができればいいのです。
今回も作ったらすぐに廃棄することができるCloud9を使って実際にやってみます。

まずはCloud9のPHPのバージョンを確認してみます。

Cloud9デフォルトのPHPバージョン確認

cloud9:~/workspace $ php -v
PHP 5.5.9-1ubuntu4.19 (cli) (built: Jul 28 2016 19:31:33)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
with Xdebug v2.4.1, Copyright (c) 2002-2016, by Derick Rethans


LaravelはPHP5.6以上が動作条件なのでPHPのアップデートが必要です。

PHP7へのアップデートはコチラを。
soudan.hatenablog.jp




PHP/Laravelコース新設
PHPだけでは仕事はできない。もっとも職場で選ばれるPHPフレームワーク「Laravel」をパーソナルメンターが週2回のマンツーマンで対応してくれる学習プログラム。
・1回30分のビデオチャットサポート
・毎日8時間待機、テキストチャットサポート
・回数無制限の課題レビュー
詳しくはコチラ

PHP5.6アップデート

PHP5.6へのアップデートは下記の英語のサイトが役にたちました。

community.c9.io

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install libapache2-mod-php5.6
sudo a2dismod php5
sudo a2enmod php5.6
sudo add-apt-repository ppa:ondrej/php5-compat
sudo apt-get update
sudo apt-get dist-upgrade

このコマンド通りでPHP5.6にアップデートすることができます。
ENTERとYを入力させるのが数度ありましたが、気にしませんでした。

Cloud9のコンソールでPHPのバージョンを確認します。

cloud9:~/workspace $ php -v
PHP 5.6.28-2+deb.sury.org~trusty+1 (cli)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
  with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

5.6になっていますね。

PHP5.6の変更点、新機能はこちらをご覧ください。
qiita.com

WordPressをインストール

今回はworkspace直下にWordPressをそのままインストールしました。

cloud9:~/workspace $ ls -la
total 304
drwxr-xr-x 12 ubuntu ubuntu  4096 Dec  9 10:29 ./
drwxr-xr-x 38 ubuntu ubuntu  4096 Dec  9 10:30 ../
drwxr-xr-x  3 ubuntu ubuntu  4096 Nov 15 02:09 .c9/
-rw-r--r--  1 ubuntu ubuntu   235 Nov 17 09:25 .htaccess
-rw-r--r--  1 ubuntu ubuntu   929 Nov  1 05:45 README.md
-rw-rw-r--  1 ubuntu ubuntu   261 Nov  1 05:45 hello-world.php
-rw-r--r--  1 ubuntu ubuntu   418 Sep 25  2013 index.php
-rw-r--r--  1 ubuntu ubuntu 11620 Dec  8 10:28 install.txt
-rw-r--r--  1 ubuntu ubuntu 19935 Mar  5  2016 license.txt
-rw-r--r--  1 ubuntu ubuntu 69092 Nov  1 05:45 php.ini
-rw-r--r--  1 ubuntu ubuntu 10214 Nov 17 09:26 readme.html
drwxr-xr-x  2 ubuntu ubuntu  4096 Nov  1 06:08 wordpress/
-rw-r--r--  1 ubuntu ubuntu  5456 May 24  2016 wp-activate.php
drwxr-xr-x 10 ubuntu ubuntu  4096 Nov 17 09:26 wp-admin/
-rw-r--r--  1 ubuntu ubuntu   364 Dec 19  2015 wp-blog-header.php
-rw-r--r--  1 ubuntu ubuntu  1477 May 23  2016 wp-comments-post.php
-rw-r--r--  1 ubuntu ubuntu  3834 Nov 17 09:26 wp-config-sample.php
-rw-r--r--  1 ubuntu ubuntu  3058 Nov  1 06:08 wp-config.php
drwxr-xr-x  9 ubuntu ubuntu  4096 Dec  9 10:27 wp-content/
-rw-r--r--  1 ubuntu ubuntu  3286 May 24  2015 wp-cron.php
drwxr-xr-x 17 ubuntu ubuntu  4096 Nov 17 09:26 wp-includes/
-rw-r--r--  1 ubuntu ubuntu  2382 May 23  2016 wp-links-opml.php
-rw-r--r--  1 ubuntu ubuntu  3353 Apr 14  2016 wp-load.php
-rw-r--r--  1 ubuntu ubuntu 34057 Jun 14 21:51 wp-login.php
-rw-r--r--  1 ubuntu ubuntu  7786 Jul 13 12:37 wp-mail.php
-rw-r--r--  1 ubuntu ubuntu 13920 Aug 13 16:02 wp-settings.php
-rw-r--r--  1 ubuntu ubuntu 29890 May 24  2016 wp-signup.php
-rw-r--r--  1 ubuntu ubuntu  4035 Nov 30  2014 wp-trackback.php
-rw-r--r--  1 ubuntu ubuntu  3064 Jul  6 12:40 xmlrpc.php

WordPresshttps://[プロジェクト名].c9users.io/ でアクセスできる状態です。
フォルダアップでもgitからのインストールでもどちらでも構いません。

Laravelをインストール

続いてLaravelのインストールです。
同じくCloud9のコンソールからコマンドを使いインストールします。
最後の「laravel」というフォルダのlaravelプロジェクトを作成します。

cloud9:~ $ composer create-project --prefer-dist laravel/laravel laravel
Installing laravel/laravel (v5.3.16)
  - Installing laravel/laravel (v5.3.16)
  Downloading: 100%

Created project in laravel
> php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing vlucas/phpdotenv (v2.4.0)
  Downloading: 100%
  - Installing symfony/polyfill-mbstring (v1.3.0)
  Loading from cache
  - Installing symfony/var-dumper (v3.1.7)
  Downloading: 100%
  - Installing symfony/translation (v3.1.7)
  Downloading: 100%
  - Installing symfony/routing (v3.1.7)
  Downloading: 100%
  - Installing symfony/process (v3.1.7)
  Downloading: 100%
:
  - Installing phpdocumentor/reflection-docblock (3.1.1)
  Downloading: 100%
  - Installing phpspec/prophecy (v1.6.2)
  Downloading: 100%
  - Installing myclabs/deep-copy (1.5.5)
  Downloading: 100%
  - Installing phpunit/phpunit (5.7.2)
  Downloading: 100%
  - Installing symfony/css-selector (v3.1.7)
  Downloading: 100%
  - Installing symfony/dom-crawler (v3.1.7)
  Downloading: 100%

symfony/var-dumper suggests installing ext-symfony_debug ()
:
paragonie/random_compat suggests installing ext-libsodium (Provides a modern crypto API that can be used to generate random bytes.)
ramsey/uuid suggests installing ircmaxell/random-lib (Provides RandomLib for use with the RandomLibAdapter)
:
psy/psysh suggests installing ext-pdo-sqlite (The doc command requires SQLite to work.)
monolog/monolog suggests installing aws/aws-sdk-php (Allow sending log messages to AWS services like DynamoDB)
:
league/flysystem suggests installing league/flysystem-aws-s3-v2 (Allows you to use S3 storage with AWS SDK v2)
:
sebastian/global-state suggests installing ext-uopz (*)
phpunit/php-code-coverage suggests installing ext-xdebug (>=2.4.0)
phpunit/phpunit suggests installing phpunit/php-invoker (~1.1)
phpunit/phpunit suggests installing ext-xdebug (*)
Writing lock file
Generating autoload files
> Illuminate\Foundation\ComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader
The compiled class file has been removed.
> php artisan key:generate
Application key [base64:XXXXXXX=] set successfully.

処理結果を貼り付けると長くなりましたので一部省略しましたが、こちらもスムーズにインストールできました。

LaravelとWordPressディレクトリ構成はいろいろ考えられますが、今回はLaravelをインターネットで見えない場所に配置(rootより上の階層)、WordPressと同じディレクトリにLaravelのpublicディレクトリ内のファイルを配置するという方法をとっています。

Cloud9 ┬ laravel ┬ app
       │         ├ :
       │         └ vendor
       └ workspace ┬ index.php
                   ├ wp-config.php
                   ├ wp-content
                   ├ wp-admin
                   ├ :
                   └ wp-includes


ひとまずLaravelを動かせるようにするため、laravel/publicフォルダ内のファイルをworkspaceへ移動させます。
その時、Laravel側のindex.phpをindex_laravel.phpとしておきます。

Cloud9 ┬ laravel ┬ app
       │         ├ :
       │         └ vendor
       └ workspace ┬ index.php
                   ├ index_laravel.php ← laravelのindex.php
                   ├ css               ← laravelのcssフォルダ
                   ├ js                ← laravelのjsフォルダ
                   ├ wp-config.php
                   ├ wp-content
                   ├ wp-admin
                   ├ :
                   └ wp-includes


次に移動させたindex_laravel.phpの修正です。
autoloadとappを読み込ませるためにパスを正しいものに書き換えます。
ロリポップやエックスサーバーの場合は、フルパスでもOKです。

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels nice to relax.
|
*/

require "../laravel/bootstrap/autoload.php";

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/

$app = require_once "../laravel/bootstrap/app.php";


index_laravelへアクセスしてみてください。
https://[プロジェクト名].c9users.io/index_laravel.php

f:id:jsaz:20161210140137p:plain

Laravelの初期画面が表示されれば問題はありません。

htaccessを使って共存させる


この状態だとindex_laravel.phpにアクセスしない限り、Laravel側のプログラムを実行することができません。
特定のパスだったらLaravel側のプログラム処理を行う(WordPressを通さない)ようにしてみましょう。

たとえばLaravel側にeventというパスで何らかの処理を作っていた場合はRewriteRuleを追加します。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^event/(.*) /index_laravel.php [L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress


これで https://[プロジェクト名].c9users.io/event/ へアクセスされた場合はWordPressを通さず、Laravelを呼び出すことが可能です。

ただしWordPressの固定ページやカテゴリ名に「event」を作ると正常に遷移できなくなるので注意してください。
htaccessは上から有効になります。


ディレクトリ構成
・htaccessとファイルパスの設定

この2点を意識すれば、WordPressとLaravelの共存は可能です。
この記事に載せた方法とは別の方法も存在しています。