WordPressの投稿の移転方法
概要
WordPressで投稿を数多くこなしていくと,あるカテゴリーの投稿が多くなり,別サイトに分離したくなることがある。
そこで,WordPressでの投稿の移転方法を整理した。WordPress v5.6で確認した。
カテゴリー設定
まず,移転対象の投稿に同じカテゴリーを割り当てておく。これにより,移転対象の投稿をまとめて取り扱いやすくする。カテゴリーを階層化している場合,共通の親カテゴリーを割り当てておく。
例えば,今回は以下のように [money] カテゴリーを移転対象とする。
[money] カテゴリーの下には,[Amazon], [GnuCash], [money-other] の3のサブカテゴリーがあるが,どれも共通で [money] カテゴリーにも登録している。
投稿のエクスポート
WordPressの標準機能にエクスポート (ツールエクスポート画面 | WordPress.org 日本語) がある。これを使って移転対象の投稿をファイルにエクスポートする。
[ツール]>[エクスポート] を選び,エクスポート対象を選ぶ。
今回は,[◎投稿]>[カテゴリー]>[money] を選んだ。選び終わったら,[エクスポートファイルをダウンロード] を選ぶ。
すると,[senookenjp.WordPress.2020-11-29.xml] のような名前のファイルをダウンロードできる。
なお,過去には [DeMomentSomTres Export] というプラグインを使っていたのだが,プラグインが出力するXMLと標準機能のXMLが同じだった。そのため,特にプラグインを使わなくても,標準機能だけで大丈夫だ。
メディアのエクスポート
アイキャッチ画像などを使っている場合,メディアも一緒にエクスポートしてやる必要がある。
[◎メディア] を選び,必要に応じて [開始日時] と [終了日時] を選び,最後に [エクスポートファイルをダウンロード] を選ぶ。
すると,[senookenjp.WordPress.2020-11-29.xml (1)] のような名前のファイルをダウンロードできる。
なお,メディアの数が少なくても,メディアもセットで移転することを推奨する。手作業で移転するのはたいへんだからだ。未使用メディアを移転してしまっても,移転後に削除すればいい。手作業でメディアを移転するよりも,削除するほうが簡単だ。
投稿のインポート
エクスポートした投稿とメディアのXMLファイルを,移転先のWordPressにインポートする。
WordPressのインポート機能はは「Tools Import Screen | WordPress.org」で説明されている。インポート対象毎に,インポートプラグインをインストールして対応する。
まず,移転先のWordPressのwp-adminでエクスポートしたデータをインポートする。
[ツール]>[インポート]>[WordPress]>[インポーターの実行] を選ぶ。
インポートが初回の場合,マルチサイトだと以下のように表示されるので,[メインのサイト] のリンクを選ぶ。
[WordPress]>[今すぐインストール] を選んで [WordPress Importer – WordPress plugin | WordPress.org] のプラグインをインストールしてからやり直す。
[Browse] でエクスポートしたファイル (例: senookenjp.WordPress.2020-11-29.xml) を選び,[ファイルをアップロードしてインポート] を選ぶ。
エクスポートしたデータの投稿者ごとに,インポート時の投稿者を割り当てる。新規ユーザーを作成するか,既存のユーザーに割り当てる。今回は,[あるいは投稿を既存のユーザーに割り当てる] から投稿者を選んだ。
その後,最後に [実行] を選ぶ。なお,[☑添付ファイルをダウンロードしてインポートする] はチェックしても,アイキャッチ画像はダウンロードしてインポートされないので注意する。
インポートが完了すると以下の画面が表示される。
なお,この方法だとアイキャッチ画像が反映されない。アイキャッチ画像は次のメディアのインポートで取り込む。
なお,WordPress Importer v0.7にはData URIを使ったimg要素 (インライン画像) からdata:スケームが欠落してしまうバグがあるようだ。「Drop Data URI `data:` scheme from img element for base64 embedded inline image | WordPress.org」に登録した。ひとまず,[Search Regex] プラグインでsrc="image
で検索して,src="data:image
に置換することで対応した。
メディアのインポート
アイキャッチ画像などのメディアのインポートには,「Attachment Importer – WordPress プラグイン | WordPress.org 日本語」を使用する。こちらのプラグインを使ったインポートが定番の方法のようだ。
ここしばらく更新されていなくて不安になるが,WordPress v5.6でも問題なく動作したので安心してほしい。
[Attachment Importer] をインストールすると,[ツール]>[インポート] 画面に [Attachment Importer] が一番上に表示される。
[インポーターの実行] を選ぶ。
[Choose File] で先ほどダウンロードしたメディアのxmlファイルをアップロードして,最後に [Upload] を選ぶ。
メディアのインポートが始まり,完了すると [All done!] と表示される。
リダイレクト
移転先に投稿を移転できたら,移転元のリンク切れを防ぐために,移転元から移転先にリダイレクトさせる。
リダイレクト用のプラグインも用意されているが,大量のリダイレクトには向かないため,自分で.htaccess
に記述する。
例えば,https://senooken.jp/post/2020/11/22/
へのアクセスをhttps://money.senoken.jp/post/2020/11/22/
にリダイレクトさせる場合,以下の内容を.htaccess
に指定する。
## マルチサイトの本体サイトから子サイトへのリダイレクトの場合
RewriteCond %{HTTP_HOST} !^senooken.jp$
RewriteRule .? - [skip=1] # 以降のRewriteRuleの数を指定
RewriteRule ^(post/2020/11/22/) https://money.senooken.jp/$1?%{QUERY_STRING} [L,R=301]
## マルチサイトの子サイト同士のリダイレクトの場合
## Redirect invest.senooken.jp to money.senooken.jp
<If "%{HTTP_HOST} == 'invest.senooken.jp'">
RewriteRule ^(.*) https://money.senooken.jp%{REQUEST_URI}?%{QUERY_STRING} [L,R=301]
</If>
# BEGIN WordPress
ポイントは以下3点となる。
R=301
でHTTP 301リダイレクトを指定# BEGIN WordPress
より上に指定- マルチサイトの場合,本体サイトと子サイトを区別
1点目は,RewriteRule
のR=301
フラグで明示的にHTTP 301リダイレクトを指定する。HTTP 301は恒久的なリダイレクトを意味し,移転元のアクセスを移転先に引き継ぐことができる。逆にこれを指定しない場合,全く新しいWebページ扱いになり,検索エンジンの評価が0からとなる。検索エンジンにキーワードを入力してもヒットしにくくなる。SEOの視点からは必須となる。
2点目はWordPressが標準で指定する# BEGIN WordPress
のブロックよりも上 (先) に指定することだ。詳細は不明だが,WordPressが自動的に挿入するリダイレクトルールの下 (後) に追記すると,狙い通りにリダイレクトされなかった。
3点目はWordPressのマルチサイト機能での運用時特有の注意点となる。WordPressのマルチサイトで運用している場合,本体サイトと子サイトは本質的に同じサーバー・ホストである。そのため,リダイレクト先でも同じリダイレクトが発生してしまい,うまくリダイレクトできない。
そこで,マルチサイトの本体サイトから子サイトへのアクセスの場合は,条件分岐を入れて回避する。詳細は後日別の記事に投稿する。
サイト内部のリダイレクトの場合は特にそのような処理はいらない。また,マルチサイトの子サイトからのリダイレクトの場合は,<If>
指令によるアクセス元のホストチェックだけでたぶんいい。
これを移転対象の投稿ごとに1個ずつ指定する。カテゴリーベースのURLなどで,共通点が多い場合,丸括弧 ()
でグループ化して,リダイレクト先の$1
–$9
変数で参照して,でまとめてリダイレクトすることもできる。
今回は移転元が日付ベースで規則性がないので,諦めて1個ずつ指定する。表計算ソフトやテキストエディターの機能を駆使して,効率的にまとめて用意する。
移転URLが多いと.htaccess
が長くなるが,Include
指令は.htaccess
では使えず,ファイルを分割できないので諦める。
削除
リダイレクトを指定して,きちんと移転元から移転先にアクセスがリダイレクトされることを確認できたら,移転元の投稿を削除する。
事前に移転対象の投稿を単一カテゴリーに割り当てているので,対象カテゴリーの投稿を一括削除すればよい。
[投稿]>[カテゴリー] を選んで,対象カテゴリー (例: money) の [カウント] 列を選ぶ。
1列目のチェックボックスを選んで全投稿の選択後,[一括操作]>[ゴミ箱へ移動]>[適用] を選ぶ。
最後に,[投稿]>[カテゴリー] 画面に戻って,同様の手順で割り当てていたカテゴリーを削除する。
以上で投稿の移転が完了となる。
結論
WordPressでの投稿の移転方法を整理した。
エクスポートしたデータのインポートとリダイレクト設定が少々面倒だが,アイキャッチ画像以外は標準機能と公式プラグインだけで対応できる。
できることなら,移転などしないで済めばよいのだが,実際に始めてからわかることもあるのでやむを得ない。
この手順で次回以降はスムーズに移転を行いたい。