Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@RikutoYamaguchi

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
10
Help us understand the problem. What are the problem?