<p class="wp-block-paragraph">こんにちわ、わかっち (<a href="https://twitter.com/wakatchi_tech">@wakatchi_tech</a>) です。</p>
<p class="wp-block-paragraph">WordPressで開発したサイトを運営していると、サイト独自の設定を保存したり、運用しながら設定を変更、サイト内のデータを取得したいことがあります。</p>
<p class="wp-block-paragraph">過去3回の記事では、管理メニューや設定画面の追加方法をご紹介しました。</p>
<div class="wp-block-vk-blocks-slider swiper swiper-container vk_slider vk_slider_bf72abe8-379f-4079-aada-5b31590a04a4" data-vkb-slider="{"autoPlay":true,"autoPlayStop":false,"autoPlayDelay":8000,"pagination":"bullets","width":"","loop":true,"effect":"slide","speed":2500,"direction":"rtl","slidesPerViewMobile":1,"slidesPerViewTablet":1,"slidesPerViewPC":1,"slidesPerGroup":"one-by-one","centeredSlides":false,"zoomAnimation":false,"zoomInitialScale":1,"zoomFinalScale":1.25,"blockId":"bf72abe8-379f-4079-aada-5b31590a04a4"}"><div class="swiper-wrapper">
<div class="wp-block-vk-blocks-slider-item vk_slider_item swiper-slide vk_valign-center vk_slider_item-a4577808-d1cb-4446-af59-5a85eb54b825 vk_slider_item-paddingVertical-none" style="padding-right:0;padding-left:0"><div class="vk_slider_item-background-area has-background-dim has-background-dim-5" style="padding-left:0;padding-right:0"></div><div class="vk_slider_item_container">
<figure class="wp-block-embed aligncenter is-type-wp-embed"><div class="wp-block-embed__wrapper">
<div class="blog-card">
<div class="blog-card-body-outer">
<div class="blog-card-body">
<h5 class="blog-card-title">
<a href="https://wakatchi.dev/wordpress-admin-dev/">WordPressに独自の管理メニューを追加する① トップメニューの追加</a>
</h5>
<p class="blog-card-text">
サイト独自の設定は、WordPressの管理メニューを独自に開発することをお勧めします。サイトの設定値(パラメーター)は、プラグインエディタなどを使いfunction.phpなどの… </p>
<div class="blog-card-site-title">
<a href="https://wakatchi.dev">
<img loading="lazy" src="https://wakatchi.dev/wp-content/uploads/2025/03/ww-logo2-100x100.webp" width="16" height="16" alt="" >
わかっちウォッチ </a>
</div>
</div>
</div>
<div class="blog-card-image-outer">
<a href="https://wakatchi.dev/wordpress-admin-dev/" class="blog-card-image-frame">
<img class="blog-card-image-src" src="https://wakatchi.dev/wp-content/uploads/2023/01/wordpress-admin-menu1-1024x683.jpg" alt="">
</a>
</div>
</div>
</div></figure>
</div></div>
<div class="wp-block-vk-blocks-slider-item vk_slider_item swiper-slide vk_valign-center vk_slider_item-fee83871-d386-40b0-b851-2260be0c6821 vk_slider_item-paddingVertical-none" style="padding-right:0;padding-left:0"><div class="vk_slider_item-background-area has-background-dim has-background-dim-5" style="padding-left:0;padding-right:0"></div><div class="vk_slider_item_container">
<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<div class="blog-card">
<div class="blog-card-body-outer">
<div class="blog-card-body">
<h5 class="blog-card-title">
<a href="https://wakatchi.dev/wordpress-admin-submenu/">WordPressに独自のサブメニューの追加する</a>
</h5>
<p class="blog-card-text">
こんにちわ、サイト管理者のわかっち (@wakatchi_tech) です。 WordPressで開発したサイトを運営していると、サイト独自の設定を保存したり、運用しながら設定を変更した… </p>
<div class="blog-card-site-title">
<a href="https://wakatchi.dev">
<img loading="lazy" src="https://wakatchi.dev/wp-content/uploads/2025/03/ww-logo2-100x100.webp" width="16" height="16" alt="" >
わかっちウォッチ </a>
</div>
</div>
</div>
<div class="blog-card-image-outer">
<a href="https://wakatchi.dev/wordpress-admin-submenu/" class="blog-card-image-frame">
<img class="blog-card-image-src" src="https://wakatchi.dev/wp-content/uploads/2023/10/wordpress-admin-menu2-1024x683.jpg" alt="">
</a>
</div>
</div>
</div></figure>
</div></div>
<div class="wp-block-vk-blocks-slider-item vk_slider_item swiper-slide vk_valign-center vk_slider_item-e3296069-4230-4e06-ac1c-67fddf4e1dcb vk_slider_item-paddingVertical-none" style="padding-right:0;padding-left:0"><div class="vk_slider_item-background-area has-background-dim has-background-dim-5" style="padding-left:0;padding-right:0"></div><div class="vk_slider_item_container">
<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<div class="blog-card">
<div class="blog-card-body-outer">
<div class="blog-card-body">
<h5 class="blog-card-title">
<a href="https://wakatchi.dev/wordpress-admin-settings-api/">WordPressに値を設定する独自の管理メニューを追加する</a>
</h5>
<p class="blog-card-text">
こんにちわ、わかっち (@wakatchi_tech) です。 WordPressで開発したサイトを運営していると、サイト独自の設定を保存したり、運用しながら設定を変更したいことがありま… </p>
<div class="blog-card-site-title">
<a href="https://wakatchi.dev">
<img loading="lazy" src="https://wakatchi.dev/wp-content/uploads/2025/03/ww-logo2-100x100.webp" width="16" height="16" alt="" >
わかっちウォッチ </a>
</div>
</div>
</div>
<div class="blog-card-image-outer">
<a href="https://wakatchi.dev/wordpress-admin-settings-api/" class="blog-card-image-frame">
<img class="blog-card-image-src" src="https://wakatchi.dev/wp-content/uploads/2023/10/wordpress-admin-menu3-1024x683.jpg" alt="">
</a>
</div>
</div>
</div></figure>
</div></div>
</div><div class="swiper-button-next swiper-button-mobile-bottom"></div><div class="swiper-button-prev swiper-button-mobile-bottom"></div><div class="swiper-pagination swiper-pagination-bullets"></div></div>
<p class="wp-block-paragraph"></p>
<p class="wp-block-paragraph">今回の記事は、管理メニューの画面から、サイト内のデータを取得(ダウンロード)する方法をご紹介します。</p>
<div class="wp-block-vk-blocks-border-box vk_borderBox vk_borderBox-background-transparent has-text-color has-pale-cyan-blue-color is-style-vk_borderBox-style-solid-kado-tit-tab"><div class="vk_borderBox_title_container has-background has-pale-cyan-blue-background-color"><i class=""></i><h4 class="vk_borderBox_title" id="vk-border-box-4cfbe540-de97-4402-b8a7-5657010bae9d"><strong>この記事は次のような方にお勧めです</strong></h4></div><div class="vk_borderBox_body">
<ul class="wp-block-list is-style-vk-check-mark">
<li>WordPressのサイト開発者で、サイト全体に関するデータをWordPressの管理メニューから取得したい人</li>
<li>WordPressのテーマやプラグインの開発者</li>
</ul>
</div></div>
<div class="wp-block-vk-blocks-table-of-contents-new vk_tableOfContents vk_tableOfContents-style-default tabs" data-use-custom-levels="false" data-custom-levels=""><div class="tab"><div class="vk_tableOfContents_title">目次</div><input type="checkbox" id="chck-toc-s3bdcrox"/><label class="tab-label vk_tableOfContents_openCloseBtn button_status button_status-open" for="chck-toc-s3bdcrox" id="vk-tab-label-toc-s3bdcrox">CLOSE</label><ul class="vk_tableOfContents_list tab_content-open">
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-994bea69-61c7-49ec-8c7b-a0ae328d0bf9" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">1. </span>
管理メニューのコード例
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-dfa185c0-1ec9-46f4-8549-ea77c8f10809" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">2. </span>
管理メニューに画面を組み込む手順
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-beaa713a-143f-4461-9f8f-62124633fb3f" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">3. </span>
管理メニューの画面を描画する
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-c21ee71e-77c8-4189-94f9-d38ba163a340" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">4. </span>
ダウンロード処理を実装する
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-3">
<a href="#vk-htags-3c970e9f-bf9e-4a6e-8c9e-afc7d4910c32" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">4.1. </span>
ダウンロード関数の登録
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-3">
<a href="#download_function" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">4.2. </span>
ダウンロード処理の実装
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-4">
<a href="#vk-htags-f69c74e8-05b2-4903-bfa2-15d3168fbfbf" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">4.2.1. </span>
管理メニューからの呼び出しかを判定する
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-4">
<a href="#vk-htags-6d67439a-01e9-4d12-b496-9bd5d0a07796" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">4.2.2. </span>
出力ストリームにCSVデータを書き込む
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-2f921e05-7393-4724-9eb1-b62bfd4024e2" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">5. </span>
まとめ
</a>
</li>
</ul></div></div>
<h2 class="wp-block-heading" id="vk-htags-994bea69-61c7-49ec-8c7b-a0ae328d0bf9">管理メニューのコード例</h2>
<p class="wp-block-paragraph">この記事でご紹介するのは、管理メニューの画面でダウンロードボタンを押すと、CSVデータをダウンロードするというサンプルです。</p>
<p class="wp-block-paragraph">「ヘッダーの有無」のチェックボックスで、CSVデータの1行目にヘッダーを出力するかを選択できます。</p>
<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://wakatchi.dev/wp-content/uploads/2023/10/wordpress-admin-download-view.png"><img src="https://wakatchi.dev/wp-content/uploads/2023/10/wordpress-admin-download-view.png" alt="" class="wp-image-902" style="aspect-ratio:2.910891089108911;width:780px;height:auto"/></a></figure>
</div>
<p class="wp-block-paragraph"></p>
<p class="wp-block-paragraph">ダウンロードすると、次のCSVデータを取得できます。</p>
<p class="wp-block-paragraph">データを3行分だけ出力し、ヘッダーにカラム名を出力しています。</p>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-white-color has-black-background-color has-text-color has-background wp-block-paragraph">field-A,field-B,field-C<br>AA,AB,AC<br>BA,BB,BC<br>CA,CB,CC</p>
</blockquote>
<p class="wp-block-paragraph">上記の画面は、下記のソースコードでWordPressに組み込むことが可能です</p>
<p class="wp-block-paragraph">function.phpや<a href="https://ja.wordpress.org/plugins/code-snippets/" data-type="link" data-id="https://ja.wordpress.org/plugins/code-snippets/">Code Snippetsプラグイン</a>などを使ってそのままコピペしてみてください。</p>
<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code><?php
add_action(
'admin_menu',
function(){
// トップメニューを追加
add_menu_page(
'管理メニュータイトル'
, 'テスト用トップメニュー'
, 'manage_options'
, 'top_menu'
, 'render_menu_contents'
,'dashicons-networking'
,0
);
// セクションを追加
add_settings_section(
'top_menu_section'
,''
,function(){}
,'top_menu'
);
// フィールドを追加
add_settings_field(
'key_enable_header'
,'ヘッダーの有無'
,'render_enable_header_field'
,'top_menu'
,"top_menu_section"
,array( 'label_for' => 'key_enable_header' )
);
// グループにフィールドを登録
register_setting(
"top_menu_group"
,'key_enable_header'
);
}
);
// ダウンロード用の関数を登録
add_action(
'admin_init'
,'download'
);
// トップメニュー画面を描画する
function render_menu_contents() {
?>
<div class = "wrap">
<h1>CSVダウンロードサンプル</h1>
<form method = "post" action = "" >
<?php
settings_fields( 'top_menu_group' );
do_settings_sections( 'top_menu' );
submit_button( 'ダウンロード' , 'primary','download',false );
?>
</form>
</div>
<?
}
// フィールドを描画する
function render_enable_header_field( $args ){
?>
<input
type="checkbox"
id=<?= 'key_enable_header' ?>
name=<?= 'key_enable_header' ?>
checked/>
<?
}
// データのダウンロード
// ボタン押下時に呼ばれる
function download(){
if ( !empty( $_POST['download'] ) ) {
nocache_headers();
// open file (Stream)
$stream = fopen('php://output', 'w');
// add CSV header
$enable_header = false ;
if( isset( $_POST[ 'key_enable_header' ] ) ) {
$enable_header = boolval( $_POST[ 'key_enable_header' ] );
}
if( $enable_header ) {
$header = [
'field-A'
,'field-B'
,'field-C'
];
fputcsv($stream,$header);
}
// ダウンロード設定
$filename = 'sample-'.date('YmdHis',current_time('timestamp')).'.csv';
header( "Content-type: text/plain" );
header( 'Content-Disposition: attachment; filename='.$filename.'' );
$dara_array = [
[ 'AA' , 'AB', 'AC' ]
,[ 'BA' , 'BB', 'BC' ]
,[ 'CA' , 'CB', 'CC' ]
] ;
$exit = false ;
foreach( $dara_array as $data ) {
fputcsv($stream,$data);
$exit = true ;
}
if( !$exit ) {
fputcsv($stream,array('Request Note not found'));
}
fclose($stream,) ;
exit;
}
}</code></pre></div>
<p class="wp-block-paragraph">管理メニューの画面作成に加えて、<span data-color="#abb8c3" style="background: linear-gradient(transparent 60%,rgba(171, 184, 195, 0.7) 0);" class="vk_highlighter">download</span>()でダウンロードボタンを押した際の処理を実装しています。</p>
<h2 class="wp-block-heading" id="vk-htags-dfa185c0-1ec9-46f4-8549-ea77c8f10809">管理メニューに画面を組み込む手順</h2>
<p class="wp-block-paragraph">WordPressの管理メニューに画面を組み込むには、Settings APIを使い手順に従って進める必要があります。</p>
<div class="wp-block-vk-blocks-border-box vk_borderBox vk_borderBox-background-transparent has-text-color has-luminous-vivid-orange-color is-style-vk_borderBox-style-solid-kado-tit-onborder"><div class="vk_borderBox_title_container"><i class=""></i><h4 class="vk_borderBox_title" id="vk-border-box-4f3a76e4-f781-4f7a-9885-45ad470b69e1">管理メニューにデータ取得画面を組み込む手順</h4></div><div class="vk_borderBox_body">
<ol style="list-style-type:upper-roman" class="wp-block-list is-style-vk-numbered-circle-mark">
<li>管理メニューに画面を追加する</li>
<li>管理メニューに設定セクションを追加する</li>
<li>設定フィールドを追加する</li>
<li>設定を登録する</li>
<li>セクションとフィールドを描画する</li>
<li>ダウンロード処理を実装する</li>
</ol>
</div></div>
<p class="wp-block-paragraph">組み込み手順のうち①〜⑤までは前回の記事と同様ですので、こちらをご覧ください。</p>
<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<div class="blog-card">
<div class="blog-card-body-outer">
<div class="blog-card-body">
<h5 class="blog-card-title">
<a href="https://wakatchi.dev/wordpress-admin-settings-api/">WordPressに値を設定する独自の管理メニューを追加する</a>
</h5>
<p class="blog-card-text">
こんにちわ、わかっち (@wakatchi_tech) です。 WordPressで開発したサイトを運営していると、サイト独自の設定を保存したり、運用しながら設定を変更したいことがありま… </p>
<div class="blog-card-site-title">
<a href="https://wakatchi.dev">
<img loading="lazy" src="https://wakatchi.dev/wp-content/uploads/2025/03/ww-logo2-100x100.webp" width="16" height="16" alt="" >
わかっちウォッチ </a>
</div>
</div>
</div>
<div class="blog-card-image-outer">
<a href="https://wakatchi.dev/wordpress-admin-settings-api/" class="blog-card-image-frame">
<img class="blog-card-image-src" src="https://wakatchi.dev/wp-content/uploads/2023/10/wordpress-admin-menu3-1024x683.jpg" alt="">
</a>
</div>
</div>
</div></figure>
<p class="wp-block-paragraph">この記事では、データのダウンロードに関する部分を中心に見ていきます。</p>
<h2 class="wp-block-heading" id="vk-htags-beaa713a-143f-4461-9f8f-62124633fb3f">管理メニューの画面を描画する</h2>
<p class="wp-block-paragraph"><strong><span data-color="#fcb900" style="background: linear-gradient(transparent 60%,rgba(252, 185, 0, 0.7) 0);" class="vk_highlighter">settings_fields</span></strong>()、<strong><span data-color="#fcb900" style="background: linear-gradient(transparent 60%,rgba(252, 185, 0, 0.7) 0);" class="vk_highlighter">do_settings_sections</span></strong>()、<strong><span data-color="#fcb900" style="background: linear-gradient(transparent 60%,rgba(252, 185, 0, 0.7) 0);" class="vk_highlighter">submit_button</span></strong>()で画面を描画します。</p>
<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code><?php
// トップメニュー画面を描画する
function render_menu_contents() {
?>
<div class = "wrap">
<h1>CSVダウンロードサンプル</h1>
<form method = "post" action = "" >
<?php
settings_fields( 'top_menu_group' );
do_settings_sections( 'top_menu' );
submit_button( 'ダウンロード' , 'primary','download',false );
?>
</form>
</div>
<?
}</code></pre></div>
<p class="wp-block-paragraph"></p>
<p class="wp-block-paragraph"><strong><span data-color="#fcb900" style="background: linear-gradient(transparent 60%,rgba(252, 185, 0, 0.7) 0);" class="vk_highlighter">submit_button</span></strong>()は、提供されたテキストと適切なクラスを含む送信ボタンを描画します。</p>
<p class="wp-block-paragraph">重要なのは、第三引数の<span data-color="#abb8c3" style="background: linear-gradient(transparent 60%,rgba(171, 184, 195, 0.7) 0);" class="vk_highlighter">download</span>です。ここで指定した文字列が、<a href="#download_function" data-type="internal" data-id="#download_function">後述する</a>サーバサイド側の関数名となります。</p>
<p class="wp-block-paragraph"></p>
<h2 class="wp-block-heading" id="vk-htags-c21ee71e-77c8-4189-94f9-d38ba163a340">ダウンロード処理を実装する</h2>
<p class="wp-block-paragraph"></p>
<h3 class="wp-block-heading" id="vk-htags-3c970e9f-bf9e-4a6e-8c9e-afc7d4910c32">ダウンロード関数の登録</h3>
<p class="wp-block-paragraph"><strong><span data-color="#fcb900" style="background: linear-gradient(transparent 60%,rgba(252, 185, 0, 0.7) 0);" class="vk_highlighter">add_action</span></strong>()を使って、アクションフック<strong><span data-color="#cf2e2e" style="background: linear-gradient(transparent 60%,rgba(207, 46, 46, 0.7) 0);" class="vk_highlighter">admin_init</span></strong>にダウンロードする関数を登録します。</p>
<p class="wp-block-paragraph"><strong><span data-color="#f78da7" style="background: linear-gradient(transparent 60%,rgba(247, 141, 167, 0.7) 0);" class="vk_highlighter">admin_init</span></strong>は、ユーザがWordPressの管理画面にアクセスされた際にフックされます。</p>
<p class="wp-block-paragraph">つまり、この処理によって<span data-color="#f78da7" style="background: linear-gradient(transparent 60%,rgba(247, 141, 167, 0.7) 0);" class="vk_highlighter">管理画面アクセス時には必ず当該関数が呼ばれるようになる</span>ため、そのアクセスが本当に必要かを関数内で処理する必要性が生じます。</p>
<h3 class="wp-block-heading" id="download_function">ダウンロード処理の実装</h3>
<p class="wp-block-paragraph">アクションフック<strong><span data-color="#f78da7" style="background: linear-gradient(transparent 60%,rgba(247, 141, 167, 0.7) 0);" class="vk_highlighter">admin_init</span></strong>に登録した関数を実装します。</p>
<p class="wp-block-paragraph">この関数は、ダウンロードボタンを押した際のサーバサイド側の実装になります。</p>
<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code><?php
// データのダウンロード
// ボタン押下時に呼ばれる
function download(){
if ( !empty( $_POST['download'] ) ) {
nocache_headers();
// open file (Stream)
$stream = fopen('php://output', 'w');
// add CSV header
$enable_header = false ;
if( isset( $_POST[ 'key_enable_header' ] ) ) {
$enable_header = boolval( $_POST[ 'key_enable_header' ] );
}
if( $enable_header ) {
$header = [
'field-A'
,'field-B'
,'field-C'
] ;
fputcsv($stream,$header);
}
// ダウンロード設定
$filename = 'sample-'.date('YmdHis',current_time('timestamp')).'.csv';
header( "Content-type: text/plain" );
header( 'Content-Disposition: attachment; filename='.$filename.'' );
$dara_array = [
[ 'AA' , 'AB', 'AC' ]
,[ 'BA' , 'BB', 'BC' ]
,[ 'CA' , 'CB', 'CC' ]
] ;
$exit = false ;
foreach( $dara_array as $data ) {
fputcsv($stream,$data);
$exit = true ;
}
if( !$exit ) {
fputcsv($stream,array('Request Note not found'));
}
fclose($stream) ;
exit;
}
}</code></pre></div>
<h4 class="wp-block-heading" id="vk-htags-f69c74e8-05b2-4903-bfa2-15d3168fbfbf">管理メニューからの呼び出しかを判定する</h4>
<p class="wp-block-paragraph"><strong><span data-color="#fcb900" style="background: linear-gradient(transparent 60%,rgba(252, 185, 0, 0.7) 0);" class="vk_highlighter">submit_button</span></strong>()の第三引数の<span data-color="#abb8c3" style="background: linear-gradient(transparent 60%,rgba(171, 184, 195, 0.7) 0);" class="vk_highlighter">download</span>と文字列を指定したことで、管理メニューでダウンロードした際には、POST時のパラメータとして<span data-color="#abb8c3" style="background: linear-gradient(transparent 60%,rgba(171, 184, 195, 0.7) 0);" class="vk_highlighter">download</span>が渡ってくるようになります。</p>
<p class="wp-block-paragraph">そこで、管理画面アクセス時に必ず呼ばれるこの関数の冒頭で、今回作成した管理メニューからの呼び出しかどうかを判定します。</p>
<h4 class="wp-block-heading" id="vk-htags-6d67439a-01e9-4d12-b496-9bd5d0a07796">出力ストリームにCSVデータを書き込む</h4>
<p class="wp-block-paragraph">今回のサンプルでは、<strong><span data-color="#fcb900" style="background: linear-gradient(transparent 60%,rgba(252, 185, 0, 0.7) 0);" class="vk_highlighter">fopen</span></strong>で出力ストリームを開き、<span data-color="#fcb900" style="background: linear-gradient(transparent 60%,rgba(252, 185, 0, 0.7) 0);" class="vk_highlighter"><strong>fputcsv</strong></span>でそのストリームにデータをArray形式で書き込んでいます。</p>
<p class="wp-block-paragraph">PHPでのCSV書き込みは多くの方法があるので、いろいろ参考にしてみてください。</p>
<p class="wp-block-paragraph">CSVのファイル名はタイムスタンプから動的に生成し、そのファイル名をアタッチメントファイルとしてHTTPヘッダーに書き込んでいます。</p>
<h2 class="wp-block-heading" id="vk-htags-2f921e05-7393-4724-9eb1-b62bfd4024e2">まとめ</h2>
<p class="wp-block-paragraph">今回は、WordPressの管理メニューにデータ取得画面を作成する方法をご紹介しました。</p>
<p class="wp-block-paragraph">管理メニューの画面でPOSTして、それをもとにデータを取得するのはややクセがあるものの、アクションフック<strong><span data-color="#f78da7" style="background: linear-gradient(transparent 60%,rgba(247, 141, 167, 0.7) 0);" class="vk_highlighter">admin_init</span></strong>の作法を覚えてしまえば、それほど難しくはないかなと思います。</p>
<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://wakatchi.dev/wp-content/uploads/2022/07/wakatchi_icon_2.jpg" alt=""/><figcaption class="vk_balloon_icon_name">わかっち</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content has-background-color has-luminous-vivid-amber-background-color vk_balloon_content_fullwidth"><span class="vk_balloon_content_before has-text-color has-luminous-vivid-amber-color"></span><span class="vk_balloon_content_after "></span>
<p class="wp-block-paragraph">管理メニュー用のサーバサイドのエンドポイントは、アクションフック<strong><span data-color="#f78da7" style="background: linear-gradient(transparent 60%,rgba(247, 141, 167, 0.7) 0);" class="vk_highlighter">admin_init</span></strong>(で登録すると覚えてしまおう</p>
</div></div></div>
<p class="wp-block-paragraph"><span style="font-size: 12pt;">本記事が少しでもお役に立てれば幸いです。</span></p>
<p class="wp-block-paragraph"><span style="font-size: 12pt;">最後までお読みいただき、ありがとうございました!</span></p>
こんにちわ、わかっち (@wakatchi_tech) です。
WordPressで開発したサイトを運営していると、サイト独自の設定を保存したり、運用しながら設定を変更、サイト内のデータを取得したいことがあります。
過去3回の記事では、管理メニューや設定画面の追加方法をご紹介しました。
サイト独自の設定は、WordPressの管理メニューを独自に開発することをお勧めします。サイトの設定値(パラメーター)は、プラグインエディタなどを使いfunction.phpなどの…
こんにちわ、サイト管理者のわかっち (@wakatchi_tech) です。 WordPressで開発したサイトを運営していると、サイト独自の設定を保存したり、運用しながら設定を変更した…
こんにちわ、わかっち (@wakatchi_tech) です。 WordPressで開発したサイトを運営していると、サイト独自の設定を保存したり、運用しながら設定を変更したいことがありま…
今回の記事は、管理メニューの画面から、サイト内のデータを取得(ダウンロード)する方法をご紹介します。
この記事は次のような方にお勧めです
- WordPressのサイト開発者で、サイト全体に関するデータをWordPressの管理メニューから取得したい人
- WordPressのテーマやプラグインの開発者
この記事でご紹介するのは、管理メニューの画面でダウンロードボタンを押すと、CSVデータをダウンロードするというサンプルです。
「ヘッダーの有無」のチェックボックスで、CSVデータの1行目にヘッダーを出力するかを選択できます。
ダウンロードすると、次のCSVデータを取得できます。
データを3行分だけ出力し、ヘッダーにカラム名を出力しています。
field-A,field-B,field-C
AA,AB,AC
BA,BB,BC
CA,CB,CC
上記の画面は、下記のソースコードでWordPressに組み込むことが可能です
function.phpやCode Snippetsプラグインなどを使ってそのままコピペしてみてください。
<?php
add_action(
'admin_menu',
function(){
// トップメニューを追加
add_menu_page(
'管理メニュータイトル'
, 'テスト用トップメニュー'
, 'manage_options'
, 'top_menu'
, 'render_menu_contents'
,'dashicons-networking'
,0
);
// セクションを追加
add_settings_section(
'top_menu_section'
,''
,function(){}
,'top_menu'
);
// フィールドを追加
add_settings_field(
'key_enable_header'
,'ヘッダーの有無'
,'render_enable_header_field'
,'top_menu'
,"top_menu_section"
,array( 'label_for' => 'key_enable_header' )
);
// グループにフィールドを登録
register_setting(
"top_menu_group"
,'key_enable_header'
);
}
);
// ダウンロード用の関数を登録
add_action(
'admin_init'
,'download'
);
// トップメニュー画面を描画する
function render_menu_contents() {
?>
<div class = "wrap">
<h1>CSVダウンロードサンプル</h1>
<form method = "post" action = "" >
<?php
settings_fields( 'top_menu_group' );
do_settings_sections( 'top_menu' );
submit_button( 'ダウンロード' , 'primary','download',false );
?>
</form>
</div>
<?
}
// フィールドを描画する
function render_enable_header_field( $args ){
?>
<input
type="checkbox"
id=<?= 'key_enable_header' ?>
name=<?= 'key_enable_header' ?>
checked/>
<?
}
// データのダウンロード
// ボタン押下時に呼ばれる
function download(){
if ( !empty( $_POST['download'] ) ) {
nocache_headers();
// open file (Stream)
$stream = fopen('php://output', 'w');
// add CSV header
$enable_header = false ;
if( isset( $_POST[ 'key_enable_header' ] ) ) {
$enable_header = boolval( $_POST[ 'key_enable_header' ] );
}
if( $enable_header ) {
$header = [
'field-A'
,'field-B'
,'field-C'
];
fputcsv($stream,$header);
}
// ダウンロード設定
$filename = 'sample-'.date('YmdHis',current_time('timestamp')).'.csv';
header( "Content-type: text/plain" );
header( 'Content-Disposition: attachment; filename='.$filename.'' );
$dara_array = [
[ 'AA' , 'AB', 'AC' ]
,[ 'BA' , 'BB', 'BC' ]
,[ 'CA' , 'CB', 'CC' ]
] ;
$exit = false ;
foreach( $dara_array as $data ) {
fputcsv($stream,$data);
$exit = true ;
}
if( !$exit ) {
fputcsv($stream,array('Request Note not found'));
}
fclose($stream,) ;
exit;
}
}
管理メニューの画面作成に加えて、download()でダウンロードボタンを押した際の処理を実装しています。
WordPressの管理メニューに画面を組み込むには、Settings APIを使い手順に従って進める必要があります。
管理メニューにデータ取得画面を組み込む手順
- 管理メニューに画面を追加する
- 管理メニューに設定セクションを追加する
- 設定フィールドを追加する
- 設定を登録する
- セクションとフィールドを描画する
- ダウンロード処理を実装する
組み込み手順のうち①〜⑤までは前回の記事と同様ですので、こちらをご覧ください。
こんにちわ、わかっち (@wakatchi_tech) です。 WordPressで開発したサイトを運営していると、サイト独自の設定を保存したり、運用しながら設定を変更したいことがありま…
この記事では、データのダウンロードに関する部分を中心に見ていきます。
settings_fields()、do_settings_sections()、submit_button()で画面を描画します。
<?php
// トップメニュー画面を描画する
function render_menu_contents() {
?>
<div class = "wrap">
<h1>CSVダウンロードサンプル</h1>
<form method = "post" action = "" >
<?php
settings_fields( 'top_menu_group' );
do_settings_sections( 'top_menu' );
submit_button( 'ダウンロード' , 'primary','download',false );
?>
</form>
</div>
<?
}
submit_button()は、提供されたテキストと適切なクラスを含む送信ボタンを描画します。
重要なのは、第三引数のdownloadです。ここで指定した文字列が、後述するサーバサイド側の関数名となります。
add_action()を使って、アクションフックadmin_initにダウンロードする関数を登録します。
admin_initは、ユーザがWordPressの管理画面にアクセスされた際にフックされます。
つまり、この処理によって管理画面アクセス時には必ず当該関数が呼ばれるようになるため、そのアクセスが本当に必要かを関数内で処理する必要性が生じます。
ダウンロード処理の実装
アクションフックadmin_initに登録した関数を実装します。
この関数は、ダウンロードボタンを押した際のサーバサイド側の実装になります。
<?php
// データのダウンロード
// ボタン押下時に呼ばれる
function download(){
if ( !empty( $_POST['download'] ) ) {
nocache_headers();
// open file (Stream)
$stream = fopen('php://output', 'w');
// add CSV header
$enable_header = false ;
if( isset( $_POST[ 'key_enable_header' ] ) ) {
$enable_header = boolval( $_POST[ 'key_enable_header' ] );
}
if( $enable_header ) {
$header = [
'field-A'
,'field-B'
,'field-C'
] ;
fputcsv($stream,$header);
}
// ダウンロード設定
$filename = 'sample-'.date('YmdHis',current_time('timestamp')).'.csv';
header( "Content-type: text/plain" );
header( 'Content-Disposition: attachment; filename='.$filename.'' );
$dara_array = [
[ 'AA' , 'AB', 'AC' ]
,[ 'BA' , 'BB', 'BC' ]
,[ 'CA' , 'CB', 'CC' ]
] ;
$exit = false ;
foreach( $dara_array as $data ) {
fputcsv($stream,$data);
$exit = true ;
}
if( !$exit ) {
fputcsv($stream,array('Request Note not found'));
}
fclose($stream) ;
exit;
}
}
submit_button()の第三引数のdownloadと文字列を指定したことで、管理メニューでダウンロードした際には、POST時のパラメータとしてdownloadが渡ってくるようになります。
そこで、管理画面アクセス時に必ず呼ばれるこの関数の冒頭で、今回作成した管理メニューからの呼び出しかどうかを判定します。
今回のサンプルでは、fopenで出力ストリームを開き、fputcsvでそのストリームにデータをArray形式で書き込んでいます。
PHPでのCSV書き込みは多くの方法があるので、いろいろ参考にしてみてください。
CSVのファイル名はタイムスタンプから動的に生成し、そのファイル名をアタッチメントファイルとしてHTTPヘッダーに書き込んでいます。
今回は、WordPressの管理メニューにデータ取得画面を作成する方法をご紹介しました。
管理メニューの画面でPOSTして、それをもとにデータを取得するのはややクセがあるものの、アクションフックadmin_initの作法を覚えてしまえば、それほど難しくはないかなと思います。
わかっち
管理メニュー用のサーバサイドのエンドポイントは、アクションフックadmin_init(で登録すると覚えてしまおう
本記事が少しでもお役に立てれば幸いです。
最後までお読みいただき、ありがとうございました!