【WordPress】マルチサイトが有効な状態で、ブログをコピーしていく方法

【WordPress】マルチサイトが有効な状態で、ブログをコピーしていく方法Web開発者の備忘録WordPressマルチサイト機能を使えば、1つのWordPressで複数のブログサイトを、サブドメイン指定かサブディレクトリ指定で増やして行くことができます。
今回、既にマルチサイト機能で複数サイトを運営しているところで、さらにサイトを追加したい、しかもテンプレートや記事やプラグインなど設定までコピーされた状態で作りたい(要はまるコピー)、というリクエストを受け対応したので、その手順を書いて行こうと思います。

本来の手順

https://wpdocs.osdn.jp/複数のブログをマルチサイトに移行する
こちらにあるように、

1.WordPress管理画面上でサイトを作成
2.エクスポート/インポートで記事をコピー
3.テンプレートファイルなどコピー
4.管理画面でプラグインなど設定をしなおす

になるのですが、特に4.の設定し直しが厄介です。

また、2.のエクスポート/インポートも、記事数やメディア数が多いとタイムアウトするなどしてダメになります。
しかも、途中で失敗して再処理すると、中途半端にデータが増えたりするもんだからさあ大変。
という事で、この方法は使いませんでした。
※正確にはこうやろうとしたけど、途中でイヤになって諦めました。

今回の手順

簡単に言うと、

1.WordPress管理画面上でサイトを作成
2.DBコピー(mysqldump でデータをSQL形式でexportし、中のデータをテキストエディタで一部修正し、それを実行して反映)
3.メディアファイルのコピー(ファイルを直接コピー)
4.テンプレートファイルなどコピー&修正
5.管理画面でプラグインなど設定をしなおす(widgetだけがなぜか管理画面に反映しなかったので、ここだけ手で設定)

です。

一見手順が多く面倒そうですがそうでもなく、確実性が全然違います。
特に管理画面で設定しなおすという作業が大幅に減るので、かなり楽になります。

1.WordPress管理画面上でサイトを作成

まあ、特に説明することはありません。
これすらわからない人は、他のサイトなど参考にしてください。

2.DBコピー

wp_blogs テーブルみると、今回1.の手順で追加したIDが分かります。例えばそのIDが 11 だとして、コピー元のIDが 8だとしたら。
wp_11_xxxx テーブルを、wp_8_xxxx テーブルから丸コピーするわけです。

具体的には、mysqldump で wp_8_xxxx テーブル(あるだけ)指定してファイルに落とします。

次に、ファイルに落としたダンプファイルをテキストエディターで修正します。
具体的には以下。

・create table 文を全部消す(1.の手順で作成済だから)
・insert into wp_8_xxx を into wp_11_xxx に直す(これ大事!)
・1.でサイトを作った時に指定したURLとなるよう、URLの記述を直します。
 但し、wp_postsなど記事テーブルの中身は触らない方が良いです。
 設定に関するテーブル、例えば wp_options などHTMLなどに関係しない部分が対象となります。
・/uploads/sites/8 を /uploads/sites/11 という名前に変更
 これは、後で行うメディアファイルのパス変更です。
・その他、テーマファイル名を変更するなどしている場合などは、そういった設定変更もここで先に行うとよいでしょう

3.メディアファイルのコピー

wp-content/uploads/sites/8
というディレクトリが多分出来上がっているはずなのです。これはコピー元サイトのメディアファイルですが、これを
wp-content/uploads/sites/11 という名前でまるコピーしてください。

4.テンプレートファイルなどコピー&修正

テンプレートを独自に作りたい場合に行います。
wp-content/themes
ここに今回コピーするサイト用のテンプレートを一式、元サイトで使っていたテンプレートからコピーして設置します。
その時に、各ファイル先頭に記載のある、

Theme Name: template-name

みたいなものがありますが、これを今回新たにコピーするサイト用に名前を変更しておいてください。

また、テンプレートが階層化(親子構成など)となっているなど、親テンプレートをカスタマイズしてblog_idなどで条件分岐されている場合。
そういった手の込んだ事をしている作りになっているのであれば、そのblog_id に今回追加する 11 という場合の条件式を入れるなど対応が必要になるかもしれません。

5.管理画面でプラグインなど設定をしなおす

基本これはもう起きないはずですが、今回なぜか widget だけ反映されなかったので、ここだけはしょうがなく手で直しました。

本来は4.のステップで(テンプレ修正が不要なら3.の時点で)サイトコピー完了となるのですが、なんにせよコピーしたサイトを開き、期待した動作(コピー元サイトと同じ動きになるか)は確認が必要です。