2026年7月11日

2026年7月11日

WordPressのデータベースをCSVエクスポートする4つの方法と注意点

WordPress のデータを CSV で取り出したい場面は、集計や他システムへの移行、顧客リストの確認などさまざまです。ただし CSV は「表の一部を取り出す」ための形式で、データベース全体のバックアップには向きません。バックアップが目的なら、SQL 形式のダンプ(wp db export や mysqldump)を使います。

この記事では、CSV で書き出す方法を、使える環境の広い順に4つ紹介します。

方法 向いている用途 必要なもの
WP-CLI の --format=csv 投稿・ユーザー・タームなどの一覧 SSH と WP-CLI
WP-CLI + wpdb + fputcsv 任意の SQL の結果を CSV にする SSH と WP-CLI
phpMyAdmin のエクスポート SSH が使えない共用サーバー phpMyAdmin
SELECT ... INTO OUTFILE DB サーバー上で大量の行を書き出す MySQL の FILE 権限

方法1: WP-CLI の一覧コマンドを CSV で出力する

WP-CLI の wp post list や wp user list などの一覧コマンドは、--format=csv を付けると CSV で出力します。WordPress の API を通して取得するので、テーブル接頭辞(wp_ 以外の場合)を意識する必要がありません。

# 公開済みの投稿を ID・タイトル・公開日・URL で書き出す
wp post list --post_type=post --post_status=publish \
  --fields=ID,post_title,post_date,url --format=csv > posts.csv

# ユーザーの一覧
wp user list --fields=ID,user_login,user_email,roles --format=csv > users.csv

# カテゴリーの一覧
wp term list category --fields=term_id,name,slug,count --format=csv > categories.csv

wp post list には WP_Query の引数を --<引数名>=<値> の形で渡せます。既定では条件に合う全件が対象です。特定の投稿者だけに絞るなら --author=2 のように追加します。

1行目には項目名が入ります。出力は WordPress の文字コード(通常 UTF-8)のままです。

方法2: 任意の SQL の結果を CSV にする(wpdb と fputcsv)

投稿とカスタムフィールドを結合した結果など、一覧コマンドにない形で取り出したい場合は、wp eval-file で PHP を実行し、$wpdb で取得した結果を PHP の fputcsv() で書き出します。データベースの FILE 権限が不要で、カンマや改行を含む値も正しく引用符で囲まれます。

次の例は、公開済みの投稿と、カスタムフィールド price の値を書き出します。ファイル名は export-csv.php とします。

<?php
// export-csv.php: wp eval-file export-csv.php > out.csv で実行する
global $wpdb;

$sql = $wpdb->prepare(
	"SELECT p.ID, p.post_title, p.post_date, pm.meta_value AS price
	 FROM {$wpdb->posts} p
	 LEFT JOIN {$wpdb->postmeta} pm
	   ON pm.post_id = p.ID AND pm.meta_key = %s
	 WHERE p.post_type = %s AND p.post_status = %s
	 ORDER BY p.ID",
	'price',
	'post',
	'publish'
);

$rows = $wpdb->get_results( $sql, ARRAY_A );

$out = fopen( 'php://stdout', 'w' );
if ( ! empty( $rows ) ) {
	// 1行目に列名を書く
	fputcsv( $out, array_keys( $rows[0] ), ',', '"', '' );
	foreach ( $rows as $row ) {
		fputcsv( $out, $row, ',', '"', '' );
	}
}
fclose( $out );
wp eval-file export-csv.php > posts-price.csv

ポイントは次のとおりです。

  • テーブル名は {$wpdb->posts} のように書くと、接頭辞が wp_ 以外でも動きます。
  • 値は $wpdb->prepare() のプレースホルダーで渡します。
  • fputcsv() の5番目の引数(エスケープ文字)に空文字を渡すと、値の中の " を "" と二重にする一般的な CSV の書き方になります。PHP 8.4 以降は、この引数を省略すると非推奨の警告が出ます(2026年10月時点)。

行数が数十万件を超える場合は、get_results() で全件をメモリに載せるとメモリ不足になることがあります。その場合は LIMIT と OFFSET で分けて取得するか、次の方法4を検討します。

