wordpress開発で、複数環境でwp-configを使い分ける方法
こんにちは。オークファン開発部のYです。
先日、3週間くらいの期間で、wordpressサイトの新規構築を担当させていただきました。
wordpressは入社前に、ロリポップ!のレンタルサーバーで自動インストールして使ったことがありましたが、コードを修正して開発したのは今回が初めてでした。
そこで得た知見(Tips?)を記載したいと思います。
wordpress開発で、複数環境でwp-configを使い分ける方法
もくじ
- 複数環境(複数のサーバ)によって、wp-configを分けたい
- wp-configを作成
- wp-configが読み込まれる流れをおさらい
- wp-load.phpで環境変数による切り分けを実装
- httpd.confにて環境変数を設定
- おまけ:現在見ている環境を表示する
- おわりに
複数環境(複数のサーバ)によって、wp-configを分けたい
開発を進めていく上で、複数の異なる環境(サーバー)で、wordpressサイトを確認することになると思います。
- 開発環境(development) -> 例) 開発サーバー、vagrant等の仮想サーバー
- ステージング環境(staging) -> 例) 共有サーバー、事業部(非エンジニア)の確認用、受託の場合お客様確認用など
- 本番環境(production) -> 本番サーバー
- …
このような複数環境によって、DBの向き先等が記載されたconfigを使い分けたいです。
FuelPHP等のPHPフレームワークでは、環境変数を指定してconfigを使い分ける機能がデフォで備わっていますが、
wordpressではそのような機能はありません。
そこで、FuelPHPを参考に、Apacheのhttpd.confで環境変数を指定して、それによってconfigを使い分けるコードを自前で実装したいと思います。
wp-configを作成
wp-config-sample.phpを元に、環境別のconfigファイルを作成します。
- wp-config.development.php
- wp-config.staging.php
- wp-config.production.php
今回はwp-config.{環境変数}.phpという命名規則で作ります。
環境によって異なるのはDB設定の部分と、デバッグモード(WP_DEBUG)のON/OFFあたりかと思います。
wp-configが読み込まれる流れをおさらい
wordpressでは全てのリクエストは基本index.phpに入り(エントリーポイント)、
そこでwp-blog-header.phpが読み込まれ、
wp-blog-header.phpでwp-load.phpが読み込まれ、
wp-load.phpで設定ファイルのwp-config.phpが読み込まれます。
つまり、wp-load.phpで環境による切り分けの処理を書けばよいことになります。
wp-load.phpで環境変数による切り分けを実装
wp-load.phpでwp-config.phpを読み込んでいる箇所です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
if ( file_exists( ABSPATH . 'wp-config.php') ) { /** The config file resides in ABSPATH */ require_once( ABSPATH . 'wp-config.php' ); } elseif ( file_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) { /** The config file resides one level above ABSPATH but is not part of another install */ require_once( dirname(ABSPATH) . '/wp-config.php' ); } else { // A config file doesn't exist |
ここを下記のように変えます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * 環境変数 * Apacheのhttpd.confに下記形式の1行を記載 * * setEnv WP_ENV production */ $env = (isset($_SERVER['WP_ENV']) ? $_SERVER['WP_ENV'] : 'development'); if ( file_exists( ABSPATH . 'wp-config.'.$env.'.php') ) { /** The config file resides in ABSPATH */ require_once( ABSPATH . 'wp-config.'.$env.'.php' ); } elseif ( file_exists( dirname(ABSPATH) . '/wp-config.'.$env.'.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) { /** The config file resides one level above ABSPATH but is not part of another install */ require_once( dirname(ABSPATH) . '/wp-config.'.$env.'.php' ); } else { // A config file doesn't exist |
$envという環境変数を定義します。apache側でWP_ENVという環境変数が指定されているときのみ、その値を適応します。
WP_ENVにproductionがセットされていたら、wp-config.production.phpをrequire_onceして読むこむという具合です。
|
1 |
$env = (isset($_SERVER['WP_ENV']) ? $_SERVER['WP_ENV'] : 'development'); |
この1行は、FuelPHPのfuel/app/bootstrap.phpの下記の書き方を参考にしています。
|
1 2 3 4 5 6 7 8 |
* Your environment. Can be set to any of the following: * * Fuel::DEVELOPMENT * Fuel::TEST * Fuel::STAGING * Fuel::PRODUCTION */ Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT); |
httpd.confにて環境変数を設定
ApacheのVirtualHost設定にて環境変数を指定します。
|
1 2 3 4 5 |
<VirtualHost *:80> ServerName example.com setEnv WP_ENV production (中略) </VirtualHost> |
ステージング環境であれば setEnv WP_ENV staging
開発環境であれば setEnv WP_ENV development
という具合です。
ちなみにwordpress管理画面でhttpsを使用する場合は、SSLのVirtualHost設定の方にも 環境変数を指定しなければなりません。
|
1 2 3 4 5 |
<VirtualHost *:443> ServerName example.com setEnv WP_ENV production (中略) </VirtualHost> |
コレを忘れると、普通のページは指定した環境のDBを見ているのに、 管理画面のときだけ開発環境のDBを見てしまう、ということが起きてしまうので注意です。
おまけ:現在見ている環境を表示する
定義した環境変数$envですが、グローバル宣言をすることでthemes配下のファイル等でも使用可能になります。
|
1 2 3 |
<?php global $env; ?> |
自分の場合、テーマファイルのheader.phpに下記のような行を追加し、 いまどの環境(サーバー)のサイトを見ているのかをコメントで示すようにしました。
|
1 2 3 4 5 |
<?php global $env; if ($env == 'staging') echo '<!-- ステージング環境を見ています! : ' . $_SERVER['SERVER_ADDR'] . ' -->'; ?> |
これは事業部(非エンジニア)の人に対する、ちょっとした工夫です。
開発したサイトを事業部の人に確認してもらう際は、 hosts設定をしてもらって見ていますが、
たまに本番を見ているのか、ステージングを見ているのか分からなくなり、連絡が来ることがあります。
その時は、「ページのソースを見てください!」と事業部の人に伝えておきます。
ステージング環境を見ている場合のみ、下記のようなHTMLコメントが現れるはずです。
(※XXXはサーバーのIPアドレス)
|
1 |
<!-- ステージング環境を見ています! : XXX.XXX.XXX.XX --> |
おわりに
wordpressで環境ごとにconfigを使い分ける方法について書いてきましたが、
他にも良い方法がありましたら、はてブコメント等でお教えください。
弊社技術ブログのwordpressの記事では、こちらもお勧めです! (はてブ180超)
-> WordPress初心者が導入時にやっておきたい10のこと