さくらのレンタルサーバ15周年!ロゴデザインコンテスト
さくらのレンタルサーバ15周年!ロゴデザインコンテスト
2016.11.18
#14
バックエンドへの道

好きなデータが組み合わせられるカスタムフィールドをサポートするWordPress Term metaとは

エリカ

こんにちは、ディレクターのエリカです。

WordPress4.4 からは、Term meta という機能が使えるようになっているのはご存知ですか? これはタクソノミーにおいて、投稿タイプの「カスタムフィールド」のように利用できる便利な機能です。カテゴリーなどのタクソノミーに対するこのような機能をカスタマイズして欲しいという要望って、意外と多かったりします。

今回は、このWordPress Term metaについてお話します。はじめに「カスタムフィールド」の概要を、最後に実際の使用例を紹介します。

 

はじめに

まずは、投稿タイプの「カスタムフィールド」を振り返ります。

投稿タイプのデータは、wp_posts というテーブルに保存されます。 この wp_posts というテーブルにはタイトルや本文、公開日などのあらかじめ定められた基本的なデータしか保存できません。

それに対して「カスタムフィールド」は、wp_postmeta というテーブルに保存され 、好きなデータの組み合わせで保存できます。たとえば、ラーメンについてのブログ記事を書くときには、お店の名前やURLなどを記事へ追記するように使うことができるわけです。

一方、カテゴリーやタグといったタクソノミーにはこの機能がありませんでした。プラグインなどでは専用のテーブルを作成したり、WordPress の設定情報を格納するテーブルを利用して同様の機能を実現してくれるものもありましたが、WordPress4.4 以降では基本的な機能としてサポートされるようになりました。

それが「Term meta」とされる機能です。

「Term meta」 とは?

wp_image2

WordPress4.4 では wp_termmeta というテーブルが用意され、ちょうど wp_posts と wp_postmeta の関係のように、タクソノミーでも「カスタムフィールド」のような機能を利用できるようにしたものです。

しかし、「カスタムフィールド」には GUI が用意されていますが「Term meta」にはまだありませんので、コードを書く必要があります。

使い方

カテゴリーに合わせてカラーなどのスタイルが変化するサイトを例に、カテゴリーにカラーの情報を追加で保存できるようにします。

カテゴリー作成画面にカラーの項目を追加する

termmeta_color」という入力項目を、カテゴリーの作成画面に表示させます。

add_action( "category_add_form_fields", 'add_termmeta_color', 10, 2 ); // 1
function add_termmeta_color($taxonomy) {
echo '<div class="form-field">';
echo '<label for="termmeta_color">カラー</label>';
echo '<input type="text" class="postform" id="termmeta_color" name="termmeta_color">';
echo '</div>';
}
add_action( "created_category", 'save_termemeta_color', 10, 2 ); // 2
function save_meta( $term_id, $tt_id ){
    if( isset( $_POST['termmeta_color'] ) && '' !== $_POST['termmeta_color'] ){
        $meta_value = esc_html($_POST['termmeta_color']);
        add_term_meta( $term_id, 'termmeta_color', $meta_value, true );
    }
}
  1. category_add_form_fields というフックで新たな登録フォームを追加しています。
  2. created_category というフックで送信されてきたデータを保存します。

カテゴリー編集画面にカラーの項目を追加する

termmeta_color」という入力項目を、カテゴリーの編集画面に表示させます。

add_action( "category_edit_form_fields", 'edit_termmeta_color', 10, 2 ); // 1
function edit_termmeta_color( $term, $taxonomy ){
echo '<tr class="form-field term-group-wrap">';
echo '<th scope="row"><label for="termmeta_color">カラー</label></th>';
echo '<td>';
echo '<input type="text" class="postform" id="termmeta_color" name="termmeta_color" value="' . esc_attr( get_term_meta( $term->term_id, 'termmeta_color', true ) ); . '">';
echo '</td>';
echo '</tr>';
}
add_action( "edited_category", 'update_termmeta_color', 10, 2 ); // 2
function update_termmeta_color( $term_id, $tt_id ){
    if( isset( $_POST['termmeta_color'] ) && '' !== $_POST['termmeta_color'] ){
        $meta_value = esc_html($_POST['termmeta_color']);
        update_term_meta( $term_id, 'termmeta_color', $meta_value );
    }
}
  1. category_edit_form_fields というフックで新たなフォームを追加しています。また現在設定されているデータを初期値として表示しています。
  2. created_category というフックで送信されてきたデータを保存します。

カテゴリー一覧画面にカラー項目を表示する

add_filter( "manage_edit-category_columns", 'add_column_head_termmeta_color' );
function add_column_head_termmeta_color( $columns ){
   $columns['termmeta_color'] = 'カラー';
   return $columns;
}
add_filter( "manage_category_custom_column", 'add_column_content_termmeta_color', 10, 3 );
function add_column_content_termmeta_color( $content, $column_name, $term_id ){
   if( $column_name !== 'termmeta_color' ){
      return $content;
   }

   $term_id = absint( $term_id );
   $meta_value = get_term_meta( $term_id, 'termmeta_color', true );

   if( !empty( $meta_value ) ){
      $content .= esc_attr( $meta_value );
   }

   return $content;
}
  1. manage_edit-category_columns でカテゴリー一覧画面の項目見出しを表示します。
  2. manage_category_custom_column でカテゴリー一覧画面で設定されたデータを表示します。

カテゴリ一覧画面でカラーを取得する

実際にカテゴリー一覧画面で入力されているデータを表示します。

$term_id = get_queried_object_id();
$color = get_term_meta( $term_id, 'termmeta_color', true);
echo $color;

これで完了です。
 

終わりに

「Term meta」に登録したデータは、表示だけでなく取得時の絞り込みに利用することもできます。また、今回はカテゴリーに対して設定をしていますが、コード内の「category」部分は任意のタクソノミーに置き換えることができます。

このようにバージョンアップには便利な新しい機能が含まれている場合がありますし、逆に非推奨となる機能などもあります。

今回の内容、参考になればと思います。