方法3: phpMyAdmin でエクスポートする

SSH が使えない共用サーバーでは、サーバー会社のコントロールパネルから phpMyAdmin を開いて書き出します。

  1. 左の一覧から WordPress のデータベースを選び、対象のテーブル(例: wp_posts)をクリックします。
  2. 上部の「エクスポート」タブを開きます。
  3. フォーマットで「CSV」を選びます。
  4. 一部の行だけが必要なら、先に「SQL」タブで SELECT 文を実行し、結果画面の下にある「エクスポート」から書き出すと、その結果だけを CSV にできます。
  5. 「詳細」を選ぶと、区切り文字や「1行目にカラム名を入れる」などを指定できます。

phpMyAdmin のバージョンやサーバー会社によって画面の表記が少し異なります。

方法4: SELECT ... INTO OUTFILE で DB サーバー上に書き出す

MySQL / MariaDB の SELECT ... INTO OUTFILE は、クエリの結果を DB サーバー上の ファイルに書き出します。Web サーバーと DB サーバーが別の構成では、ファイルは DB サーバー側にできる点に注意してください。

使うには次の条件があります。

  • 実行ユーザーに FILE 権限があること(共用サーバーではほぼ付与されていません)
  • 書き出し先が secure_file_priv で許可されたディレクトリであること
  • 同じ名前のファイルが存在しないこと(上書きはできません)

まず secure_file_priv を確認します。

SHOW VARIABLES LIKE 'secure_file_priv';

値が空なら制限なし、ディレクトリ名(例: /var/lib/mysql-files/)ならそのディレクトリにだけ書き出せます。NULL なら書き出しは無効です。

SELECT ID, post_title, post_date
FROM wp_posts
WHERE post_type = 'post' AND post_status = 'publish'
INTO OUTFILE '/var/lib/mysql-files/wp_posts.csv'
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';

この方法には次の制約があります。

  • 1行目に列名は入りません。必要なら列名だけの行を UNION ALL で先頭に足します。
  • 既定のエスケープ文字はバックスラッシュで、値の中の改行や " は \ 付きで書き出されます。投稿本文(post_content)のように改行を含む列は、表計算ソフトで開くと崩れやすいため、方法2のほうが扱いやすくなります。
  • 書き出したファイルは DB サーバーのプロセス(mysql ユーザー)の所有になります。

Excel で開くと文字化けする場合

上の方法で作った CSV は UTF-8(BOM なし)です。日本語版の Excel でファイルをダブルクリックして開くと、文字化けすることがあります。次のどちらかで対処します。

  • Excel の「データ」タブ →「テキストまたは CSV から」で読み込み、文字コードに「65001: Unicode (UTF-8)」を選ぶ
  • ファイルの先頭に BOM を付けてから開く
# 先頭に UTF-8 の BOM を付けたコピーを作る
printf '\xEF\xBB\xBF' | cat - posts.csv > posts_bom.csv

取り扱いの注意

  • wp_users のメールアドレスなどは個人情報です。必要な列だけを書き出し、作業が終わったらサーバー上のファイルを削除します。公開ディレクトリ(ドキュメントルートの下)には置かないでください。
  • MySQL にログインするときは mysql -u ユーザー名 -p のように -p の後にパスワードを書かず、入力を求めさせます。コマンド履歴にパスワードが残るのを防ぐためです。
  • 大きなテーブルの書き出しは DB に負荷がかかります。アクセスの少ない時間帯に行うか、条件で行数を絞ります。
  • サーバーからの持ち出しには scp などの暗号化された経路を使います。

まとめ

  • 投稿・ユーザー・ターム程度なら wp post list --format=csv などの WP-CLI の一覧コマンドが手軽
  • 任意の SQL の結果は wp eval-file と $wpdb、fputcsv() で書き出すと、権限を問わず正しい CSV になる
  • SSH が無い環境では phpMyAdmin の「エクスポート」で CSV を選ぶ
  • SELECT ... INTO OUTFILE は FILE 権限と secure_file_priv の制限があり、DB サーバー上にファイルができる
  • CSV はバックアップの代わりにならないので、バックアップは SQL ダンプで取る

お気軽にご相談ください

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