WordPressを使いこなせる上司になろう
WordPressは辛い。何が辛いか。
- ふとアップデートすると壊れる
- こまめにアップデートしていると割と大丈夫だけど、ちょっと期間が空くと壊れる
- WordPressでCSSの変更したら壊れた画面が全世界に配信された
- プラグインを入れたら画面が見れなくなった
基本的にはWordPress使いたくないんだけど、そうはいってもBlogとかをいちいち自分で作るのは明らかにばかげているので、しぶしぶWordPressを使います。でも辛い。辛いのはできるだけ避けたいので、できるだけ辛くなくWordPressを使う方法を考えました。
基本的な戦略
普通に記事を書くときは別ですが、CSSとかプラグインとかを変更するときは、いきなり本番環境に適用するのではなくて手元の環境でちゃんと確認するべきです。
つまり、普通のWebアプリケーションを開発するときの流れをそのまま適用したい。普通どうするかというと、手元のPCに開発用の環境を作って、そちらで開発をします。また、Gitなどのバージョン管理ツールを使って、変更を追跡します。手元でちゃんと動作することを確認できる状況になったら、その時点でGitに変更を記録して、Productionのサーバにデプロイする。それでもぶっ壊れたらGitから古いちゃんと動作するバージョンを取ってきて元に戻す。これが基本的な流れです。
WordPressで作るサイトでも、この流れに乗りたい。もちろん、WordPressで記事を書くときはWebのUIをそのまま使うべきです。しかし、プラグインを入れたり、PHPを書いたり、CSSを書いたりしているときには、そうではない。
開発環境と本番環境を使い分ける
まず、開発環境と本番環境で、いくつか違うことをやらないといけない場面がありますので、それを切り替えられるようにします。切り替えないといけないことというのは、
- トップページのURL
- データベースの設定
などがあります。Railsではdatabase.yml
に書いたり、config/environments/development.rb
とかに書いたりするやつのことですね。また、例えばThe Twelve-Factor Appなんかでは、設定は環境変数に入れろと書いてあります。が、ここでは面倒なのでソースコードにそのまま書きます。
wp-config.php
にこんな感じで書きます。
if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/'); if ($_SERVER["WPEnv"] == "development") { if (file_exists(ABSPATH . "development-config.php")) { require_once(ABSPATH . "development-config.php"); } } else { define('DB_NAME', ...); define('DB_USER', ...); define('DB_PASSWORD', ...); define('DB_HOST', ...); define('WP_SITEURL', 'http://blog.ubiregi.com'); define('WP_DEBUG', false); }
WPEnv
という環境変数にdevelopment
とか入れておくことにして、それで設定を切り替えます。本番環境用の設定はソースコードにそのまま書いていますが、開発環境用の設定はファイルから読み込みます。これは、開発環境では、個々の開発者・計算機によって、適切な設定が変わるからです。具体的にはMySQLの設定とかがホスト名によって変わります。あと、WPEnv
は、Apacheの設定ファイルで設定します。
多分、設定しておいたほうが良いのは、
- WP_SITEURL
- DB_NAME
- DB_USER
- DB_PASSWORD
- DB_HOST
- WP_DEBUG
くらいだと思います。
ApacheとMySQLをセットアップする
Apacheは手元のMacで動かしたくないので、Vagrantを使います。MySQLは、弊社で開発しているRailsアプリでも使うので、全部のMacにインストールされているので特に問題になりません。MySQLが無い人はがんばってインストールしてください。
なぜMySQLをVagrantに含めないのかというと、データベースは開発の全行程を通して使い回したいことの方が多いからです。Vagrantに入れておくのも一つの方法ですが、その場合vagrant destroy
するたびに全部データが消えます。消えてもいい人はそっちの方が設定が簡単になるので良いかもしれませんね。
適当にVagrantの設定を作ってあるので、見てみてください。
それぞれ設定のポイントを列挙します。
ネットワーク関連
VagrantからMacにアクセスできるようにVagrantfile
で設定しています。多分これはVirtualBoxのみの設定なので、VMWareとか使う人は適宜書き換えてください。起動時に必ずネットワーク設定を確認されるので、それがうざい人もまあ各自でなんとかすること。
avahi-daemon
をインストールしてあるので、VMからMacに名前でアクセスできるようになっています。上述のdevelopment-config.php
を作るときに、MySQLのサーバ名を名前で設定できて便利。なはず。
また、localhost:8080
にアクセスしたときに、VMのポート80に繋がるように設定しています。開発中のWordPressサイトにアクセスするときは、http://localhost:8080
にアクセスすれば良い。
Apacheの設定
Apacheの設定はwordpress.conf
に書いてあります。ここでWPEnv
を設定するようになっています。
あとはログとかの設定は、VMの中と共有されたlog
ディレクトリに書き出すように設定しています。
MySQLの設定
MySQLは、次の2点を設定します。
- ローカルホスト以外の接続を受け付けるように設定すること
- ちゃんとユーザを作っておく
VMで動いているWordPressから実機のMacで動いているMySQLに接続することになるので、別の計算機からログインできるようになっている必要があります。試すには、Macで、
$ mysql -h `hostname` <その他のオプション>
などとして、ちゃんと繋がるかどうかを確認します。
開発用のデータベースなので、できるだけ簡単になにも考えずに接続できる設定にする、という場合は、
bind-address=*
GRANT ALL PRIVILEGES ON *.* TO root@'%';
などとします。どこからでも接続できて、ユーザー名
root
でパスワード無しでログインできる設定です。私は開発用マシンならばこれで良いと思いますが(本番用はもちろんちゃんとパスワード設定します)、いろいろポリシーがあると思います。
開発を始めるときの手順
こんな感じで設定するようにすると、開発を始めるときの手順はこんな感じになります。
local-wordpress
のリポジトリを$ git clone
してくる- リポジトリの
site/wordpress
以下に、WordPressのアーカイブを展開する $ vagrant up
するhttp://localhost:8080
にアクセスしたときにWordPressサイトに繋がるようになっているので、いろいろサイト作成の作業を行うwp-config.php
を編集して、ついでにdevelopment-config.php
を作るwp-config.php
には、上のPHPのコードをコピペして、本番環境の設定を書く(後回しでもok)development-config.php
には、開発環境用の設定を書いておく
- サイト用のリポジトリを作る
今後の課題と想定される質問
デプロイをどうするのかまだ考え中。一番素朴にやると、普通にSSHでサーバにログインして$ git pull
するとかになるけど、ちょっと悲しいのであんまりやりたくない。Capistranoとかでうまいことできるはず。
- Vagrantがちゃんと動かない
- ネットワークの設定がちゃんと動かない事件が発生したことがあります。VMWareを使うようにすると、ちょっとは安定するようになります。
- データベースの内容に依存するようなコードを書かざるを得ないけどどうしたものか
- どうしたもんか……カテゴリとか記事のIDとかが、HTMLに出てくる問題には困っている。開発開始時とか、デプロイ時にMySQLのデータをコピーする戦略くらいしか思いつきません。
- Vagrantpressって知ってる?
- 知ってるけど、あれはプラグインを作るための環境なので、ちょっと今回の用途には合わない。これはサイトを作りたいときの話。具体的には、VagrantpressだとVagrantを起動するたびにMySQLの内容が消えたりするところが、使いにくい。
- デプロイがめんどうならHerokuとか使えば?
- ちょっとやってみるとすげええ面倒くさいので、お勧めしません。面倒くさいというのは、実際にサイトを運用する手順の話なので致命的である。画像アップロードとかはWordPressはかなり良い感じの実装が(クライアントサイド的には)されているのですが、それを全て捨てて、変なプラグインを使うことになります。お勧めはしない。