2026年10月1日

2026年10月1日

WP-CLIのexportコマンドで記事をWXR形式で書き出す方法

WordPress の記事データは、WP-CLI の wp export でWXR形式(XML)のファイルに書き出せます。管理画面の「エクスポート」と同じ形式ですが、期間・投稿タイプ・投稿者などで細かく絞り込めるうえ、ファイルの分割やサーバー上での定期実行もできるのが利点です。この記事では、基本の書き出しから絞り込み、分割、書き出したファイルの確認までを説明し、WXRに何が含まれて何が含まれないかも整理します。

wp export で書き出せるもの・書き出せないもの

最初に、WXRファイルの中身を押さえておきます。ここを誤解すると「移行したのに設定が消えた」という事態になります。

含まれるもの:

  • 投稿・固定ページ・カスタム投稿タイプの記事(本文、抜粋、公開状態、日時など)
  • コメント
  • カテゴリー・タグ・カスタムタクソノミーのターム
  • カスタムフィールド(投稿メタ)
  • ナビゲーションメニュー
  • 記事の投稿者の情報(ユーザー名、表示名、メールアドレス)
  • 添付ファイルの情報と元サイトでのURL

含まれないもの:

  • 画像などのファイルそのもの
  • サイトの設定(wp_options の内容)、ウィジェット、テーマのカスタマイズ設定
  • プラグインの設定や、プラグインが独自に作ったテーブルのデータ
  • ユーザーのパスワードや権限の詳細

つまり wp export は「記事を別のサイトへ移す」「記事の控えを取る」ための道具で、サイト全体のバックアップの代わりにはなりません。サイトを丸ごと移す・残すなら、wp db export によるデータベースの書き出しと、wp-content 配下のファイルのコピーを組み合わせます。

なお、カスタム投稿タイプのうち、登録時に can_export を false にしているものは書き出しの対象になりません。プラグインが作る投稿タイプが出てこない場合は、この設定を疑います。

基本の書き出し

ここで紹介するオプションは WP-CLI 2系を前提にしています(2026年10月現在)。オプションはバージョンで変わることがあるため、wp help export で手元のヘルプも確認してください。

# 保存先を作って書き出す
mkdir -p ~/exports
wp export --dir="$HOME/exports"

# 生成されたファイルを確認
ls -lh ~/exports

--dir を省略すると、コマンドを実行したディレクトリに書き出されます。ファイル名は既定でサイト名・日付・連番を組み合わせた形(例:example.wordpress.2026-10-28.000.xml)になります。公開ディレクトリの中に書き出すと、URLを推測されてファイルを取得されるおそれがあるため、ドキュメントルートの外を保存先にしてください。

条件を絞って書き出す

投稿タイプ・公開状態で絞る

# 投稿だけ
wp export --dir="$HOME/exports" --post_type=post

# 公開済みの固定ページだけ
wp export --dir="$HOME/exports" --post_type=page --post_status=publish

下書きや非公開の記事を移行先に持ち込みたくない場合は、--post_status=publish を付けておくと整理しやすくなります。

期間で絞る

# 2025年に公開された記事
wp export --dir="$HOME/exports" --start_date=2025-01-01 --end_date=2025-12-31

日付は投稿日を基準に判定されます。更新日ではない点に注意してください。

投稿者・カテゴリー・IDで絞る

# 特定の投稿者の記事
wp export --dir="$HOME/exports" --author=tanaka

# 特定カテゴリーの記事
wp export --dir="$HOME/exports" --post_type=post --category=news

# 投稿IDを指定
wp export --dir="$HOME/exports" --post__in=120,121,135

ID指定で書き出す場合、記事に紐づく画像の情報が含まれないことがあります。アイキャッチ画像なども移したいときは --with_attachments を付けます。

コメントを除く

wp export --dir="$HOME/exports" --skip_comments

コメントにはコメント投稿者のメールアドレスやIPアドレスが含まれます。記事だけを外部の制作会社などに渡す場合は、コメントを除いておくと個人情報の扱いが楽になります。

大きなサイトはファイルを分割する

記事数が多いサイトでは、1つのXMLが大きくなりすぎて、取り込み側でメモリ不足やタイムアウトが起きやすくなります。--max_file_size でファイルあたりの上限(MB)を指定すると、上限ごとに連番付きのファイルに分割されます。

wp export --dir="$HOME/exports" --max_file_size=10

既定でも一定サイズで分割されますが、取り込み先がレンタルサーバーの管理画面などでアップロード上限が小さい場合は、その上限に合わせて小さめに指定します。分割されたファイルは番号順に取り込みます。

ID順に区切って書き出したい場合は、開始IDと件数を指定する方法もあります。

wp export --dir="$HOME/exports" --start_id=1 --max_num_posts=500

標準出力に書き出して圧縮・転送する

--stdout を付けると、ファイルを作らずに標準出力へ書き出します。圧縮やSSH転送とつなげるときに便利です。

# 圧縮して保存
wp export --stdout | gzip > ~/exports/posts-$(date +%Y%m%d).xml.gz

# 別サーバーへ直接送る(接続先は例)
wp export --stdout --post_type=post | ssh deploy@new.example.com 'cat > ~/import/posts.xml'

--stdout のときは、WP-CLI の通知メッセージが出力に混ざらないよう、エラーが出ていないかを別途確認してください。

マルチサイトでの書き出し

マルチサイトでは、--url= で対象の子サイトを指定します。指定しないとメインサイトの記事が書き出されます。

wp export --dir="$HOME/exports" --url=https://example.com/shop/

全サイトを書き出したい場合は、wp site list --field=url の結果を順に --url= に渡します。

書き出したファイルを確認する

書き出しが成功しても、中身が想定どおりとは限りません。次の方法で確認します。

# 記事(item要素)の数を数える
grep -c '<item>' ~/exports/*.xml

# XMLとして壊れていないか(xmllint がある場合)
xmllint --noout ~/exports/example.wordpress.2026-10-28.000.xml

<item> には投稿だけでなく、固定ページ・添付ファイル・メニュー項目も含まれます。件数を比較するときは、wp post list --post_type=post --format=count などで投稿タイプごとの件数も見ておくと差を説明しやすくなります。

取り込み側で画像を移す場合、インポーターは添付ファイルのURLから画像をダウンロードします。書き出したあと、取り込みが終わるまでは移行元のサイトを停止しないでください。

定期的に書き出す

記事の控えを残す目的なら、cron で定期実行できます。

# 毎週月曜3時に書き出し(WordPressのパスは環境に合わせる)
0 3 * * 1 cd /var/www/html && /usr/local/bin/wp export --dir=/home/deploy/exports --quiet

古いファイルが溜まり続けないよう、保存期間を決めて削除する仕組みも合わせて用意します。WXRには投稿者やコメント投稿者の情報が含まれるため、保存先のアクセス権も限定してください。

まとめ

  • wp export は記事・コメント・ターム・メニューをWXRで書き出す。設定・プラグインのデータ・ファイルは含まれない
  • サイト全体のバックアップには wp db export とファイルのコピーを使う
  • --post_type・--post_status・--start_date・--author などで絞り込める
  • 大きなサイトは --max_file_size で分割し、保存先はドキュメントルートの外にする
  • 書き出したファイルは件数とXMLの形式を確認し、個人情報を含むものとして扱う

お気軽にご相談ください

お見積りへ お問い合わせへ
▲