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に無理やり突っ込んでいたのよりは明らかにスマートですね。