カテゴリーページでキーワードなどの項目を任意に設定したいと思い、ちょっとチャレンジしてみました。
ただし、カテゴリーや投稿タグなどを管理している term、term_taxonomy テーブルには、投稿に対するカスタムフィールドのようなものが存在せず、項目を追加した場合にどこにデータを保存するかが問題になってきます。
では、どのような方法があるかというと
- optionsテーブルに配列として保存する
- termsテーブルにフィールドを追加する
- カスタムフィールドの内容を保存するpostmetaテーブルのようなテーブルを追加する
の3つが考えられます。これらの手法について
1.は、テーブル構造を変更することなく簡易に実装ができますが、検索性はほぼ0です。
2.は、多少の変更で get_category など従来の関数で情報の取得が可能で、検索性も良好ですが、項目毎にフィールドが必要になるため、自由な拡張は期待できません。
3.は、拡張性が高く検索性も保持されますが、独自の取得関数が必要になり、実装には一番手間がかかります。
今回は、テストの意味もあり、3の方法でトライしてみることにしました。
まずはいきなりですが、Simple Term Meta というプラグインをインストールします。
Simple Term Meta は、有効化すると投稿に対するカスタムフィールドのように、カテゴリーの属性情報を保存できる termmeta テーブルの生成と、データの追加・編集・削除に必要な関数が利用できるようになります。
ただし、このプラグイン単体では、何ら目に見えた変化は発生せず、追加する属性情報のフォームや保存プロセスなどは自分で実装しなければなりません。
また、Simple Term Meta の他にも、ほぼ同等機能を有した Taxonomy Metadata というプラグインがあります。こちらを試してみた方がいらっしゃったら、使い勝手など教えてくださいね。
あとは、CODE 1 をテーマの functions.php を追加すると、カテゴリーや投稿タグなど、有効なタクソノミーそれぞれに対して、追加・編集ページにキーワードの項目が追加されます。
キーワード以外の項目を追加する場合は、入力フォームを追加して、update_keywords_termmeta と delete_keywords_termmeta でのプロセスをコピーしてあげればよいですし。テーブルを追加する方法ではなく、optionsテーブルやフィールドを追加する方法とした場合でも、追加・編集・削除時のプロセスの中身をごにょごにょっといじってあげれば良いだけです。
CODE 1
$taxonomies = get_taxonomies( array( 'public' => true, 'show_ui' => true ) ); if ( ! empty( $taxonomies ) && function_exists( 'update_term_meta' ) ) { foreach ( $taxonomies as $taxonomy ) { add_action( $taxonomy . '_add_form_fields', 'add_keywords_form' ); add_action( $taxonomy . '_edit_form_fields', 'edit_keywords_form', 10, 2 ); add_action( 'created_' . $taxonomy, 'update_keywords_termmeta' ); add_action( 'edited_' . $taxonomy, 'update_keywords_termmeta' ); add_action( 'delete_' . $taxonomy, 'delete_keywords_termmeta' ); } } function add_keywords_form( $taxonomy ) { ?> <div class="form-field"> <label for="tag-keywords">キーワード</label> <textarea name="keywords" id="tag-keywords" rows="3" cols="40"></textarea> </div> <?php } function edit_keywords_form( $tag, $taxonomy ) { if ( function_exists( 'get_term_meta' ) ) { $keywords = get_term_meta( $tag->term_id, 'keywords', true ); ?> <tr class="form-field"> <th scope="row" valign="top"><label for="keywords">キーワード</label></th> <td><input type="text" name="keywords" id="keywords" size="40" value="<?php echo $keywords ? esc_html( $keywords ) : ''; ?>" /> </tr> <?php } } function update_keywords_termmeta( $term_id ) { $post_keywords = stripslashes_deep( $_POST['keywords'] ); if ( is_string( $post_keywords ) && $post_keywords && function_exists( 'update_term_meta' ) ) { update_term_meta( $term_id, 'keywords', $post_keywords ); } } function delete_keywords_termmeta( $term_id ) { if ( function_exists( 'delete_term_meta' ) ) { delete_term_meta( $term_id, 'keywords' ); } }