読者です 読者をやめる 読者になる 読者になる

WordPressを使いこなせる上司になろう

WordPressは辛い。何が辛いか。

  • ふとアップデートすると壊れる
  • こまめにアップデートしていると割と大丈夫だけど、ちょっと期間が空くと壊れる
  • WordPressCSSの変更したら壊れた画面が全世界に配信された
  • プラグインを入れたら画面が見れなくなった

基本的には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をなんとかする方法を考えましょう。

ApacheMySQLをセットアップする

Apacheは手元のMacで動かしたくないので、Vagrantを使います。MySQLは、弊社で開発しているRailsアプリでも使うので、全部のMacにインストールされているので特に問題になりません。MySQLが無い人はがんばってインストールしてください。

なぜMySQLVagrantに含めないのかというと、データベースは開発の全行程を通して使い回したいことの方が多いからです。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にアクセスすれば良い。

WordPressは別リポジトリで管理

WordPressのサイトはsite/wordpressに置くものとします。ここは別のリポジトリにするのが前提になっています。

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でパスワード無しでログインできる設定です。私は開発用マシンならばこれで良いと思いますが(本番用はもちろんちゃんとパスワード設定します)、いろいろポリシーがあると思います。

開発を始めるときの手順

こんな感じで設定するようにすると、開発を始めるときの手順はこんな感じになります。

  1. local-wordpressリポジトリ$ git cloneしてくる
  2. リポジトリsite/wordpress以下に、WordPressのアーカイブを展開する
  3. $ vagrant upする
  4. http://localhost:8080にアクセスしたときにWordPressサイトに繋がるようになっているので、いろいろサイト作成の作業を行う
  5. wp-config.phpを編集して、ついでにdevelopment-config.phpを作る
    1. wp-config.phpには、上のPHPのコードをコピペして、本番環境の設定を書く(後回しでもok)
    2. development-config.phpには、開発環境用の設定を書いておく
  6. サイト用のリポジトリを作る
    1. site以下を新しいGitリポジトリとして作成する
    2. development-config.phpリポジトリに含めないように.gitignoreを設定する
    3. wp_contents以下のファイルもリポジトリに含めないように.gitignoreを設定する

今後の課題と想定される質問

デプロイをどうするのかまだ考え中。一番素朴にやると、普通にSSHでサーバにログインして$ git pullするとかになるけど、ちょっと悲しいのであんまりやりたくない。Capistranoとかでうまいことできるはず。

Vagrantがちゃんと動かない
ネットワークの設定がちゃんと動かない事件が発生したことがあります。VMWareを使うようにすると、ちょっとは安定するようになります。
データベースの内容に依存するようなコードを書かざるを得ないけどどうしたものか
どうしたもんか……カテゴリとか記事のIDとかが、HTMLに出てくる問題には困っている。開発開始時とか、デプロイ時にMySQLのデータをコピーする戦略くらいしか思いつきません。
Vagrantpressって知ってる?
知ってるけど、あれはプラグインを作るための環境なので、ちょっと今回の用途には合わない。これはサイトを作りたいときの話。具体的には、VagrantpressだとVagrantを起動するたびにMySQLの内容が消えたりするところが、使いにくい。
デプロイがめんどうならHerokuとか使えば?
ちょっとやってみるとすげええ面倒くさいので、お勧めしません。面倒くさいというのは、実際にサイトを運用する手順の話なので致命的である。画像アップロードとかはWordPressはかなり良い感じの実装が(クライアントサイド的には)されているのですが、それを全て捨てて、変なプラグインを使うことになります。お勧めはしない。