URLの変更を伴うWordPressの移行方法
WordPressを別サーバに移行する場面がありますが、その内容によって移行方法が若干異なります。この若干の差異が曲者で面倒なところです。
通常、サーバの移転でドメイン名は変わらず、フォルダー構成が変わらない場合は、自動ツールプラグイン「All-in-One WP Migration」を使って移行できます。WordPressのファイルとデータベース(Export/Import)を扱える方はそのままコンテンツ一式を移動しても可能です。
バリュードメインでは、WordPress移行サービスがあります。このWordPress移行サービスでは、他社サーバで運用中のWordPressをURLとWordPressの管理者ID及びパスワードを専用の移行画面に入力しさえすれば、簡単にValue Domainで提供されているサーバに移行できます。
Value DomainのWordPress移行サービスは、All-in-Oneツールを使い、遠隔で移行元のWordPressのファイルとデータベース内容を取得しているようです。移行元には「All-in-One WP Migration」プラグインが入っている必要はありません。上手くいけばすごく簡単に数Gバイト程度のコンテンツであれば数分で移行できます。
※筆者が移行元:VPSサーバ(WordPress,php,MySQLは自身でインストール)から移行先:XREA Plusのサーバで試したところ場合により移行エラーが発生しましたが、何度か実施すると成功しました。想像ですが受け入れ側のサーバが過負荷だったものかと思われますが詳細は不明です。移行エラーが起こった場合は時間を空けて試してください。それでも失敗する場合はサポート連絡窓口がありますのでそちらへお問い合わせ下さい。
今回、紹介するのは移行元と移行先のURLが異なるもしくは、移行元と移行先の設置ディレクトリーが異なる場合です。筆者が採用している方法で少し上位者向けとなりますが、WordPressのデータ構造も少しだけ述べますので参考にしてください。
1.【WordPressの構造】
URLが変更になる場合にそれぞれに移行パターンが異なりますが、どのパターンにせよ移行元のWordPressのコンテンツを取得する必要があります。WordPressのコンテンツとは、WordPressのファイル一式とデータベースから構成されます。WordPressはPHP言語で記述されています。
1-1.WordPressのフォルダーディレクトリー
ファイルまたは ディレクトリー |
内容 |
.htaccess | RewriteRule (WordPressが自動で生成した内容が記載されています) |
index.php | URLトップファイル |
wp-config.php | 設定ファイル:データベースの接続情報、インクルードファイルの設定 |
wp-admin/ | 管理者用でホームページの各種設定や記事を書くためのプログラムが入っています。 |
wp-content/ | テーマファイル、アップした画像等のファイル、プラグインファイル、バックアップファイル |
wp-include/ | 基本プログラム |
フォルダーディレクトリー直下には上記以外のphpファイルがありますが、移転の設定で重要なものは.htaccess,index.php,wp-config.phpの3ファイルです。※移転先で動作しない場合はほぼこの3つのファイルの変更が間違っている場合が多い。
1-2.データベース
WordPressの設定情報や記事はデータベースに保管されています。プラグイン自体が利用するデータも同様です。phpMyAdminが使えるユーザであればデータベースの中身を参照できます。
WordPressのテーブル名はデフォルトでwp_の接頭辞(プレフィックス)が付いています。
※システムによっては違う文字列が付与されます。WordPress作成時に独自に設定することもできます。
参考画像のデータベースwp2022ではmt_も混在していますがこれはWordPressではなくて別のCMSのMovable Typeのテーブルで今回は関係ありません。
記事はwp_post、設定情報はwp_optionsというテーブルに格納されています。移行先のURLが変更になる場合、このwp_xxxxxテーブルのURLの文字列が関係するところを全て書き換える必要があります。単純にURL文字列が保存されていればそのまま旧URLから新URLへ書き換えればよいのですが、テーブルによってはデータがシリアライズ化されており、これを考慮して書き換えが必要になります。
1-3.シリアライズとは
シリアライズとはアプリケーション内部で扱っているデータをそのまま保存、取得してデータ変換できることをいいます。WordPressでは、wp_options中に例えば、www.picolix.jpという文字列は、
a:1:{i:0;s:14:"www.picolix.jp";}
のような文字列として格納されています。
aは配列で次の数字は要素数(0から始まるのでこの場合2つ)です。
iはinteger型で数値を表します。
sはString型で文字列を表し、次の数字は文字数です。
なぜ、こんな面倒なデータをデータベースに入れているかというとデシリアライズ(アンシリアライズ)する時にアプリケーションは、そのまま配列データとして利用できるところにメリットがあります。
上記をデシリアライズすると、内部では以下の配列変数として取り込めます。
array(1) {
[0]=>
string(14) "www.picolix.jp"
}
業務系でデータベースを扱ってこられた方にはなんて面倒なことをしているとか、データベースをデータベースとして扱っていないじゃないと思われるかとも多々ありますが、そういう構造をしております。
もし、www.picolix.jpをop.gyに移設する場合、このデータは、
a:1:{i:0;s:5:"op.gy";}
に書き換える必要があります。文字列数を計算して数字部分も書き換える必要があるのです。
これを自分でスクリプトを書いて変換することも可能ですが、後で移行ツールとして述べるWordPress Search Replace DBツールは自動計算して書き換えてくれます。(筆者は初期のころ自分でスクリプトを書いて変換していました)
2.【WordPressの移行作業(共通)】(※マルチサイトには対応していません)
2-1.移行元のWordPressのバックアップを取得
移行元のデータベースの例では以下とします。
データベース名:wp2022
ユーザ名:blog
パスワード:1234567890
不明な場合は、wp-config.php中の'DB_NAME'、'DB_USER'、'DB_PASSWORD'を確認してください。
以下のいずれかの方法でWordPressのデータベースを取得します。
方法1:WordPressのBackWPupプラグインで取得する場合は、BackWPupメニュー画面で「データベースのバックアップをダウンロード」をクリックすれば、取得できます。
方法2:phpMyAdminが使える場合は、対象のデータベースを選択して「エクスポート」‐「実行」で取得できます。※この場合、出力された内容には表を作る(create)する前に表を削除(drop)するSQL文が入っていません。SQLのdrop文を入れたい場合は、「詳細 - 可能なオプションをすべて表示」で設定することができます。どちらでもかまいません。
方法3:サーバにログインしてmysqldumpコマンドを実行する。
#mysqldump -ublog -p1234567890 wp2022 > /tmp/wp2022.sql
※方法2と同様に表を削除(drop)するSQL文を埋め込まない場合は
#mysqldump -ublog -p1234567890 --skip-add-drop-table wp2022 > /tmp/wp2022.sql
で出力できます。
一つのデータベースに複数のWordPressや他システムのスキーマが混在している場合は、データベース丸ごと取得すると他のものも同時に取得してしまいます。その場合はWordPressのテーブル名に接頭辞(レフィックス)が付いていますのでwp_を検索して出力することもできます。システムによってはデフォルトのwp_以外に独自の接頭辞を付与する場合もあります。
(wp-config.php中の $table_prefix = 'wp_';を確認してください)
#mysql -N -ublog -p1234567890 wp2022 -e"show tables like 'wp_%';" | grep wp_ | xargs mysqldump -ublog -p1234567890 wp2022 > /tmp/wp2022-wp.sql
2-2.移行元のWordPressファイルの取得
以下のいずれかの方法でWordPressのファイル一式を取得します。
方法1:WordPressのBackWPupプラグインで取得する場合
「BackWPup-ジョブ: 新規ジョブ」‐「一般」
バックアップファイルの保存方法 :フォルダーへバックアップを選択
「宛先:フォルダー」タブが生成されます。
※デフォルトではuploads/backwpup-xxxxx-backups/のようなフォルダーがセットされます。
「変更を保存」とすると「今すぐ実行」のリンクが表示されますので実行すればuploads/backwpup-xxxxx-backups/の下に YYYY-MM-DD_HH-MI-SS_XXXXXXX.zipのようなバックアップファイルができますので、FTP,SFTPあるいはwebインターフェースのファイルエクスプロラー等で取得して下さい。
※デフォルト設定では、YYYY-MM-DD_HH-MI-SS_XXXXXXX.zipにデータベースのエクスポートデータも含まれていますので、この場合個別にBackWPupでデータベースのバックアップをする必要はありません。
方法2:FTP,SFTPあるいはwebインターフェースのファイルエクスプロラーでドキュメントルート配下にあるWordPressのフォルダーを丸ごとダウンロードしてください。
方法3:サーバにログインしてWordPressのフォルダーを圧縮してダウンロード。ドキュメントルート配下にあるWordPressのフォルダーを圧縮してダウンロードします。
例)URL:https://www.picolix.jp/blog
実体ディレクトリー:/virtual/lisa/public_html/www.picolix.jp/
#cd /virtual/lisa/public_html/www.picolix.jp/
#tar zcvf YYYY-MM-DD_HH-MI-SS_XXXXXX.gz blog/
以上、ご自身のサーバ環境に合わせてバックアップを取得してください。
WordPressのデータベースとファイルのバックアップさえあれば、復元、移設が可能になります。
2-3.移行先にWordPressデータベースを作成し移行元データをインポート
サーバでmysqlコマンドでWordPress用の空データベースとアカウントを作成します。
(phpMyAdminのツールで画面からも操作できます)
データベース名は移行元と同じ名前でも、違っても構いません。
例ではデータベース:wp2022で作成します。
※違う場合は、wp-config.php中のdefine('DB_NAME', 'DB名');define('DB_USER', 'ユーザー名');define('DB_PASSWORD', 'パスワード');を後で適宜変更する必要があります。
# mysql -uroot -p
Enter password:XXXXXX
※rootアカウントにパスワード未設定の場合は、# mysql のmysqlコマンドだけでログインできます。
MariaDB [(none)]> CREATE DATABASE wp2022 CHARACTER SET utf8;
Query OK, 1 row affected (0.004 sec)
GRANT ALL PRIVILEGES ON wp2022.* TO blog@localhost IDENTIFIED BY '1234567890' WITH GRANT OPTION;
データベースとユーザを作成できたらデータのインポート(phpMyAdminのツールで画面からも直接インポート操作可)を実施します。
# mysql -ublog -p1234567890 wp2022 < /tmp/wp2022.sql
2-4.移行先にWordPress Search Replace DBを設置
移行先にWordPress Search Replace DBをホームページに設置します。
このツールはデータベースの中身を書き換えてくれるツールで、シリアライズされたデータにも対応しています。
https://github.com/interconnectit/Search-Replace-DBから
「code」‐「Download-Zip」でツールをダウンロードする。
ダウンロードしたファイルをホームページに展開して、ブラウザで「https://ドメイン名/Search-Replace-DB-master/」にアクセスして以下のような画面が表示されればインストールは完了です。
※移行元と移行先のphpバージョンはなるべく合わせておく。
※セキュリティー上、不正アクセスされないためにも最終的にはこのツールは移行が完了した後は必要ないので削除してください。ツールの画面の[Delete]ボタンで自身を削除できます。もしくは手動でファイル削除する。
2-3でインポートしたデータベースにアクセスできるかを確認します。
detabase name:wp2022
username:blog
pass:1234567890
host:localhost ※もしデータベースサーバが違うサーバにある場合はそのホスト名を指定してください。
port:空白 ※デフォルトのポート番号以外を使っている方はそのポート番号を指定してください。
「Test Connecton」を実行してエラーがなく、他のボタンが有効化されれば正常にアクセスできています。
されない場合はエラーメッセージを確認して適切なデータベースの情報を入力して再テストしてください。
3.【WordPressの移行作業(URL変更タイプ別)】
パターン | 移行元URL | ディレクトリー | 移行先URL | ディレクトリー | |
1 | 1 | www.picolix.jp/ | / | op.gy/ | / |
2 | www.picolix.jp/blog | /blog | op.gy/blog | /blog | |
3 | www.picolix.jp/ | /blog | op.gy/ | /blog | |
2 | 1 | www.picolix.jp/blog | /blog | op.gy/ | / |
2 | www.picolix.jp/blog | /blog | op.gy/ | /blog2 | |
3 | www.picolix.jp/ | / | op.gy/ | /blog | |
3 | 1 | op.gy/ | /blog2 | op.gy/blog_test | /blog_test |
上記の例でWordPressの移行パターンによって解説します。
3-1.ドメイン名を変更しURLとディレクトリー構成は変わらない場合
URL変更タイプ別パターン1の場合です。
1.移行先へWordPressファイルの展開を行います。
YYYY-MM-DD_HH-MI-SS_XXXXXX.gz(またはYYYY-MM-DD_HH-MI-SS_XXXXXXX.zip)を移行元と同じディレクトリー(トップディレクトリー配下)に展開します。(ファイルのオーナー、権限は必要なら適宜変更してください)
2.移行先のURLにデータベース中のURLの文字列を書き換えます。
ブラウザで「https://ドメイン名/Search-Replace-DB-master/」にアクセスして変更します。
パターン1ー2の場合を記載します。
・「Test Connection」を実行して他のボタンを有効化します。
・//www.picolix.jp/blogを//op.gy/blogに置き換えます。
replace: //www.picolix.jp/blog
with: //op.gy/blog
・「Do a safe test run」を実行し、どのように置き換わるかシミュレーションします。
結果、一覧が表示されるので、「view changes」のリンクをクリックすれば置き換え後の内容が分かります。
・view changes内容を確認して問題ないようでしたら、「Search and Replace」を実行して書き換えを行います。
・同様に、www.picolix.jpをop.gyに置き換えます。
replace: www.picolix.jp
with: op.gy
として「Do a safe test run」、「Search and Replace」を実行して書き換えを行います。
最初から、www.picolix.jpをop.gyに置き換えても良いですが、途中の状態を都度確認しながら今回は2回変換しました。以上で完了です。移行先のホームページ、管理画面が正しく表示されるか確認をしてください。
3-2 ドメイン名を変更しURLもディレクトリー構成も変わる場合
URL変更タイプ別パターン2の場合です。
この場合.htaccess,index.php,wp-config.phpの書き換えが必要になります。
1.移行先へWordPressファイルの展開
YYYY-MM-DD_HH-MI-SS_XXXXXX.gz(またはYYYY-MM-DD_HH-MI-SS_XXXXXXX.zip)を移行元とは違うディレクトリーに展開する。
(ファイルのオーナー、権限は必要なら適宜変更してください)
2.移行先のURLにデータベース中のURLの文字列を書き換えます。
ブラウザで「https://ドメイン名/Search-Replace-DB-master/ 」にアクセスして変更します。方法は前述と同様です。
3..htaccessの書き換え
パターン2ー1の場合は、
移行元は ./blog/で移行先は ./です。URLはhttps://op.gy/です。
/virtual/lisa/public_html/op.gy/がホームディレクトリーとします。
/virtual/lisa/public_html/op.gy/.htaccessを以下に書き換えます。
RewriteBase /blog/
RewriteRule . /blog/index.php [L]
を以下の様に修正します。
RewriteBase /
RewriteRule . /index.php [L]
[確認事項]
ファイル:/virtual/lisa/public_html/op.gy/index.php
require DIR . '/wp-blog-header.php';
ファイル:/virtual/lisa/public_html/op.gy/wp-config.php
require_once(ABSPATH . 'wp-settings.php');
この設定であればこのまま。違う場合は上記の設定にします。以上で完了しましたので、移行先のホームページ、管理画面が正しく表示されるか確認してください。
パターン2ー2の場合は、
移行元は./blog/で移行先は . /blog2です。URLはhttps://op.gy/です。
・/virtual/lisa/public_html/op.gy/.htaccess以下に書き換えます。
RewriteBase /blog/
RewriteRule . /blog/index.php [L]
を以下の様に修正します。
RewriteBase /
RewriteRule . /index.php [L]
・/virtual/lisa/public_html/op.gy/にindex.phpを設置する。
/virtual/lisa/public_html/op.gy/blog2/index.phpを/virtual/lisa/public_html/op.gy/index.phpにコピーします。
・/virtual/lisa/public_html/op.gy/index.phpの内容を修正する。
require DIR . 'blog2/wp-blog-header.php';に修正する。
[確認事項]
ファイル:/virtual/lisa/public_html/op.gy/wp-config.php
require_once(ABSPATH . 'wp-settings.php');
この設定であればこのまま。違う場合は上記の設定にします。
・データベースのwp_optionsテーブルのサイトURLとホームディレクトリーを変更します。
元々からサイトURLとホームディレクトリーが異なってしまうので、wp_optionテーブルの以下の項目を
siteurl: https://op.gy/blog2
home : https://op.gy/
に書き換える必要があります。幸いこの項目はシリアライズされていませんので、文字列を書き換えるだけで良いです。phpMyAdminのツールから書き換えるか、mysqlをサーバ上で実行してSQLで書き換えます。
MariaDB [wp2022]>
update wp_options set option_value = 'https://op.gy/blog2' where option_name = 'siteurl';
MariaDB [wp2022]> commit;
2-3は2-2と同手順で移行できます。管理画面URLはhttps://op.gy/blog2/wp-admin/になります。以上で完了しましたので、移行先のホームページ、管理画面が正しく表示されるか確認してください。
3-3 自サイト内で同じコンテンツを別ディレクトリーに作成する場合
自サイト内で、フォルダーを移動したり、あるいはフォルダーを違う名前でコピーしてデータベースも分けてテストサイトを作る場合も同様の手法で実施できます。(マルチサイトではなくてデータベース自体も分けます)
ここでは、パターン3ー1の場合で、https://op.gy/を同内容でhttps://op.gy/blog_testでテストサイトを作りたい場合を記載します。
1 ./blog2にWordPressがあったとして、前回と同様にコンテンツとDBを取得します。
2.データベースは新たにwp2022testとして空DBを作ります。
3.WordPressのアクセスユーザも分かりやすいように新たにblogtestユーザを作成します。phpMyAdminのツールから作成するか、mysqlをサーバ上で実行してSQLで作成します。
MariaDB [(none)]> CREATE DATABASE wp2022test CHARACTER SET utf8;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON wp2022test.* TO blogtest@localhost IDENTIFIED BY '1234567890' WITH GRANT OPTION;
4.wp2022testにデータをインポートします。
#mysql -ublogtest -p1234567890 wp2022test < wp2022.sql
5.コンテンツを/virtual/lisa/public_html/op.gy/blog_testに展開します。
6.Search-Replace-DB-master/で//op.gy/を//op.gy/blog_testに書き換える
7.データベースのwp_optionsテーブルのサイトURLとホームディレクトリーを変更します。
wp_options:
siteurl: https://op.gy/blog2
home : https://op.gy/
に書き換える必要があります。
MariaDB [(none)]> use wp2022test;
MariaDB [wp2022test]> update wp_options set option_value = 'https://op.gy/blog_test' where option_name = 'siteurl';
MariaDB [wp2022test]> update wp_options set option_value = 'https://op.gy/blog_test' where option_name = 'home';
[確認事項]
ファイル:/virtual/lisa/public_html/op.gy/index.php
require DIR . '/wp-blog-header.php';
8.wp-config.phpの書き換え
define('DB_NAME', 'wp2022test');
define('DB_USER', 'blogtest');
define('DB_PASSWORD', '1234567890');
9. .htaccessの書き換え
RewriteRule . /blog_test/index.php [L]
その他、注意事項、プラグイン、テーマファイルにURLを絶対パスで書き込んでいる場合は、別途変更が必要です。
最後に
移行してホームページ画面がデータベース接続エラー、画面が真っ白、404エラー、internalエラーが出た場合は以下の項目を見直し対処することで表示されるようになります。
.htaccess | リダイレクトの情報が記載されています。管理画面から操作すると自動で生成されます。(生成されない場合は画面に設定情報が表示されますので、手動で書き換えます) |
index.php | サイトのホームページとして WordPress のインストールディレクトリとは異なる場所を設定する場合はサイトトップにindex.phpを設置する必要があります。管理画面から操作すると自動で生成されます。 |
wp-config.php | WordPress データベース情報が記載されています。 |
データベース wp_optionsテーブル |
siteurlとhomeの文字列が格納されています。 |
サイトの移行や同サイトに別途テストサイトを立ち上げたい時に参考にして下さい。
また、最初に紹介しました、バリュードメインのWordPress移行サービスでValue Domainの提供サーバへ同URL、同ディレクトリーの移行であれば、必要な情報を入力した後、ボタン一つで移行もできますので重宝します。
ドメイン・サーバー同時契約でドメイン更新費用永久無料(年間最大3,858円お得)
是非、お得なこの機会にご利用ください。最新のキャンペーンはこちらから
※ユーザーノートの記事は、弊社サービスをご利用のお客様に執筆いただいております。
医療メーカーで新素材研究開発後、電機メーカーで制御器系システム開発を経てIT系マルチエンジニアをしています。またデザイン思考を実践し、アート思考などのいろんな思考方法に興味があります。