カテゴリー、タグの追加・編集時にterm meta を設定する

カテゴリー、タグの追加・編集時にterm meta を設定する

カテゴリ―、タグ、タクソノミーの編集、新規追加時にterm metaを設定する方法を紹介します。

カテゴリ―を色分けしたい場合、カテゴリーに画像を設定したい場合などに有効です。

カテゴリーなどのアーカイブページをリッチにしたりすることもできますし、特定のterm metaを持っているカテゴリ―だけ抽出したい場合にも有効です。

term meta 設定画面作成

カテゴリ―、タグ、タクソノミーの新規追加、編集時の画面に対するフックは以下になります。

// カテゴリー新規追加
add_action( 'category_add_form_fields', function( $taxonomy ) {} );
// カテゴリー編集
add_action( 'category_edit_form_fields', function( $term, $taxonomy ) {}, 10, 2 );

// カテゴリー新規追加
add_action( 'post_tag_add_form_fields', function( $taxonomy ) {} );
// カテゴリー編集
add_action( 'post_tag_edit_form_fields', function( $term, $taxonomy ) {}, 10, 2 );

// タクソノミー新規追加
add_action( '{$taxonomy}_add_form_fields', function( $taxonomy ) {} );
// タクソノミー編集
add_action( '{$taxonomy}_edit_form_fields', function( $term, $taxonomy ) {}, 10, 2 );

新規追加の引数は文字列でタクソノミーが、編集ではWP_Termオブジェクトと文字列でタクソノミーが取得できます。

新規追加だけ作って、編集画面は作らないということはあまりないと思います。使用する際は二つとも記述しましょう。

サンプルとしてラジオボタンで選択するものを見てみましょう。

add_action( 'category_add_form_fields', 'add_fields' );
add_action( 'category_edit_form_fields', 'edit_fields' );

function add_fields() {
    ?>
    <div class="form-field">
        <label>表示・非表示</label>
        <div style="display:flex;">
            <label><input name="display" type="radio" value="1">表示</label>
            <label><input name="display" type="radio" value="0" checked>非表示</label>
        </div>
        <p>表示する場合は「表示」を選択してください。</p>
    </div>
    <?php
}

function edit_fields( $term ) {
    $value = (int) get_term_meta( $term->term_id, 'display', true );
    ?>
    <tr class="form-field">
        <th>表示・非表示</th>
        <td>
            <div>
                <label><input name="display" type="radio" value="1" <?php echo checked( $value , 1 ); ?>>表示</label>
                <label><input name="display" type="radio" value="0" <?php echo checked( $value , 0 ); ?>>非表示</label>
            </div>
            <p class="description">表示する場合は「表示」を選択してください。</p>
        </td>
    </tr>
    <?php
}

表示するタグ(div,labelなど)はデフォルトの表示のものを確認するとわかりやすいと思います。

上記はデフォルトの形にのっとっていますので特にCSSでスタイルをつけなくても見やすい形で表示されます。

inputのname属性にはterm metaのキー名を入力してください。

編集画面では保存されているterm metaの値を取得してデフォルトで表示してあげます。

この例ではラジオボタンですが、画像にしたい、カラーピッカーを利用したい場合は中身を変えてあげればOKです。

一覧画面に保存したterm metaを表示する

term metaで保存したついでに一覧画面に保存した値を表示する方法も見ていきましょう。

// カテゴリー
add_filter( 'manage_category_columns', function( $columns ) {} );
add_filter( 'manage_category_custom_column', function( $string, $column_name, $term_id ) {}, 10, 3 );

// タグ
add_filter( 'manage_post_tag_columns', function( $columns ) {} );
add_filter( 'manage_post_tag_custom_column', function( $string, $column_name, $term_id ) {}, 10, 3 );

// タクソノミー
add_filter( 'manage_{$taxonomy}_columns', function( $columns ) {} );
add_filter( 'manage_{$taxonomy}_custom_column', function( $string, $column_name, $term_id ) {}, 10, 3 );

上のフィルターフックがカラムの追加、下のフィルターフックが表示になっています。

上のフィルターフックの引数はカラムのキーと表示名が連想配列になっています。

下のフィルターフックでは、第一引数は空白文字列(昔の名残かも)、第二引数はカラム名、第三引数はtermのIDです。

フィルターフックじゃなくてアクションフックっぽいのですが、フィルターフックとして実装されています。ただ、返す値は空文字列なので返さなくても問題ないと思います。

先程の表示・非表示を例に一覧表示をするなら以下のようになります。

add_filter( 'manage_category_columns', 'add_column' );
add_filter( 'manage_category_custom_column', function( $string, $column_name, $term_id ) {}, 10, 3 );

function add_column( $columns ) {
    $columns['display'] = '表示';
    return $columns;
}

function show_column( $string, $column_name, $term_id ) {
    switch ( $column_name ) {
        case 'display' :
            echo (int)get_term_meta( $term_id, 'display', true ) === 1 ? '表示' : '非表示';
        break;
    }
    
    return $string;
}

まとめ

この辺りは投稿のpost metaより使う回数が少ないですが、使用できると結構便利になります。

新しくタクソノミーを作成するところをterm metaで済ますことも可能になるかもしれません。

また、カテゴリーのアーカイブページをリッチに仕上げるかつ変更可能にする場合には重宝します。