LoginSignup
10
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-03-14

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

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10