OXY NOTES

WordPressを別サーバーへ清く正しく引っ越しする方法

WordPressでWebサイトを運営していると、
もっとスピードの早いサーバに移行したい。
メディアファイルが重くてサーバの容量を超えそう。
と、サーバのスケールアウトを検討することがあります。
そんなときにありがちなのが「データベースとファイルを新しいサーバに移したのに、正しく動作しない」といったものや「そもそも正しい移行方法ってどうやるの?」という疑問です。

そんなときに役立つ「清く正しくWordPressを移行する方法」を解説します。
初心者向けの簡単な方法と、大規模サイトでも使えるプロ向けの方法を解説します。


WordPressを引っ越しする際の問題点

大前提として、WordPressは本体とテーマファイルなどからなるファイルと、MySQLのデータベースを組み合わせて動作しています。
そのため引っ越す際もファイルデータベースの両方をバックアップする必要があります。

WordPressをバックアップする方法

ファイルはWinSCPなどのFTPクライアントを利用すれば簡単にバックアップできます。

データベースはサーバへログインしてMySQLコマンドを打つ権限がある場合は、mysqldumpコマンドを利用してバックアップを行います。
大抵のレンタルサーバはphpMyAdminが使えるので、そこからエクスポートすることもできます。

WordPressをインポートする方法

ダウンロードしたファイルとデータベースを新しいサーバへ移動します。後はDNSで新しいサーバとドメインを関連付ければ完了です。

この辺の方法はかなり古いものですが「以前の投稿」を参照してください。(使用しているソフトのバージョンは古いですが、手順は同じです)

ドメインが変更になる場合の問題点

これで問題なく終わればこの投稿も必要ありません。問題はドメインが変更になる場合です。例えば「example.com」から「new.example.com」へドメインが変更になる場合、データベースで修正が必要になります。

接頭辞_options」テーブルの「siteurl」と「home」の値を新しいURL「http://new.example.com」に変更する必要があります。

一応この変更だけでアクセスすることが可能になりますが、多くの場合、不具合が発生します。テーマやプラグインのテーブルに古いURLへの参照が残るからです。よくある不具合はメディアファイルが表示されなくなるというものです。

では「データベース上のURLを一括置換すれば動作するのではないか。」という考えに至ります。(実際に私は過去、この方法を採用していました)しかし、中にはデータの長さを整合性に利用するデータベースも存在します。そうなると一括置換では対処できません。

これがCodexいわく「データシリアライゼーション(変換)問題」です。

こうした問題を解決してくれるのが以下に示す2つの方法です。


初心者向けの引っ越しプラグイン「All-in-One WP Migration」

まずはプラグインを利用した初心者向けの移行方法を紹介します。

All-in-One WP Migration」というプラグインを利用します。このプラグインを利用すればデータベースだけでなく、テーマやメディアファイルも一括で移行することができます。

All-in-One WP Migrationを利用したバックアップ方法

1.移行元にAll-in-One WP Migrationをインストール

使い方も簡単で、まずは移行元のWordPressにAll-in-One WP Migrationをインストールします。(なんだか楽しげなイメージ画像ですねw)

WordPressの管理画面からインストール

または、WordPressの管理画面から「プラグイン > 新規追加」ページでプラグインの検索フィールドに「All-in-One WP Migration」と入力してインストールします。

インストールしたら「有効化」

設定画面で左の項目に「All-in-One WP Migration」という項目が追加されているので、エクスポートをクリック。

サイトをエススポートというウィンドウに「検索 置換 データベース内」という項目があるので右のハンバーガーメニュをクリックして展開します。

1.検索の項目に現在のドメイン。置換の項目に新しいサイトのドメインを入力します。

続いて高度なオプションをクリックして展開。

必要のない項目にチェックを入れて、ファイルサイズを削ります。個人的にはサイトを移行する場合、スパムコメントや投稿リビジョンは必要ないと思います。

