SlideShare a Scribd company logo
1 of 55
これから使おう!
Term Metadataの使い方
小川 果純
自己紹介
• 小川 果純(おがわ かすみ)
• WordPressエンジニア
↓
セールスエンジニア
↓
Webディレクター兼Webエンジニア ←いまここ
• カピバラとポテチとピザが好き
• Facebook: kasumi.ogawa.399
• https://minkapi.style/
今日お話しすること
今日お話しすること
 Term Metadataとは
 利用するメリット
 実装方法
• 管理画面の実装方法
• フロント画面の実装方法
 少しだけ4.6のregister_meta()のお話し
Term Metadataとは
Term Metadataとは
• WordPress4.4で実装された、投稿のメタ情報のカテゴリー版。
• termmetaというテーブルが追加。
• termmeta用の関数ももちろん追加。
『投稿のメタ情報のカテゴリー版』ということは、
投稿みたいに、こういうチェックボックスがあって…
こういうフィールドが出てくるはず!!
カスタムフィールドがない!?
Term Metadataとは
投稿のカスタムフィールドのように、
管理画面上でメタ情報の追加が行えない。
Term Metadataとは
投稿のカスタムフィールドのように、
管理画面上でメタ情報の追加が行えない。
↓
Term Metadataとは
投稿のカスタムフィールドのように、
管理画面上でメタ情報の追加が行えない。
↓
入力フィールドの用意や保存のプログラムなど、
1から実装する必要がある。
面倒!!!!
面倒!!!!
=誰も使ってくれない…
しかも
カテゴリーにカスタムフィールド
追加できるプラグインもたくさん!
それでもせっかくの新機能。
使ってもらいたいので、
利用するメリット
利用するメリット
とあるプラグインを例に挙げると、
カテゴリーにカスタムフィールドを追加した際にデータが保存され
るのは、termmetaテーブルではなくoptionsテーブル。
option_name
→[タクソノミー名]_[term_id]_[管理画面で指定するフィールドの名前]
利用するメリット
Term Metadata実装前にこういった機能を実現していたプラグイ
ンは以下の対応がほとんど。
• optionsテーブルに独自のoption_nameをつけて保存
• 独自テーブルを追加し、そこに保存
利用するメリット
• optionsテーブルに独自のoption_nameをつけて保存
×optionsテーブルが肥大化してしまう
×データの保存の仕方がプラグインの実装に依存してしまう
→他のプラグインに変えることが難しくなる
×配列で保存された場合に、
like検索でデータ取得しなくてはならなくなる
×optionsテーブルの本来の使い方ではない
利用するメリット
• optionsテーブルに独自のoption_nameをつけて保存
×optionsテーブルが肥大化してしまう
×データの保存の仕方がプラグインの実装に依存してしまう
→他のプラグインに変えることが難しくなる
×配列で保存された場合に、
like検索でデータ取得しなくてはならなくなる
×optionsテーブルの本来の使い方ではない
Term Metadataなら
問題なし!!
利用するメリット
• 独自テーブルを追加し、そこに保存
×データの保存の仕方がプラグインの実装に依存してしまう
→他のプラグインに変えることが難しくなる
×Term Metadata実装により、termmetaテーブルと独自
テーブルの名前が被ってしまい、「そのプラグイン使ってたら
WordPressアップデートできない問題」が多発
利用するメリット
• 独自テーブルを追加し、そこに保存
×データの保存の仕方がプラグインの実装に依存してしまう
→他のプラグインに変えることが難しくなる
×Term Metadata実装により、termmetaテーブルと独自
テーブルの名前が被ってしまい、「そのプラグイン使ってたら
WordPressアップデートできない問題」が多発
Term Metadataなら
問題なし!!
でも、実装方法がわからない…
実装方法
管理画面の実装方法
管理画面の実装方法
1. 必要なメタ情報とメタキー名などを決める
2. カテゴリー新規追加画面に入力フィールド
3. カテゴリー編集画面に入力フィールド
4. 保存と削除のプログラム
5. ポイント
1. 必要なメタ情報とメタキー名などを決める
2. おすすめマークの表示・非表示
メタキー:osusume_flag
1. カテゴリーのよみがな
メタキー:term_kana
1. 必要なメタ情報とメタキー名などを決める
$meta_array = array(
'term_kana' => array(
'name' => 'よみがな',
'note' => 'よみがなを入力してください',
),
'osusume_flag' => array(
'name' => 'おすすめマーク',
'note' => 'おすすめマークを表示する際は表示にチェックを入れてください‘,
),
);
新規追加画面と編集画面、
それぞれにフィールドを実装する必
要があるので、フィールド名と注釈は
連想配列で管理する。
1. 必要なメタ情報とメタキー名などを決める
function return_meta_array() {
$meta_array = array(
'term_kana' => array(
'name' => 'よみがな',
'note' => 'よみがなを入力してください',
),
'osusume_flag' => array(
'name' => 'おすすめマーク',
'note' => 'おすすめマークを表示する際は表示にチェックを入れてください‘,
),
);
return $meta_array;
}
その配列を返す関数にしておく。
2. カテゴリー新規追加画面に入力フィールド
function add_termmeta_form() {
$meta_array = return_meta_array();
array_map( "esc_html", $meta_array );
$html = <<<EOM
//よみがなのHTML
//おすすめマークのHTML
EOM;
echo $html;
}
メタ情報配列を取得して、array_map()
を使用して各要素にesc_html()の処
理を行い、エスケープする。
2. カテゴリー新規追加画面に入力フィールド
function add_termmeta_form() {
$meta_array = return_meta_array();
array_map( "esc_html", $meta_array );
$html = <<<EOM
//よみがなのHTML
//おすすめマークのHTML
EOM;
echo $html;
}
add_action( 'category_add_form_fields', 'add_termmeta_form' );
category_add_form_fieldsにフックし、
カテゴリー新規追加画面に入力
フィールドを追加する。
2. カテゴリー新規追加画面に入力フィールド
//よみがなのHTML
<div class="form-field term_kana-wrap">
<label for="term_kana">{$meta_array['term_kana']['name']}</label>
<input name="term_kana" id="term_kana" type="text" value="" size="40">
<p>{$meta_array['term_kana']['note']}</p>
</div>
カテゴリー新規追加画面はそれぞれ
の入力フィールドをdivで分ける。
2. カテゴリー新規追加画面に入力フィールド
//おすすめマークのHTML
<div class="form-field osusume_flag-wrap">
<label for="osusume_flag">{$meta_array['osusume_flag']['name']}</label>
<ul>
<li><label><input type="radio" name="osusume_flag" value="0"
checked>非表示</label></li>
<li><label><input type="radio" name="osusume_flag" value="1">表示
</label></li>
</ul>
<p>{$meta_array['osusume_flag']['note']}</p>
</div>
2. カテゴリー新規追加画面に入力フィールド
一番下に追加される
2. カテゴリー編集画面に入力フィールド
function edit_termmeta_form( $tag, $taxonomy ) {
$meta_array = return_meta_array();
array_map( "esc_html", $meta_array );
//現在保存されている値の取得
$html = <<<EOM
//よみがなのHTML
//おすすめマークのHTML
EOM;
echo $html;
}
編集画面では、現在編集を行ってい
るタームとタクソノミーの情報が引数
として受け取れる。
2. カテゴリー編集画面に入力フィールド
function edit_termmeta_form( $tag, $taxonomy ) {
$meta_array = return_meta_array();
array_map( "esc_html", $meta_array );
//現在保存されている値の取得
$html = <<<EOM
//よみがなのHTML
//おすすめマークのHTML
EOM;
echo $html;
}
add_action( 'category_edit_form_fields', 'edit_termmeta_form', 10, 2 );
category_edit_form_fieldsにフックし、
カテゴリー編集画面に入力フィールド
を追加する。
2. カテゴリー編集画面に入力フィールド
//現在保存されている値の取得
$term_kana_value = '';
$osusume_flag_value = '';
$term_kana_value = esc_attr( get_term_meta( $tag->term_id, 'term_kana', true ) );
$osusume_flag_value = esc_attr( get_term_meta( $tag->term_id, 'osusume_flag',
true ) );
if ( $osusume_flag_value == 1 ) {
$osusume_flag_1 = ' checked';
$osusume_flag_0 = '';
} elseif ( $osusume_flag_value == 0 ) {
$osusume_flag_1 = '';
$osusume_flag_0 = ' checked';
}
get_term_meta()で現在保存されてい
る値を取得する。
2. カテゴリー編集画面に入力フィールド
//よみがなのHTML
<tr class="form-field term_kana-wrap">
<th scope="row"><label
for="term_kana">{$meta_array['term_kana']['name']}</label></th>
<td>
<input name="term_kana" id="term_kana" type="text"
value="{$term_kana_value}" size="40">
<p class="description">{$meta_array['term_kana']['note']}</p>
</td>
</tr>
カテゴリー編集画面はそれぞれの入
力フィールドをtable要素で分ける。
2. カテゴリー編集画面に入力フィールド
//おすすめマークのHTML
<tr class="form-field osusume_flag-wrap">
<th scope="row">{$meta_array['osusume_flag']['name']}</th>
<td>
<ul>
<li><label><input type="radio" name="osusume_flag"
value="0"{$osusume_flag_0}>非表示</label></li>
<li><label><input type="radio" name="osusume_flag"
value="1"{$osusume_flag_1}>表示</label></li>
</ul>
<p class="description">{$meta_array['osusume_flag']['note']}</p>
</td>
</tr>
3. カテゴリー編集画面に入力フィールド
一番下に追加される
4. 保存と削除のプログラム
function update_term_meta_array( $term_id ) {
$meta_array = return_meta_array();
foreach ( $meta_array as $meta_key => $value ) {
if ( ! isset( $_POST[$meta_key] ) || ! stripslashes_deep( $_POST[$meta_key] ) ) {
delete_term_meta( $term_id, $meta_key, get_term_meta( $term_id, $meta_key,
true ) );
} elseif ( ! get_term_meta( $term_id, $meta_key ) ) {
add_term_meta( $term_id, $meta_key, stripslashes_deep( $_POST[$meta_key] ),
true );
} elseif ( stripslashes_deep( $_POST[$meta_key] ) != get_term_meta( $term_id,
$meta_key, true ) ) {
update_term_meta( $term_id, $meta_key, stripslashes_deep( $_POST[$meta_key] ) );
}
}
}
add_action( 'created_category', 'update_term_meta_array' );
add_action( 'edited_category', 'update_term_meta_array' );
フィールドの配列をループで回し
て一気に処理する。
5. ポイント
1. nonceの実装は不要!
→デフォルトのカテゴリー新規追加画面や編集画面に実装されている
nonceと、同一のformタグに囲まれているため。
2. サニタイズ処理は不要!
→それぞれの関数の中で、サニタイズやアンサニタイズ処理が行われ
ている。
→sanitize_meta()にあるフィルターにフックしよう!
3. 適宜入力内容のチェックなどを実装しよう!
フロント画面の実装方法
<?php $categories = get_categories(); ?>
<ul>
<?php foreach ( $categories as $category ) :
$cat_name = esc_html( $category->name );
$cat_link = esc_url( get_category_link( $category->term_id ) );
$cat_kana = esc_html( get_term_meta( $category->term_id, 'term_kana', true ) );
$cat_flg = get_term_meta( $category->term_id, 'osusume_flag', true );
if ( $cat_flg == 1 ) {
$cat_class = ' class="osusume"';
} else {
$cat_class = '';
}
$html = '<li' . $cat_class . '><a href="' . $cat_link . '">';
$html .= '<ruby>'. $cat_name . '<rt>' . $cat_kana . '</rt></ruby>';
$html .= '</a></li>';
echo $html;
endforeach; ?>
</ul>
フロント画面の実装方法
get_term_meta()で必要なものを取
得して整形
フロント画面の実装方法
それでも確かに使いづらいところ…
管理画面のカスタムフィールドは欲しいですね。
少しだけ…
4.6のregister_meta()のお話し
• WordPress4.6以前にもあったが、4.6で項目が追加された。
メタ情報を定義する関数。
• 他にもget_registered_metadata()などが追加。
• get_registered_metadata()などは、register_meta()で定義していないと使
えないようになっている。
register_meta()
ご清聴ありがとうございました

