ユーザー情報を一括でCSVエクスポートする機能を実装する方法(プラグインなし)

投稿日:2024年04月08日(月) 更新日:2024年04月15日(月)
ユーザー情報を一括でCSVエクスポートする機能を実装する方法(プラグインなし)|UMENOKI|すぐに仕事で使えるIT技術情報メディア

みなさんこんにちは!エンジニアの高澤です!

今回はユーザー情報を一括でCSVエクスポートする機能を実装する方法について解説していきたいと思います。

当記事の内容を実装できれば、ユーザー情報データをご自身の自由な形でCSVエクスポートすることが可能となります。

運用上において当記事の機能によって必要になる場面がでてきたり、また、より快適で便利なWordPress管理画面の構築が可能となります。

よろしければぜひお仕事で当記事の内容をお役立ていただけましたら幸いです。

当記事の実装内容とは

まずは当記事の実装内容について事前にご説明いたします。

具体的な実装内容としては、ユーザー情報の一覧管理画面にCSVエクスポートボタンを設置し、そのボタンをクリックするとユーザー情報を作成したCSV構成でCSVエクスポートができるというものです。

下図のように独自のボタンを追加して実装いたします。

また、一覧管理画面の各ユーザー行の左側にあるチェックボックにて任意のユーザーを選択しておけば、そのユーザー分の情報をエクスポートすることができます。

逆に何も選択しておかなければすべてのユーザー情報を一括でCSVエクスポートすることができます。

この際に容量が重すぎてエクスポートできない場合がありますが、その場合の対処法については後述いたします。

当記事の内容のメリット

次は当記事のメリットについてご説明いたします。

メリットとしては以下のことがあげられます。

  • 自由にCSVエクスポートをカスタマイズできる
  • データの運用・管理が楽になる
  • 実装が比較的簡単

当記事で紹介する内容の実装方法お使い頂ければ、コピー&ペーストしていただきご自身用にカスタマイズしていただければ自由度高く独自のCSVエクスポート機能を実装することが可能です。

また、ご自身で好きなように構成できるので、エクセルやGoogleスプレットシートなどでの閲覧もしやすく、データの運用・管理が楽になります。

実装に関しても当記事のコードをコピー&ペーストしていただき少し自分用にカスタマイズするだけなので、実装も簡単です。

機能を実装する方法

それでは早速CSVエクスポート機能の実装方法について解説していきます。

サンプルコードをfunctions.phpにコピペする

最初にコードを記述して機能の雛形を実装していきましょう。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// ボタン追加
function admin_user_list_add_export_button($which) {
    // ユーザー一覧管理画面にCSVエクスポートボタンを追加
	?>
	<input type="submit" name="export_users" class="button button-primary" value="<?php _e('CSVエクスポート'); ?>" />
	<?php
}
add_action('manage_users_extra_tablenav', 'admin_user_list_add_export_button', 20, 1);

// CSVエクスポート処理
function func_export_users() {
    // CSVエクスポートボタンがクリックされたかどうかを確認
	if(isset($_GET['export_users'])) {
		// 選択されたユーザーのIDをカンマ区切りの文字列に変換
		if(isset($_GET['users']) && is_array($_GET['users'])) {
			$user_post = implode(',', $_GET['users']);
		}

		// 選択されたユーザーの情報を取得
		$arg = array(
			'include' => $user_post,
		);
		$arr_user = get_users($arg);

		if($arr_user) {
			// CSVヘッダーを設定
			header('Content-type: text/csv');
			header('Content-Disposition: attachment; filename="users'.date('YmdHms').'.csv"');
			header('Pragma: no-cache');
			header('Expires: 0');
 
			$file = fopen('php://output', 'w');
			stream_filter_prepend($file, 'convert.iconv.utf-8/cp932//TRANSLIT');

			// CSVヘッダーを設定
			fputcsv($file, array('ユーザー ID', 'ユーザー名', 'custom_field1', 'custom_field2'));
  
			// ユーザー情報をCSVファイルに書き込む
			foreach($arr_user as $user) {
                // ユーザー情報を取得
				// ここで各ユーザーの情報を取得してCSVに書き込む処理を行う
				// 例:
				// $user_id = $user->ID;
				// $user_name = $user->user_nicename;
				// 他のユーザー情報も同様に取得してCSVに書き込む
				// fputcsv($file, array($user_id, $user_name, ...));
                
                // custom_field1
                $custom_field1 = get_user_meta($user->ID, 'custom_field1')[0];
                // custom_field2
                $custom_field2 = get_user_meta($user->ID, 'custom_field2')[0];

                fputcsv($file, array($user->ID, $user->user_nicename, $custom_field1, $custom_field2));
			}

			exit();
		}
	}
}
// イニシャライズフックでCSVエクスポート関数を呼び出し
add_action('init', 'func_export_users');

上記コードをペースト後して保存後、管理画面のページを更新していただくとユーザー一覧管理画面に青色のボタンが上下に新規追加されているのが確認できるかと思います。

必要な部分をカスタマイズする

ペーストが完了したら、必要な部分を自分用にカスタマイズしていきます。

カスタマイズが必要な部分は以下になります。

  • シートの一行目の項目部分
  • データ行の必要な出力処理の部分
  • シートの一行目以外のデータ行の部分

それぞれ解説していきます。

シートの一行目の項目部分

掲載しているサンプルコードの37行目の値の内容をカスタマイズしていきます。

ご確認いただくと以下のコードがあるのが確認できるかと思います。

<?php
fputcsv($file, array('ユーザー ID', 'ユーザー名', 'custom_field1', 'custom_field2'));

fputcsv()関数の第2引数のarray()の中身を自分用に変更してください。

