WordPress

wordpress4.4から追加されたwp_termmetaを使って、カテゴリーにフィールドを足してみる

More than 3 years have passed since last update.

wordpressにwp_termmetaなるテーブルが存在することに気づいたで使ってみました。


カテゴリーの編集にフィールドを追加する

ひとまずinput[type="text"]を2つほど。

functions.php

add_action ( 'edit_category_form_fields', 'add_meta_fields');

function add_meta_fields( $tag ) {
// 引数からterm_id取得
$t_id = $tag->term_id;
// 値があればvalueに入れるのでtermmetaを取得
$cat_meta = get_term_meta($t_id);
?>
<tr class="form-field">
<th><label for="add_meta_text">追加メタ - テキスト</label></th>
<td>
// 後でわかりましたが、値が配列に入っているので[0]を指定してあげます。
<input type="text" name="cat_meta_array[add_meta_text]" id="add_meta_text" size="25" value="<?php if(isset ( $cat_meta['add_meta_text'][0])) echo esc_html($cat_meta['add_meta_text'][0]) ?>" />
</td>
</tr>
<tr class="form-field">
<th><label for="add_meta_foo">追加メタ - Foo</label></th>
<td>
<input type="text" name="cat_meta_array[add_meta_foo]" id="add_meta_foo" size="25" value="<?php if(isset ( $cat_meta['add_meta_foo'][0])) echo esc_html($cat_meta['add_meta_foo'][0]) ?>" />
</td>
</tr>
<?php
}


wp_termmetaへ保存する

先ほど作ったフィールドからの値を受け取って保存します。

functions.php

add_action ( 'edited_term', 'save_add_meta_fields');

function save_add_meta_fields( $term_id ) {
if ( isset( $_POST['cat_meta_array'] ) ) {
$t_id = $term_id;
$cat_keys = array_keys($_POST['cat_meta_array']);
foreach ($cat_keys as $key){
// 保存する
update_term_meta($t_id, $key, $_POST['cat_meta_array'][$key]);
}
}
}

get_term_meta($t_id);を出力してみると下記みたいになります。

valueもarrayになってますね。

array (size=2)

'add_meta_text' =>
array (size=1)
0 => string 'bar' (length=3)
'add_meta_foo' =>
array (size=1)
0 => string 'baz' (length=3)

テーブルはこんな感じ

meta_id
term_id
meta_key
meta_value

1
1
add_meta_key
bar

2
1
add_meta_foo
baz


テンプレート側で使ってみる

例えばsingle.phpで使うと

while ( have_posts() ) : the_post();

// 2つ以上カテゴリーつけるならforeachしてください
$cat = get_the_category()[0];
$t_id = $cat->term_id;
// 第二引数でmeta_keyを指定できます。
$add_meta = get_term_meta( $t_id,'add_meta_text');

// やっぱり配列なので[0]を
echo esc_html($add_meta[0]);




endwhile;


まとめ

postmetaはあるのに、なんでtermにはないのよってずっと思ってました。

あとはget_term_meta()がもう少し融通聞いてくれると嬉しいですね。

get_term_meta('','add_meta_text')とかでmeta_key指定の取得できるかなと思ったんですが、できませんでした。

今とのころ自分で実装するしかないのかな?誰か使い方間違えていたらご指摘ください。

それでも、今までwp_optionsに無理やり突っ込んでいたのよりは明らかにスマートですね。