Help us understand the problem. What is going on with this article?

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

ozvision
購買プラットフォーム「ハピタス」を開発・運営するベンチャー企業
https://www.oz-vision.co.jp/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした