【WordPress】管理画面の一覧テーブルにCSVダウンロードボタンを追加する方法

【WordPress】管理画面の一覧テーブルにCSVダウンロードボタンを追加する方法 WordPress

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)します。上記コードのように、出力の先頭に"\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)の両方で発火し、コールバックには$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での文字化けには注意しましょう。