ワイヤード・パンチ

WordPressマルチサイト内の一つのサイトを、同じマルチサイト内にコピーする方法。

当ブログはwordpressマルチサイトとして運営しており、こことは別に運用しているアイカツとプリパラのカード保管庫も、マルチサイト内にあるサイトのうちの1つです。

しかし、もともとはアイカツとプリパラのカード両方を扱うサイトだったのですが、運用上に問題が出たため、ゲームごとにサイトを別々に分けることにしました。

そのとき、もとのサイトをまるまるコピーしてから、必要な部分以外を削るという手順を取りたかったのですが、サイトのコピーに手こずったため、方法をメモしておきます。

広告

まずはサイトの追加と、IDを確認。

そもそもwordpressをマルチサイト化する手順や、サイトを新規に追加する手順については、ここでは割愛します。

まずはコピー先となるサイトを、あらかじめ管理画面から作成しておきます

今回の場合、「pink.wiredpunch.com」がコピー元、「aikt.wiredpunch.com」と「pri.wiredpunch.com」がコピー先となります。

また、サイトのIDもメモしておきましょう。

サイトのIDを確認するには、ドメイン名にカーソルを合わせれば編集画面のURLが表示され、そのURL末尾の数値がサイトIDになります。

たとえば「pink.wiredpunch.com」の場合、URLが「https://wiredpunch.com/wp-admin/network/site-info.php?id=2」だったので、サイトIDは2ということになります。

同様に「aikt.wiredpunch.com」の場合は5、「pri.wiredpunch.com」の場合は6となりました。

今回、コピーしたいサイトは2つなのですが、手順の説明がややこしくなるので、以下はIDが5の「aikt.wiredpunch.com」だけを例にして、説明していきます。

SQLからサイトをコピーする。

サイトのコピーは残念ながら管理画面からできないので、面倒ではありますが、phpmyadminから行うことになります。

なお、phpmyadminのインストールについては、ここでは割愛します。

今回のおおまかな手順を言うと、コピー元となるサイトのSQLをエクスポートしたあと、コピー先となるサイトの情報に置き換えたのち、インポートするというものです。

まずはコピー元サイトのSQLエクスポートを行います。

今回の場合、コピー元サイトのIDは2なので、名前に「wp_2_」と付くテーブルだけにチェックを入れて、エクスポートします

(wordpressインストール時の設定により、名前が異なる場合があります。)

SQLをエクスポートできたら、それをテキストエディタで開きましょう。

ファイル内にはいたるところに「wp_2_」と付く箇所がありますが、コピー先のサイトIDは5です。

よって、一括置き換えを使って「wp_2_」と書かれている箇所をすべて「wp_5_」に置き換えましょう

同様にサイトのドメインも、コピー元サイトとコピー先サイトでは当然違います。

よってこれも、「pink.wiredpunch.com」と書かれている箇所をすべて「aikt.wiredpunch.com」に置き換えます

あとはSQLを上書き保存して、もう一度phpmyadminを開いて、同じデータベースにインポートすればOKです。

これで、ID5のサイトに、ID2の内容をすべてコピーできました。

メディアライブラリもコピーする。

サイトをコピーして、なおかつデータもコピー先のものに置き換わりました。

つまり、記事と紐付けされているメディアもコピー先のものとなったのですが、その肝心のメディアが、この時点では存在していない状態です。

先程までの手順はあくまでもサイトの設定やテキストだけなので、メディアのコピーは入っていません。

よって、メディアもコピー先サイトでも表示できるよう、コピーする必要があります。

これも管理画面からはコピーできません。ひとまずFTPで、Wordpressのメディアが保存されているディレクトリまで移動してみましょう。

初めに作ったサイト、つまりメインサイトであれば、uploadsディレクトリ直下に年ごとのフォルダが作成されており、またその下層には月ごとのフォルダがあります。

一方でマルチサイトのサイトID2以降のサイトの場合は、uploads内にsitesディレクトリがあり、さらにその中にサイトIDごとにディレクトリがあります

そのサイトIDディレクトリからさらに下層は、メインサイト同様に年ディレクトリと月ディレクトリになります。

今回の場合、コピー元サイトのメディアは「(wordpressルート)/wp-content/uploads/sites/2」に保存されており、その中身をコピー元となる「(wordpressルート)/wp-content/uploads/sites/5」にまるごとコピーすることになります。

このままFTPからやってもいいのですが、今回使用しているWinSCPの場合だと、いったんローカルにダウンロードしてからアップロードするという処理になります。

つまり、サーバ内だけで処理が完結しないので、無駄に時間を取ることになります。

でも当WordpressはVPSに設置しているため、ターミナルを使用することができます。

よって今回はターミナルからコマンドを入力して、手っ取り早くコピーを済ませます

(一般的なレンタルサーバだったら、おそらくターミナルは使えないので、その場合はFTPからコピーするしかないでしょう…。)

Tera Termなどを起動してサーバにログインし、下記のコマンドを実行します

cp -r /var/www/html/wordpress/wp-content/uploads/sites/2/2018 /var/www/html/wordpress/wp-content/uploads/sites/5

(パスについては、皆様の環境に合わせて適切に書き換えてください。)

左側のディレクトリパスはコピー元、右側はコピー先となります。

コピー元に年ごとのディレクトリも含めていますが、ディレクトリの中身をコピーするのではなく、自身を含めてコピーしてしまうからです。

よって、2017も2016も以下同様、年ごとにディレクトリパスを書き換えて上記コマンドを実行してください。

FTPなら多大な時間がかかるコピーも、ターミナルからコマンドで実行すれば、ローカルを介さないため、あっという間にコピーが終わります。

これでコピー先サイトでもメディアが表示されるはずです。

後始末も忘れずに。

サイトのコピー作業自体は、これで完了です。

でもこのままでは、コピー元サイトもコピー先サイトも、内容が全く同じサイトです。コピーしたから当然ではありますが。

今回の目的は、コピー元サイトから必要な記事だけを残してあとは削除することなので、それを忘れてはいけません。

もちろん、互いのコピー先サイトのタイトルも変えるのを忘れずに。

また、コピー先サイトから不要な記事を削除しても、メディアライブラリには画像が残ったままです。

置いておくと容量の無駄なので、それもきっちり消しておきましょう。

メディアライブラリでは未添付だけを絞り込み検索することが可能です。

メディアが添付されていた記事を削除すると、メディアは自動的に未添付扱いになるので、絞り込みすることが可能です。

あとは未添付メディアに一括チェックを入れて、全削除すればOKです。

今回の場合、サイトコピー直後だと、コピー先サイト2つともに、アイカツとプリパラ両方の画像が入ったままです。

よってまずは、「aikt.wiredpunch.com」からはプリパラに関する記事だけを削除し、「pri.wiredpunch.com」からはアイカツに関する記事を削除します。

それから、互いに未添付になっているメディアを全削除すれば、互いのサイトに必要なメディアだけが残るというわけです。

また、コピー元サイトはもう必要ないので、サイトネットワーク管理からサイトを削除してしまいましょう。

コピー元サイトに紐付いていたメディアは自動的に全部削除され、コピー先サイトだけが残ります。

これで容量が無駄になりません。

余談。

今回の作業の末に出来上がった、それぞれのゲームのカード保管庫を、以下にリンクしておきます。

アイカツ保管庫

プリパラ保管庫

うちのかわいいマイキャラちゃんたちが印刷されてるカード、眺めていってね。