More Related Content

Similar to これから使おう!Term metadataの使い方 in WordBench Saitama

第3回 Magento Cafe Plus モジュール開発入門
第3回 Magento Cafe Plus モジュール開発入門第3回 Magento Cafe Plus モジュール開発入門
第3回 Magento Cafe Plus モジュール開発入門Hirokazu Nishi
 
Movable TypeのWebアプリケーションフレームワークの基本
Movable TypeのWebアプリケーションフレームワークの基本Movable TypeのWebアプリケーションフレームワークの基本
Movable TypeのWebアプリケーションフレームワークの基本Hajime Fujimoto
 
コードビュー中心で開発するDreamweaverテンプレート
コードビュー中心で開発するDreamweaverテンプレートコードビュー中心で開発するDreamweaverテンプレート
コードビュー中心で開発するDreamweaverテンプレートAkira Maruyama
 
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用stomita
 
a-sap06「カスタムフィールドを使いこなす」
a-sap06「カスタムフィールドを使いこなす」a-sap06「カスタムフィールドを使いこなす」
a-sap06「カスタムフィールドを使いこなす」Seiko Kuchida
 
第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門
第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門
第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門Hirokazu Nishi
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発Mitsuru Katoh
 
WordBech Osaka No.28
WordBech Osaka No.28WordBech Osaka No.28
WordBech Osaka No.28Kite Koga
 
