「サイト全体ではなく、ブログの記事だけを別の WordPress に移したい」という相談を受けました。移行元のサイトにはブログカテゴリーの記事が約600件あり、固定ページやほかのカテゴリーの投稿はそのまま残します。
サイトを丸ごと引っ越すならプラグイン1つで済むことも多いのですが、「一部の記事だけ」となると話が変わります。特に悩むのが画像の扱いです。この記事では、検討した方法の比較と、最終的に選んだ3ステップの手順をまとめます。
移行の流れ
- 移す方法を比べて決める
- 移行前に、URLや旧記事の扱いを決めておく
- 記事と画像情報をまとめてエクスポートし、インポートする
- 取りこぼした画像を FTP でアップロードする
- 本文中の画像URLを一括置換する
1. 「ブログ記事だけ」を移す方法を比べる
候補にしたのは次の4つです。
① WordPress 標準のエクスポート/インポート
管理画面の「ツール → エクスポート」で「投稿」を選ぶと、カテゴリーや期間で絞り込んで XML ファイル(WXR形式)を書き出せます。追加のプラグインがいらないのが利点です。
ただし、カテゴリーで絞り込んだ場合、記事に使われている画像(メディア)の情報は XML に含まれません。そのままインポートすると、本文の画像は旧サイトのURLを参照したまま、アイキャッチ画像は外れた状態になりがちです。
② WP All Export / WP All Import
CSV や XML で、出力する項目を細かく選べるプラグインです。カスタムフィールド(ACF)や SEO プラグインのメタ情報まで柔軟に移したい場合に向いています。そのぶん設定項目が多く、単純な記事の移行には少し大がかりです。
③ WP-CLI・REST API・データベースを直接触る
サーバーで WP-CLI が使えるなら、カテゴリーを指定してエクスポートできます。件数が多い場合や、何度もやり直す可能性がある場合には強力ですが、技術者向けの方法です。
wp export --post_type=post --category=blog
④ 手動でコピーする
数記事なら、これがいちばん確実です。600件では現実的ではありません。
サイト丸ごと複製のプラグインは不向き
All-in-One WP Migration や Duplicator のような移行プラグインは、サイト全体を複製するためのものです。移行先にすでにサイトがある「ブログだけ移す」ケースでは、移行先の内容を上書きしてしまうので使えません。
2. 移行の前に決めておくこと
作業に入る前に、次の点を相談相手とすり合わせました。あとから決めると、やり直しが発生しやすいところです。
- パーマリンクの形式:移行先のURL形式(日付入り・スラッグのみなど)を決めておきます
- 旧記事の扱い:削除するのか、301リダイレクトで移行先に転送するのか、しばらく残して noindex にするのか
- 301リダイレクトの設定:旧URLから新URLへの対応表を作れるようにしておきます
- ページビルダーやショートコードへの依存:旧サイト独自のショートコードやビルダーで作った記事は、移行先で崩れることがあります
- 内部リンク:記事同士のリンクが旧ドメインのままにならないか
また、600件規模になると XML ファイルが大きくなり、インポート中にタイムアウトしやすくなります。その場合は期間で区切って分割エクスポートします。区切りの境目で記事が抜けたり重複したりしやすいので、期間の指定とインポート後の件数はよく確認してください。
3. 記事と画像情報をまとめてエクスポート・インポートする
最終的に選んだのは、標準のエクスポートを補うプラグイン「Export media with selected content」を使う方法です。インストールすると、標準のエクスポート画面で、選んだ記事に関連するメディア(添付ファイル)の情報も一緒に XML に含められるようになります。
- 移行元に「Export media with selected content」をインストールする
- 「ツール → エクスポート」で「投稿」を選び、カテゴリーでブログを指定し、メディアも含める設定にして書き出す
- 移行先の「ツール → インポート」で WordPress インポーターを使い、XML を読み込む
- 投稿者の割り当て画面で「添付ファイルをダウンロードしてインポートする」にチェックを入れて実行する
インポーターは、XML に書かれた画像のURLを見て、旧サイトから画像をダウンロードしてきます。そのため、インポートが終わるまでは旧サイトを公開したままにしておく必要があります。Basic 認証をかけたり、先に記事を削除したりしないように注意してください。
いきなり全件を流すのではなく、最初に数記事だけでテストして、本文・アイキャッチ・カテゴリー・タグが期待どおりに入るかを確かめてから本番に進みました。
4. 取りこぼした画像を FTP でアップロードする
件数が多いと、ダウンロードに失敗した画像や、メディアとして登録されていない画像(本文に直接書かれたものなど)が出てきます。これを補うために、旧サイトの wp-content/uploads の中身を FTP で移行先にアップロードしました。
- 必ず手順3のインポートの後に行う:先にファイルを置いてしまうと、インポーターが同名ファイルを避けて別名で保存し、ファイルが二重になることがあります
- 既存のファイルはスキップする:FTP ソフトの「同名ファイルがある場合」の設定を「スキップ」にして、インポートで入った画像を上書きしないようにします
FTP で置いたファイルはメディアライブラリには登録されませんが、本文の画像として表示するだけなら問題ありません。
5. 本文中の画像URLを一括置換する
最後に、本文に残っている旧ドメインの画像URLを、移行先のURLに置き換えます。使ったのはプラグイン「Better Search Replace」です。
- データベースのバックアップを取る:置換は元に戻せないので、必ず先にバックアップします
- ドライランで件数を確認する:「ドライランとして実行」にチェックを入れたまま実行すると、実際には書き換えずに、何件が置換対象になるかだけを確認できます
- 本番の置換を実行する:件数が想定どおりなら、チェックを外して実行します
設定は次のようにしました。
検索: //old.example.com/wp-content/uploads
置換: //new.example.com/wp-content/uploads
対象テーブル: wp_posts, wp_postmeta
GUID を置換: オフ
- プロトコル(http: / https:)を省く:
//から書くと、http と https の両方のURLがまとめて対象になります。古い記事には http のURLが混ざっていることが多いので便利です - 対象テーブルを絞る:本文は
wp_posts、カスタムフィールドなどはwp_postmetaに入っています。テーブル名の接頭辞(wp_)はサイトによって違うので確認してください - GUID は置換しない:GUID は記事を識別するためのIDで、RSS リーダーなどが使っています。URLのように見えますが、書き換える必要はありません
6. 移行後に確認すること
- 記事数:移行元のカテゴリーの記事数と、移行先の記事数が一致しているか
- 画像:いくつかの記事を開いて、本文の画像とアイキャッチが表示されるか。画像URLが旧ドメインのままになっていないか
- カテゴリー・タグ・投稿者:意図したとおりに割り当てられているか
- 301リダイレクト:旧URLを開いて、移行先の記事に転送されるか
旧サイトの記事を消すのは、ここまでの確認がすべて終わってからにします。画像のダウンロード元でもあるので、早めに消すと取り返しがつかなくなります。
まとめ
- サイト丸ごと複製のプラグインは「ブログだけ移す」には使えない
- 標準エクスポートはカテゴリーで絞ると画像情報が入らないので、「Export media with selected content」で補う
- インポート時は「添付ファイルをダウンロードしてインポートする」にチェック。旧サイトは公開したままにする
- 取りこぼした画像は、インポートの後に FTP で(既存ファイルはスキップ)
- 画像URLは Better Search Replace で、バックアップ → ドライラン → 本番の順に置換。プロトコルは省き、GUID は置換しない
記事数が多いほど、「まず数件で試す」「件数を数える」が効いてきます。一度に終わらせようとせず、確認しながら少しずつ進めるのが結局いちばんの近道でした。
