WordPressテーマ開発(準備編):サイトをローカルにミラーリングする

WordPressで構築したサイトのファイルやデータをダウンロードし、ローカル(自分のPC)のXAMPPにミラーサイトを作成します。そしてそのサイトが動作することを確認します。

(本稿の内容は2013年10月25日公開の「PHPの開発環境を構築する(その1):「Pleiades All in One」のインストール」に記載していましたが、2013年11月13日に分割し、独立した記事としました。)

はじめに

現行サイトで動作する、WordPressのテーマやプラグインを開発していこうと考えています。その準備編として、現行サイトのデータをそのままローカルに持ってきて、実際に動作するミラーサイトを作ります。ミラーサイトにて、作成中のプログラムの、現行サイトに対する動作が確認できるようになります。

本稿は「PHPの開発環境を構築する(その1):「Pleiades All in One」のインストール」に記載した通りに設定しました、以下の環境を対象に記載しております。各ソフトウェアのバージョンが異なる場合は動作が異なると思いますのでご留意ください。

  • OS:Windows7 64bit
  • 環境:Pleiades All in One、Eclipse 4.3 Kepler、PHPパッケージ
    • Eclipse Platform Version: 4.3.0(C:\pleiades\eclipse\eclipse.exe)
    • ApacheFriends XAMPP Version 1.8.1(C:\pleiades\xampp)
      • Apache 2.4.3
      • MySQL 5.5.27 (Community Server)
      • PHP 5.4.7 (VC9 X86 32bit thread safe) + PEAR
      • phpMyAdmin 3.5.2.2
      • XAMPP Control Panel Version 3.1.0 by hackattack142

またレンタルサーバーがphpMyAdminをサービスしている前提で記述します。phpMyAdminのURLやログイン方法については各レンタルサーバーのマニュアルをご確認ください。各レンタルサーバーが提供しているphpMyAdminのバージョンによって、表示が異なると思います。

サイトのミラーリング

データをそのままコピーすることをミラーリングと言います。サイトのMySQLのデータとファイルをローカルに持ってきます。

現行サイトのデータのエクスポート

まずブラウザから現行サイトのphpMyAdminにログインします。

左上から現行サイトのWordPressが参照しているデータベースを選択します。(データベース名がわからない場合はwp-config.phpを見てください。)

すると右側のエリアに、データベース内のテーブルが表示されます。

上のメニューから「エクスポート」をクリックします。

ページの一番下にスクロールし、適当な圧縮を選択して「実行する」をクリックします。

するとブラウザから圧縮されたファイルがダウンロードされます。

(将来、ローカルのデータベースをアップデートするためにサイトのデータをエクスポートする場合は、「DROP TABLE コマンドを追加する」にチェックをします。)

ローカルのデータベースへのインポート

次にローカルのデータベースに、データをインポートします。

XAMPPのコントロールパネルを起動し、そこからローカルのApacheとMySQLを起動します。

コントロールパネルの、MySQLの右の「Admin」をクリックすると、ブラウザにローカルのphpMyAdminが表示されます。

上部のメニューより「データベース」をクリックします。

現行サイトと(なるべく)同じ名前と同じ文字コードを指定し、「作成」をクリックします。

そして左メニューから、作成したデータベースを選択します。

上のメニューから「インポート」をクリックすると、「データベース”xxxx”へのインポート」が表示されます。

「ファイルを選択」をクリックし、ダウンロードした圧縮ファイルを指定します。そしてページ最下部の「実行」をクリックします。

正常終了した旨が表示されます。左側には、インポートされたテーブルが表示されます。

ユーザーの作成

インポートしたデータベースにアクセスできるユーザーを作成します。

上部メニューの「データベース」をクリックします。

インポートしたデータベースの「特権をチェックする」をクリックします。

[ユーザーを追加する]をクリックします。

「ユーザー名」、「ホスト」、「パスワード」、「もう一度入力してください」を入力し、ページ最下部の「ユーザーを追加する」をクリックします。現行サイトのwp-config.phpを見て、同じユーザーとパスワードにしておけばよいでしょう。(異なっても構いません。)

ファイルのコピー

最後にDocumentRoot(例えば「C:/skydrive/workspace/your-site/public_html/」)にサイトのファイル(WordPressのインストールディレクトリまるごと)をコピーします。あるいはFTPクライアントを使って、サイトから丸ごとGETします。

動作確認

ブラウザからサイト内の固定ファイル(例えばreadme.html)に、「http://localhost/readme.html」のようにアクセスし、表示されることを確認します。するとDocumentRootの設定も正しいことがわかります。

固定ファイルが表示されない場合は、httpd.confのDocumentRootを今一度確認し、また次のデバッグのようにエラーログを確認します。

デバッグ

レンタルサーバーにもよりますが、サイトの.htaccessをローカルに持ってきたときに固定ファイルが表示されない、という現象がおきました。そのときの事例をもとにデバッグ方法を示します。

「http://localhost/readme.html」にアクセスしたときに、ブラウザには上のように表示されました。とりあえずApacheのエラーログを見てみます。

XAMPPのコントロールパネルの、Apacheの「Logs」ボタンをクリックし、「Apache (error.log)」を選択します。するとテキストエディタにエラーログが表示されます。

一番下のログを見ると以下の様なレコードでした。

[Tue Oct 22 14:01:54.387830 2013] [core:alert] [pid 11116:tid 1716] [client ::1:51483] C:/skydrive/workspace/mysite/wp/.htaccess: Invalid command 'suPHP_ConfigPath', perhaps misspelled or defined by a module not included in the server configuration

.htaccessに’suPHP_ConfigPath’という不正なコマンドがあるよ、という内容です。これはレンタルサーバーのシステムが.htacessの先頭に自動的に挿入したディレクティブです。mod_suphpというモジュールのディレクティブですが、これがXAMPPに入っていないのでエラーになりました。

そこで.htaccessをテキストエディタで開き、

<IfModule mod_suphp.c>
suPHP_ConfigPath (パス)
</IfModule>

上の様に’suPHP_ConfigPath’を'< IfModule>’で囲むことで解決しました。

ローカルのWordPressを動かす

WordPressを動かそうと「http://localhost/」にアクセスすると、「データベース接続確立エラー」と表示されます。どうやらWordPressも動作しているようですが、正しく動作させるにはもう少し設定が必要そうです。

wp-config.phpの書き換え

wp-config.phpの「// ** MySQL 設定 – こちらの情報はホスティング先から入手してください。 ** //」以下を修正します。

// ** MySQL 設定 - こちらの情報はホスティング先から入手してください。 ** //

if( $_SERVER['HTTP_HOST']==='localhost' ) {
	/** WordPress のためのデータベース名 */
	define('DB_NAME', '(ローカルのデータベース名)');

	/** MySQL データベースのユーザー名 */
	define('DB_USER', (ローカルのデータベースのユーザー名));

	/** MySQL データベースのパスワード */
	define('DB_PASSWORD', '(ローカルのデータベースのユーザー名)');

	/** MySQL のホスト名 */
	define('DB_HOST', 'localhost');
} else {
	/** WordPress のためのデータベース名 */
	define('DB_NAME', '(サイトのデータベース名)');

	/** MySQL データベースのユーザー名 */
	define('DB_USER', '(サイトのデータベースのユーザー名)');

	/** MySQL データベースのパスワード */
	define('DB_PASSWORD', '(サイトのデータベースのパスワード)');

	/** MySQL のホスト名 */
	define('DB_HOST', '(サイトのデータベースのホスト)');
}

16-26行目が既存のサイトのdefineです。カッコ内は各位のサイトのデーターベース接続情報になります。