もし仮にサンプルコードのままエクスポートした場合、下図のようなイメージで一行目が出力されます。

データ行の必要な出力処理の部分

次に掲載しているサンプルコードの50〜52行目の値の内容をカスタマイズしていきます。

ご確認いただくと以下のコードがあるのが確認できるかと思います。

<?php
// custom_field1
$custom_field1 = get_user_meta($user->ID, 'custom_field1')[0];
// custom_field2
$custom_field2 = get_user_meta($user->ID, 'custom_field2')[0];

記述をご覧いただくとわかるかと思いますが、get_user_meta()関数でユーザーのカスタムフィールドを取得して、データ名が「custom_field1」のデータを$custom_field1変数に、データ名が「custom_field2」のデータを$custom_field2変数にそれぞれデータを代入しています。

それぞれの変数は次のデータ行の出力で必要になります。

シートの一行目以外のデータ行の部分

次に掲載しているサンプルコードの54行目の値の内容をカスタマイズしていきます。

ご確認いただくと以下のコードがあるのが確認できるかと思います。

<?php
fputcsv($file, array($user->ID, $user->user_nicename, $custom_field1, $custom_field2));

この行の変更のコツとしては、先ほど変更した項目の順番とデータ出力内容の順番を一致させることが重要です。

設定をしていただければ下図のイメージで無事データが出力されます。

ここまでで一連のオリジナルのCSVエクスポート機能の実装は完了しました。

お疲れ様でした!

manage_users_extra_tablenavフックとは

実装が完了したら、コード中にあるフックについて念の為解説しておきたいと思います。

フックについて理解しておけば後々応用が効くことがあるため、ここで確認しておきましょう。

manage_users_extra_tablenavフックとは、WordPress の管理画面でユーザーを一覧表示する際に、ユーザー一覧テーブルの上部に追加のナビゲーションタブを挿入するためのフックです。

これを使用することで、ユーザー一覧画面に独自のフィルターやアクションを追加して、ユーザー管理に関するカスタム機能を実装することができます。

このフックを使用すると、ユーザー一覧ページの上部にカスタムのリンクやボタンを追加できるため、管理者がユーザーをフィルタリングしたり、特定のアクションを実行したりする際に便利です。

initフックとは

2つ目のinitフックとは、WordPress の初期化プロセスの一部で、WordPressシステムが処理を開始する際に発生する重要なフックの1つです。

このフックは、WordPress のほとんどの機能が利用可能になり、各種リソースや設定がロードされた後に呼び出されます。

具体的には、WordPress の初期化処理が進行している段階で、テーマ、プラグイン、およびその他のリソースがロードされ、WordPress の基本的な機能が有効になります。

その後、init フックが発生し、カスタムコードやプラグインがこのタイミングでフックにフックされた処理を実行できます。

たとえば、init フックを使用して、カスタム投稿タイプやカスタムタクソノミーを登録する、セッションを開始する、特定のデータベースクエリを実行するなどのタスクを実行することができます。

容量が重くてエクスポートができない場合の対処法

当記事のCSVエクスポート機能を実装して実際にエクスポートをした際に容量が重すぎてエクスポートができない場合があります。

この時に必要な対応方法についてここで解説させていただきます。

結論、サーバーにあるPHPの設定ファイルであるphp.iniの内容に以下を追加、もしくは修正してください。

memory_limit:1G
post_max_size:1G

内容としては、「memory_limit」と「post_max_size」になります。

ここでは例として両方とも「1G」にしておりますが、ご自身のサイトの状況に合わせて数値を設定してください。

それぞれ解説いたします。

memory_limitとは

memory_limitディレクティブは、PHP スクリプトが使用できる最大メモリ量を設定します。

ここでは、1G と指定されており、PHP スクリプトが最大で 1 ギガバイトのメモリを使用できるようになります。

大規模な操作やメモリを多く消費する処理を行う場合に便利です。

post_max_sizeとは

post_max_sizeディレクティブは、HTTP POSTリクエストで送信されるデータの最大サイズを制限します。

投稿データがこのサイズを超える場合、データは切り捨てられます。

ここでは、1G と指定されているため、HTTP POST リクエストのデータサイズが最大で 1 ギガバイトに制限されます。

上記の設定が完了すれば、エクスポートボタンクリック時にエラーになってしまうところを解決でき、エクスポートできるようになります。

まとめ

ユーザー情報を一括でCSVエクスポートする機能を実装する方法について解説は以上になります。

当記事の内容を実装できれば、ユーザー情報データを自由な形でCSVエクスポートすることが可能となります。

このような実装は、運用上において必要になったり、また、より快適なWordPress管理画面の構築が可能となります。

お仕事でそのまま活かすことができますので、よろしければぜひ当記事の内容をお役立ていただけましたら幸いです。

執筆者

UMENOKI編集部 高澤 翔汰

歴5年目(2024年8月以降から5年目です)のエンジニアです!
CMSでのサイト構築とWebデザイン制作を兼任して5年目になります。
自作のiOSアプリ(iPhoneアプリ)やWordPressプラグインを開発することもあり、まだまだ現在進行形で勉強中です!

お気軽に皆さんのご要望をお聞かせください!

どんなに些細なことでも構いません!よろしければ記事や当サイトへの「こんな記事があったら仕事とかで役に立つな〜」や「こうだったらもっと役に立つのに!」といったようなご要望等をお気軽にお聞かせください!今後のサービス改善にお役立てさせていただきます!

例1)Reactの技術記事を書いてほしい!
例2)WordPressの使い方とかを初心者向けに解説してほしい!...など

送信と同時にプライバシーポリシーに同意したものとします。
サンタさん