Help us understand the problem. What is going on with this article?

[WordPress]管理画面でcsvダウンロード

結構要望が多い機能だと思うが割と情報が無い。
投稿一覧(edit.php)かプラグインでやる。
それぞれに良し悪しあるんで状況によって判断。

投稿一覧でやる

バルクアクション(一括操作のプルダウン)に追加する。
ボタン単体でやらせたいけどいい感じのフック見つからずひとまず断念。

追記(2020/03/30)
いい感じのフック見つかる→ manage_posts_extra_tablenav

manage_posts_extra_tablenav
    $format = '
<div class="alignleft actions">
    <button type="submit" class="button" name="action">ダウンロード</button>
</div>';
functions.php
add_filter('bulk_actions-edit-member', function ($bulk_actions) {
    $bulk_actions['download'] = 'ダウンロード';
    return $bulk_actions;
});

add_action('load-edit.php', function () {
    $wp_list_table = _get_list_table('WP_Posts_List_Table');
    $action = $wp_list_table->current_action();
    if ( !$action || $action != 'download' ) return;
    check_admin_referer('bulk-posts');
    $row;
    if ( empty($row) ) return;
    $filepath = sprintf('%s.csv', date('YmdHis'));
    if ( touch($filepath) ) {
        $file = new SplFileObject($filepath, "w");
        $file->fputcsv([
                _s('タイトル'),
                _s('作成日'),
        ]);
        foreach ($row as $r) {
            $file->fputcsv([
                    _s($r['post_title']),
                    $r['created'],
            ]);
        }
        @header("Pragma: public");
        @header("Expires: 0");
        @header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        @header("Cache-Control: private", false);
        @header("Content-Type: application/force-download");
        @header("Content-Disposition: attachment; filename=\"".basename($filepath)."\";" );
        @header("Content-Transfer-Encoding: binary");
        @readfile($filepath);
        unlink($filepath);
        die;
    }

});

function _s($val) {
    return mb_convert_encoding($val, 'SJIS-win', 'UTF-8');
}

プラグイン作ってやる

プラグインはあんまり作らなくて諸々知らないので
きっとちゃんとしたやり方があると思われ。

/plugins/{plugin-slug}/{plugin-slug}.php
/*
 * 省略
 */

add_action('init', function () {
    if ( is_admin() && ($_REQUEST['page']??'')=='{menu_slug}' && ($_REQUEST['cmd']??'')=='download' ) {
        $row;
        if ( empty($row) ) return;
        $filepath = sprintf('%s.csv', date('YmdHis'));
        if ( touch($filepath) ) {
            $file = new SplFileObject($filepath, "w");
            $file->fputcsv([
                    _s('タイトル'),
                    _s('作成日'),
            ]);
            foreach ($row as $r) {
                $file->fputcsv([
                        _s($r['post_title']),
                        $r['created'],
                ]);
            }
            @header("Pragma: public");
            @header("Expires: 0");
            @header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            @header("Cache-Control: private", false);
            @header("Content-Type: application/force-download");
            @header("Content-Disposition: attachment; filename=\"".basename($filepath)."\";" );
            @header("Content-Transfer-Encoding: binary");
            @readfile($filepath);
            unlink($filepath);
            die;
        }
    }
});
ki6ool
絶対ワードプレス使うマン
https://6oolab.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away