WordPressで投稿やカスタム投稿の一覧をCSV形式で出力したいという要望は、管理業務やデータ分析の現場でよくあります。この記事では、管理画面の一覧テーブルにCSVダウンロードボタンを追加し、一覧に表示されているデータをそのままCSVとして出力する方法を紹介します。
CSV出力用のカスタムアクションを追加する
まず、管理画面でCSVダウンロードリクエストを検知し、データを出力する処理をfunctions.phpに記述します。
functions.php:CSV出力処理
function export_custom_post_csv() {
if (!is_admin() || !current_user_can('manage_options')) return;
if (!isset($_GET['export_csv']) || $_GET['export_csv'] !== 'true') return;
$post_type = isset($_GET['post_type']) ? sanitize_key($_GET['post_type']) : 'post';
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="' . $post_type . '-list.csv"');
$output = fopen('php://output', 'w');
// ExcelでUTF-8のCSVを開くと日本語が文字化けするため、先頭にBOMを書き込む
fwrite($output, "\xEF\xBB\xBF");
$args = array(
'post_type' => $post_type,
'post_status' => 'publish',
'posts_per_page' => -1,
);
$query = new WP_Query($args);
fputcsv($output, array('ID', 'タイトル', '公開日'));
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
fputcsv($output, array(get_the_ID(), get_the_title(), get_the_date('Y-m-d')));
}
}
fclose($output);
exit;
}
add_action('admin_init', 'export_custom_post_csv');
UTF-8のBOMを必ず付与する
Microsoft Excel(特にWindows版)はBOMなしのUTF-8を正しく自動判定できず、日本語を含むCSVをそのまま開くと文字化け(mojibake)します。上記コードのように、出力の先頭に
Microsoft Excel(特にWindows版)はBOMなしのUTF-8を正しく自動判定できず、日本語を含むCSVをそのまま開くと文字化け(mojibake)します。上記コードのように、出力の先頭に
"\xEF\xBB\xBF"(UTF-8 BOM)を書き込んでおくことで、Excelで開いても日本語が正しく表示されます。投稿一覧画面にCSVボタンを追加する
次に、管理画面の投稿一覧テーブルの上にCSVダウンロード用のボタンを追加します。
functions.php:CSVダウンロードボタンの追加
function add_csv_export_button($which) {
// 上部(top)と下部(bottom)の両方で発火するため、二重表示を防ぐため上部のみ出力する
if ($which !== 'top') return;
$screen = get_current_screen();
if ($screen->base === 'edit' && post_type_exists($screen->post_type)) {
$url = add_query_arg(array(
'export_csv' => 'true',
'post_type' => $screen->post_type
), admin_url('edit.php'));
echo '<div class="wrap"><a href="' . esc_url($url) . '" class="button button-primary">CSVダウンロード</a></div>';
}
}
add_action('manage_posts_extra_tablenav', 'add_csv_export_button');
manage_posts_extra_tablenavフックを使うことで、投稿一覧の上部または下部に任意のHTMLを出力できます。
$whichを受け取らないとボタンが二重表示される
このフックは一覧テーブルの上部(top)と下部(bottom)の両方で発火し、コールバックには
このフックは一覧テーブルの上部(top)と下部(bottom)の両方で発火し、コールバックには
$whichという引数(’top’または’bottom’)が渡されます。この引数を受け取らずに無条件で出力すると、フックが2回呼ばれた分だけ「CSVダウンロード」ボタンが上下に2回表示されてしまいます。$which !== 'top'のときは処理をスキップすることで、1回だけ表示されるようにしましょう。出力されるCSVの内容をカスタマイズする
タイトルや公開日だけでなく、カスタムフィールドや投稿者名、タクソノミーなどを出力したい場合は、fputcsvの中身を自由に拡張可能です。
CSV出力内容の拡張例
$author = get_the_author(); $custom_value = get_post_meta(get_the_ID(), 'your_custom_field', true); fputcsv($output, array(get_the_ID(), get_the_title(), $author, $custom_value));
よくある質問(FAQ)
Q管理画面にCSVダウンロードボタンを追加するには?
Aadmin_post_{action}フックでCSVのHTTPレスポンスを返す処理を実装し、管理画面にそのURLへのリンクボタンを表示します。Content-Type: text/csvとContent-Disposition: attachment; filename=”export.csv”ヘッダーを送信します。
QWordPressの記事データをCSVに出力するPHPコードの例は?
AWP_Queryで記事を全件取得し、fputcsv()でCSV行を出力します。日本語を含む場合は出力の先頭にUTF-8 BOM(”\xEF\xBB\xBF”)を書き込むか、mb_convert_encoding()でShift-JISに変換することでExcelでの文字化けを防げます。
Q大量データをCSV出力する際のメモリ不足対策は?
AWP_Queryのposts_per_page=100等で分割取得し、各バッチを即時出力(echo + ob_flush() + flush())することでメモリ使用量を抑えます。wp_raise_memory_limit(‘admin’)でメモリ上限を引き上げることもできます。
まとめ
WordPressの管理画面にCSVダウンロード機能を組み込むことで、投稿データのバックアップや分析、帳票出力などの運用が効率化できます。プラグインに頼らず独自に実装することで、必要な項目だけを柔軟に出力できる点が大きなメリットです。ボタンの二重表示とExcelでの文字化けには注意しましょう。