カラーミーショップ「カスタマイズスクール第1期vol.1」
カラーミーショップ「カスタマイズスクール第1期vol.1」カラーミーショップ「カスタマイズスクール第1期vol.1」
カラーミーショップ「カスタマイズスクール第1期vol.1」ec-campus
 
WordPressのテンプレートタグを理解する
WordPressのテンプレートタグを理解するWordPressのテンプレートタグを理解する
WordPressのテンプレートタグを理解するYoshinori Kobayashi
 
【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へDevelopers Summit
 
2006 03 18_osc2006_x_cube_template
2006 03 18_osc2006_x_cube_template2006 03 18_osc2006_x_cube_template
2006 03 18_osc2006_x_cube_templateTom Hayakawa
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べMasahiro Nagano
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 

Similar to これから使おう!Term metadataの使い方 in WordBench Saitama (20)

第3回 Magento Cafe Plus モジュール開発入門
第3回 Magento Cafe Plus モジュール開発入門第3回 Magento Cafe Plus モジュール開発入門
第3回 Magento Cafe Plus モジュール開発入門
 
Movable TypeのWebアプリケーションフレームワークの基本
Movable TypeのWebアプリケーションフレームワークの基本Movable TypeのWebアプリケーションフレームワークの基本
Movable TypeのWebアプリケーションフレームワークの基本
 
コードビュー中心で開発するDreamweaverテンプレート
コードビュー中心で開発するDreamweaverテンプレートコードビュー中心で開発するDreamweaverテンプレート
コードビュー中心で開発するDreamweaverテンプレート
 
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用
 
a-sap06「カスタムフィールドを使いこなす」
a-sap06「カスタムフィールドを使いこなす」a-sap06「カスタムフィールドを使いこなす」
a-sap06「カスタムフィールドを使いこなす」
 
第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門
第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門
第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
 
Apache Tapestry
Apache TapestryApache Tapestry
Apache Tapestry
 
WordBech Osaka No.28
WordBech Osaka No.28WordBech Osaka No.28
WordBech Osaka No.28
 
カラーミーショップ「カスタマイズスクール第1期vol.1」
カラーミーショップ「カスタマイズスクール第1期vol.1」カラーミーショップ「カスタマイズスクール第1期vol.1」
カラーミーショップ「カスタマイズスクール第1期vol.1」
 
WordPressのテンプレートタグを理解する
WordPressのテンプレートタグを理解するWordPressのテンプレートタグを理解する
WordPressのテンプレートタグを理解する
 
【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ
 
2006 03 18_osc2006_x_cube_template
2006 03 18_osc2006_x_cube_template2006 03 18_osc2006_x_cube_template
2006 03 18_osc2006_x_cube_template
 
Wp html5
Wp html5Wp html5
Wp html5
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
CS-CART addon
CS-CART addonCS-CART addon
CS-CART addon
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べ
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 

これから使おう!Term metadataの使い方 in WordBench Saitama