WordPressのサーバ引っ越しには様々なツールやプラグインがありますが、かつて管理人が遭遇してちょっと困った事例と解決方法です。
なお、通常はここで紹介する方法が必要になることはないと思いますが、自分の備忘録を兼ねてご紹介します。
WordPress複製の条件
某サーバ上で複数のドメインを管理しており、その内の開発用のドメイン(ここでは複製元ドメインと呼びます)から本番環境のドメイン(同じく複製先ドメインと呼びます)へWordPressを複製する必要がありました。
ウェブサーバだけでなくデータベースサーバも同じ物理サーバ上で稼働しています。同一サーバ上であってもドメインごとに他のドメインで使用しているデータベースは直接は見えないようにしています。
なお、上記条件から複製元、複製先の各ドメインではウェブサーバ、PHP、データベースサーバ等全て同条件(バージョンなど)である前提とします。
問題発生と原因
WordPressを手動で複製(または引っ越し)する場合、おおまかには次の作業を行います。
- 複製元ドメインのWordPressのファイルを複製先ドメインへ移す
- 複製元ドメインのWordPressのデータベースを複製先ドメインへ移す
- 複製先ドメインのデータベースを(そのドメインに合わせて)修正する
面倒だし時間も相応にかかりますが、解ってしまえば作業自体は簡単です。
しかし、今回のケースでは2番目のデータベースの複製でエラーが発生し、作業が継続できませんでした。
原因は、データベース名とデーターベースユーザー名が既に複製元ドメインで使用しているため、複製先ドメインで同じ名前を作成できないというものでした。考えてみれば当然のことなのですが、複製先ドメインから見たらデータベースはひとつもない(見えない)ので、名前が重複するというケースを見落としていました。
解決方法
名前の衝突が原因なら名前を変えれば解決できるはずです。
ただ、そのためには単にファイルとデータベースを移すだけでなく、多少の細工が必要になります。
ここでは、その「細工」も含めたWordPressの複製(ドメイン変更含む)の手順をご紹介します。
なお、現在の当該「某サーバ」にはPleskとWordPressToolkitがあり、クリックひとつでWordPressの複製が可能なため、ここで紹介する方法は不要となりました。
複製手順
①複製元ドメインのデータをローカルにダウンロード
FTPとphpMyAdminが使える前提です。同じ事ができれば別の方法でも構いません。
細かいことは書きません。
WordPressのファイル一式をFTPでローカルにダウンロードし、データベースはphpMyAdminからエクスポートしましょう。
②複製先ドメインに新規データベースを作成
複製先ドメインはファイルもデータベースも空の前提です(実際には、これから複製するWordPressと衝突しなければ空でなくてもOKです)。
複製先ドメインに新しくデータベースを作り、その際の「データベース名」、「データベースユーザ名」、「パスワード」を控えておきましょう。
「データベース名」と「データベースユーザ名」は複製元ドメインで使用している名前とは別のものにします(というより同じだと作成できない)。
③wp-config.phpを修正
ローカルにダウンロードしたWordPressのファイルに「wp-config.php」というファイルがあります(WordPressをインストールしたフォルダの直下にあるはずです)。
この「wp-config.php」をテキストエディタ(メモ帳でOK)で開き、下記の部分を先ほど作成したデータベースの情報に書き換えます。
「DB_HOST」の値は書き換えませんが後で使うので気にしておきます(環境によっては書き換える必要があるかもしれません)。
define('DB_NAME', '【②で作成したデータベース名】');define('DB_USER', '【②で作成したデータベースユーザー名】');define('DB_PASSWORD', '【②で作成したパスワード】');define('DB_HOST', 'localhost:3306');
④ファイルとデータベースを複製先ドメインにアップロード・インポート
①でダウンロードしたファイルは、FTPで丸ごとアップロードします(「wp-config.php」は書き換え済みのもの)。
①でエクスポートしたデータベースのデータは、②で作成したデータベースへphpMyAdminからインポートします。
⑤ドメイン変更にともなうデータベースの修正
④でインポートしたデータベースは、その内容が複製元ドメインのものになっているため、このままでは正常に動作しません。
そこで、データベース内の複製元ドメイン名の文字列を複製先ドメインへ置換し、さらにデータベース内の整合性を整えるスクリプトの力をお借りします。
なお、スクリプトの利用は自己責任になりますが、データベース内の文字列を単純に置換しただけだとやはり不具合が残るらしいので、ここで紹介するスクリプトを利用するのが良いようです。
使用するのは「Search Replace DB」(Search and Replace for WordPress Databases Script)というスクリプトです。2020年12月時点ではver4系になっています(管理人はver3.1.0を使っていたのですが、いつの間にかver4系になっていました)。ここではver4.1.2を使用しています。
Github
https://github.com/interconnectit/Search-Replace-DB
公式サイト
https://interconnectit.com/search-and-replace-for-wordpress-databases/
Githubからダウンロードしたzip解凍すると「Search-Replace-DB-master」というフォルダができるので、このフォルダごと複製先ドメインのWordPressのインストールフォルダにアップロードして、当該URLをブラウザで開きます。なお、Githubではなく公式サイトからダウンロードすると解凍時にできるフォルダ名が異なる(フォルダ名にバージョン番号が含まれている)らしいのでURLの入力を間違えないように注意してください。
例:WordPressを「wp」フォルダにインストールしている場合のURL
https://【複製先ドメイン】/wp/Search-Replace-DB-master/
replace:複製元ドメイン名(末尾の「/」は不要)
with:複製先ドメイン名(末尾の「/」は不要)
database name:②で作成したデータベース名
username:②で作成したデータベースユーザー名
pass:②で作成したパスワード
host:「localhost」(wp-config.phpの「DB_HOST」の値に合わせます)
port:「3306」(同上。ただしMaria DB5は「3306」、Maria DB10は「3307」のようなので適宜)
ここで「Test Connection」を押してデータベースに接続できることを確認します。データベース周りの入力に誤りがなければボタンの横に「Success. You are connected.」と表示が出ます。
Which Tables?:「all tables」を選択(デフォルト)
以上を入力したら「Do a safe test run」ボタンを押すと置換テストが実行され、置換シミュレーションの結果を見ることができます。BDの実際の書き換えは行われません。テスト実行の結果を一応斜め読みして、入力したドメイン名(URL)等に間違いがないことは見ておきましょう。
※この時「Yoastプラグインに原因がある」的な主旨のメッセージが表示されますが、実際に「Yoast」というプラグインがあるようで、これを使っていなければ問題ないようです(ver3.1.0ではこのような表示は見たことがありませんでした)。
実際のDBの書き換えは「Search and Replace」ボタンで行います。
最後に必ず「delete me」ボタンを押すか、またはFTPから手動で「Search-Replace-DB-master」フォルダをサーバ上から削除してください。
※ver4.1.2では「delete me」ボタンによる削除ではフォルダといくつかのファイルは残ってしまいます。ですのでFTPから手動でフォルダごと削除する方が良いでしょう(ちなみにver3.1.0ではフォルダごとすべて削除されていました)。
⑥複製先のWordPressにログインして設定等を確認
以上で複製作業は完了ですが、複製先のWordPressにログインして各設定などを確認しましょう。
ユーザーやパスワードは複製元のままで同じものが使えます。
「設定」>「一般」の「WordPress アドレス (URL)」や「サイトアドレス (URL)」は⑤の作業によって複製先ドメインのものに置き換え済みになっているはずです。
その他問題ないはずですが一応一通り眺めてみましょう。
おつかれさまでした。
おわりに
冒頭にも記したとおり、ここで紹介した方法が必要になるケースはあまりないと思います。バックアップにせよサーバ引っ越しにせよ、これらを手軽に実施することができるプラグインやツールが豊富にあるからです。管理人も通常はプラグインを用いたバックアップを行っています。
ですが、こうした方法も知っておくと何かの時に役立つことがあるかもしれません。お役に立つことがあれば幸いです。