WordPressのテーマ、プラグインを開発するときビルトインウェブサーバーがオススメ

自分のWordPressブログのためにテーマやプラグインを作っているとどうしても自分のブログのデータでテストがしたくなる。

そこでデータベースをローカルにコピーしてウェブサーバはPHP5.4のビルトインウェブサーバーの機能を使ってWordPressを実行している。

メリットはrouter.phpを使うことでwp_config以外で開発向けの設定などを追加できる点。以下のような設定で動かしている。

<?php
if (php_sapi_name() != 'cli-server') {
    header('location: index.php');
    exit;
}

if (preg_match('/\.(?:png|jpg|jpeg|gif|css|js)$/', parse_url($_SERVER["REQUEST_URI"])['path'])) {
    return false;
}

define('WP_HOME','http://localhost:8080');
define('WP_SITEURL','http://localhost:8080');
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', true);
ini_set("log_errors", 1);
ini_set("error_log", __DIR__.'/php_error.log');

$filename = $_SERVER['SCRIPT_FILENAME'];
if (file_exists($filename)) {
    chdir(dirname($filename));
    include $filename;
} else {
    include 'index.php';
}

if (function_exists('is_admin') && is_admin()) {
    deactivate_plugins(
        array(
            ABSPATH . '/wp-content/plugins/pluginA/pluginA.php',
            ABSPATH . '/wp-content/plugins/pluginB/pluginB.php',
        )
    );
}


WordPressのディレクトリにrouter.phpファイルを置いて、以下のコマンドでウェブサーバを実行できる。

cd /path/to/wordpress
php -S 0.0.0.0:8080 -t . router.php

0.0.0.0にしているのはたまにスマホなど他の端末からアクセスすることがあるため。その際はWP_HOMEWP_SITEURL もlocalhostではなくそのマシンのIPアドレスに直したりする。

ポイント1. URL

WordPressはデータベースにサイトのURLを持っているのでログインなどリダイレクト時にそのURLに飛ばされてしまうことがある。WP_HOMEWP_SITEURL を設定しているとデータベースの値よりこちらを優先してくれる。

この技はサイトの移行時などにデータベースに古いURLが残っていてアクセスができないときにも使える。

ポイント2. 他のプラグインの無効

WP_DEBUG_LOGを有効にして困るのは、他のプラグインが非推奨のWordPressのapiを使っていたりするせいで大量に警告が出力され自分のテーマやプラグインの警告を見失なってしまうことである。

もう1つ困るのはSNSに投稿するなど開発環境では実行してほしくないプラグインがあることである。

こういった場合は deactivate_plugins を使ってテスト環境では無効にしてしまえばいい。管理ページを開くと無効になる。

まとめ

PHP5.4のビルトインウェブサーバーはApacheやNginxをわざわざ用意しなくてもよく、任意のタイミング、任意のディレクトリ、任意のポートでいくつも実行できるということからも使い勝手が良い機能である。

こんなことruby(Rack)では当たり前のことだと思われるだろうが、ようやくPHPもつかえる開発言語になってきたと思う。というわけでWordPressだけでなくPHPウェブアプリの開発では積極的にビルトインウェブサーバー利用すると良いだろう。