4-11行目に、これまで設定してきたローカルのデータベースの接続情報を書きます。カッコ内を各位のローカル環境に合わせて書き換えてください。サイトと同じデータベース名、ユーザー名、パスワード等にした場合は、サイトのdefineのコピペでかまいません。

マルチサイトにしている場合は、DOMAIN_CURRENT_SITEにホスト名がdefineされていますので、そこも同様に編集します。(サブドメインでマルチサイトにしている場合は異なるかもしれません。)

if( $_SERVER['HTTP_HOST']==='localhost' ) {
	define('DOMAIN_CURRENT_SITE', 'localhost');
} else {
	define('DOMAIN_CURRENT_SITE', '(ホスト名)');
}

4行目が既存のdefineで、(ホスト名)は各位のサイトのホスト名になります。

データベースの書き換え

インポートしたデータベース内にもホスト名がありますので、それを修正します。

将来ローカルのデータベースを更新することも考え、修正のためのsqlファイルを作成し、適応なフォルダに保存します。

host_rewrite.sql

#	ドメインをlocalhostに書き換える。

SET @src = '(ホスト名)';
SET @dest = 'localhost';

UPDATE prefix_options SET option_value = REPLACE (option_value, @src, @dest)
	WHERE option_name = 'siteurl' || option_name = 'home';

UPDATE prefix_site SET domain = REPLACE (domain, @src, @dest)
	WHERE domain = @src;

UPDATE prefix_sitemeta SET meta_value = REPLACE (meta_value, @src, @dest)
	WHERE meta_key = 'siteurl';

#	以下マルチサイトの場合
UPDATE prefix_blogs SET domain = REPLACE (domain, @src, @dest);

UPDATE prefix_2_options SET option_value = REPLACE (option_value, @src, @dest)
	WHERE option_name = 'siteurl' || option_name = 'home'; 

‘prefix_’はWordPressインストール時に指定したテーブルのプレフィックスに、また(ホスト名)は各位のホスト名に書き換えてください。15行以下はマルチサイトの場合のみ必要です。18-19行はブログの数だけ必要です。この行をコピペして「prefix_2_options」の’2’を各blog_idに変えてください。(テーブルprefix_blogsからblog_idを取得して、あるだけ書き換えるというSQLも書けるかもしれません。私はSQLはほとんど知らないのでベタ書きしました。尚このSQLはサブディレクトリのマルチサイトにしたときのもので、サブドメインのマルチサイトに非対応です。)

またその他にも書き換えが必要なテーブルやレコードがあるかもしれませんが、その都度host_write.sqlを修正しようと思います。

先の「ローカルのデータベースへのインポート」の要領で、phpMyAdminにてhost_rewrite.sqlをインポートするファイルに指定して実行すると、ホストの書き換えが終了します。

このsqlファイルは最低限の書き換えを行っています。プラグインやテーマ等の設定でホスト名を指定している場合は、必要に応じてUPDATE文を追加します。(私の環境では、テーブルprefix_optionsのoptionsにさらに3つホスト名がありましたが、変更の必要なしと判断しました。)

ブラウザから「http://localhost/」にアクセスすると、無事サイトが表示されました。

共有SSLの対応

さくらインターネットの共有SSLをサイトの中で使う」に書きましたように、当サイトのWordPress環境では共有SSLで接続できるようにしています。それに対応させるために.htaccsessにも編集を加えました。

# secure以下へのアクセスは、https://初期ドメインにリダイレクト
RewriteCond %{HTTP_HOST} !^localhost
RewriteRule ^secure/(.*)$ https://user.sakura.ne.jp/wp/secure/$1 [R,L]

2行目を追記し、ローカルからいきなりサイトに飛ばないようにしています。

ローカルではWordPressが動けば十分なので、共有SSLページに関するリダイレクトまではシミュレートしません。

まとめ

既存のサイトをローカルにミラーリングして動作させました。

だいぶ先になると思いますが、そのうちテーマやプラグインの開発をレポートしたいと思います。

コメントを残す