続いて「エクスポート先」をクリックして展開します。

何やらたくさんの項目が表示されますが、要はバックアップファイルを書き出すサーバを選択する項目です。
通常は「ファイル(デスクトップにバックアップファイルを書き出す設定)」で問題ありません。

これでバックアップファイルを作成する処理が始まります。

処理が終わると「example.comをダウンロード」という緑の罫線の項目が拡大縮小するのでクリックしてダウンロードします。

All-in-One WP Migrationで作成したバックアップをインポートする方法

上の方法でファイルをバックアップすると、「○○○.wpress」という名前のファイルがダウンロードされます。
移行する方のWordPressにも「All-in-One WP Migration」をインストールし、今度は「インポート」を選びます。

ここで「Maximum upload file size:8 MB」という表記に注意してください。これはワードプレス側の制限ではなく、サーバのPHP側の制限で上限が設定されています。そのためサーバによってサイズは異なります。

とりあえず8MBでは先程保存したバックアップファイルをインポートするには容量が足りないので、設定を変更します。設定方法は公式のサポートページでも解説されています。

ちなみに以下の方法はサーバの設定で制限している場合は、有効にならない可能性があります。

1. .htaccessファイルを更新する

Web ServerにApacheを利用している場合、「.htaccessファイル」に以下の項目を追加します。以下のサンプルは128MBまでの例。
max_execution_time等はPHPの最大処理時間です。ファイルサイズが大きくなると相対的に処理時間が長くなるため調整したほうが無難です。
サーバの設定を変更できないレンタルサーバの場合はこの方法が一番楽かもしれません。

php_value upload_max_filesize 128M
php_value post_max_size 128M
php_value memory_limit 256M
php_value max_execution_time 300
php_value max_input_time 300

2. wp-config.phpファイルを更新する

WordPressのルートディレクトリにあるwp-config.phpに追記する方法です。
ワードプレスのファイルが編集できる場合はこの方法が一番簡単です。

@ini_set( 'upload_max_filesize' , '128M' );
@ini_set( 'post_max_size', '128M');
@ini_set( 'memory_limit', '256M' );
@ini_set( 'max_execution_time', '300' );
@ini_set( 'max_input_time', '300' );

上記以外にも有料版を使うと制限が解除されるそうです(実際には購入していないため未検証)。

ちなみに有料版を購入すれば最大で512MBという制限も撤廃され、ファイルサイズ無制限でインポートが可能とのこと。価格は69ドルで、複数のサイトで利用できるとのことなので、大規模なサイトを複数運営している方や、WordPressの引っ越し作業を頻繁に行うという方は購入をおすすめします。

https://import.wp-migration.com/

以下のキャプチャはファイルのサイズを512MBに変更したものです。

インポートからファイルをクリックしダウンロードしたファイルを選択します。するとインポートが画面になり、終了すると表示される「開始」ボタンをクリックします。ここで「閉じる」ボタンを押したり、「開始」ボタンを押した後にウィンドウを閉じてしまうと失敗するので注意してください。

サイトをインポートしました」と表示されれば完了です。

これで無事にWordPressのデータを新しいサーバに移行することができました。


WordPress Cocex御用達のスクリプトを使用する方法

WordPressのCodexで推奨する引っ越しの方法は「WordPress の引越し」というページで解説されています。

解説にある通りドメインが変更にならない場合は普通にFTPでファイルを移行し、データベースを書き出し、新しいサイトで読み込めばそのまま動作します

問題はドメイン名やURLが変更になる場合です。
変更になる場合でもデータベースの「wp_options」の「siteurl」と「home」を新しいドメインに変更すれば動作することがあります。ただしほとんどの場合はメディアファイルが表示されなかったりプラグインの動作がおかしくなったりすることがあります。

原因はURLのデータシリアライゼーション(変換)に起因するものです。ドメイン名は一括置換できても、データの長さは異なるため整合性が保てなくなります。そうするとメディアファイルが見えなくなるといった不具合が発生します。

Codexではデータシリアライゼーションの手順も解説されていますが、より簡単に変換が可能なスクリプトが用意されているのでそちらを利用しましょう。

Database Search and Replace Script in PHP

ページ途中にいくつかの設問とメールアドレスを入力する項目があるので入力を済ませます。
チェック項目はそれぞれ以下のことを理解していることを確認するためのものです。

必要事項を入力したらSUBMITボタンをクリックします。

すると入力したメールアドレスにメールが届きます。

Download Search Replace DB v 3.1.0 here.」の「here」をクリックしてダウンロード用のURLからファイルをダウンロードします。(WordPressのバージョンに合わせてアップデートを行っているため、必ず最新版を利用するようにしてください。)

今回ダウンロードしたのは「Search-Replace-DB-3-1-0-emaildownloads.zip」という名前でした。
解凍したらフォルダ名を変更します。外部からファイルへアクセスされると重大な脆弱性が発生するためです。
変換作業をする間だけの一時的に設置とはいっても、推察されるような名前は避けたほうが無難です。間違っても「Search-Replace-DB-master」という名前でそのまま設置したりしないようにしてください。
今回は「hoge_script15」という名前にしました。

設置する場所はWordPressのルートディレクトリに設置します。wp-contentwp-includesといったディレクトリと同じ階層です。

設置できたらURLに移動します。
https://example.com/hoge_script15

すると以下のようなページが表示されます。

search/replace」で置き換える文字列を指定します。「use regex」にチェックを入れると正規表現で置き換えることができます。通常はドメインの入れ替えだけなのでチェックを入れずにexample.comからnew.example.comと入力すれば動作します。

databaseの設定

データベースへ接続するための各種設定を行います。

name」WordPressで利用しているデータベース名
user」データベースへアクセスする際に利用するユーザー名
pass」データベースへアクセスするユーザーのパスワード
host」ホスト名(通常localhost)
port」ポート名(通常3306)

tableの設定

table」で移行するテーブルを選択します。
all tables」ですべてのテーブルを選択。通常こちらを選びます。
select tables」にチェックを入れるとバックアップするテーブルを選択できます。
また追加の指定で「columns to exclude (optional, comma separated)」で除外する列を選びます。複数指定する場合はカンマ区切りで記述します。
columns to include only (optional, comma separated)」で特定の列だけ有効するといった指定ができます。

actionsの設定

actions」の意味は以下のとおりです。
update details」データベースへ接続のテスト(クリックして右のボタンが灰色の場合は入力内容が間違っています。)
dry run」試運転。
live run」実行。
convert to ~」はテーブルのエンコードを変換する場合のオプションです。通常は使いません。

deleteの設定

delete」はその名前のごとく、この置き換え用のスクリプト自体を削除するボタンです。

実際に置換する際の手順

まずデータベースへ接続できるか「update details」ボタンをクリックします。問題なければ表示は変化しませんが、例えばログインユーザー名を間違えると以下のような表示になり、試運転等の項目が灰色になります。

正しくデータベースへ接続できたら試運転ボタンをクリックします。すると以下のように置き換えをする際に変更になる行の情報が表示されます。

view changes」というリンクをクリックすれば具体的にどこを置き換えるかを表示してくれます。問題ないようなら「live run」ボタンで置換を実行します。

ダイアログが出て、データベースの書き換えを実行するにあたり、事前にバックアップを取ったか確認してきます。置換後に修正するのは非常に困難なため、必ずバックアップを取ってから実行してください

これで無事にサイトのドメインを変換することができました。
正しく置き換えができたらスクリプトをディレクトリごと削除するのを忘れないようにしてください。


個人的な感想としては、一般の方はAll-in-One WP Migrationを利用し、プロの方はDatabase Search and Replace Script in PHPの利用をおすすめします。