Webデザイン

WordPressで普通の投稿にカスタムタクソノミー(カスタム分類)を追加する方法

WordPressの投稿にカスタムタクソノミー(分類)を追加

どうもこんにちは。
Web/App/UIデザイナーのサトウです。

今回は、WordPressで普通の投稿にカスタムタクソノミー(カスタム分類)を追加する方法について書いていきます。
WordPressで投稿を分類する際、「タグ」で一緒くたに管理したくない、カテゴリーとタグでは足りない場合などに重宝します。

カスタムタクソノミー(カスタム分類)とは?

投稿に最初から用意されている「カテゴリー」「タグ」がありますが、それらと同様の機能(タクソノミー)をさらに追加するものです。

多くの場合、「カスタム投稿タイプ」にカテゴリーやタグのような機能を持たせる際に使用されます。

カテゴリーのような使い方(1投稿に1分類)をすることもできますし、タグのような使い方(1投稿に複数分類)をすることもできます。

使用する際には、「分類名」「ターム(term)」を作成して使用します。
「分類名」が「カテゴリー」「タグ」と同様の意味を持ち、「ターム」がそれに含まれるひとつひとつのアイテムです。

分類名とタームの例

ジャンル(分類名)
┣ 和食(ターム)
┣ 洋食(ターム)
┗ 中華(ターム)

カスタムタクソノミー(カスタム分類)の追加方法

functions.phpに関数やパラメーターを記述して追加します。

カスタム投稿タイプとセットで追加する

例えばカスタム投稿タイプとセットでカスタム分類を追加するには以下のように記述します。


function create_post_type() {
  //カスタム投稿
  register_post_type(
    'cuisine', array(
      'label'  => '料理',
      'labels' => array(
        'name'             => '料理',
        'add_new'          => '料理を追加',
        'edit_item'        => '料理を編集',
        'view_item'        => '料理を見る',
        'add_new_item'     => '追加する料理の情報を入力',
        'enter_title_here' => '料理名'
      ),
      'hierarchical'       => true,
      'menu_position'      => 4,
      'has_archive'        => true,
      'show_in_nav_menus'  => true,
      'supports'           => array(
        'title',
        'editor',
        'excerpt',
        'thumbnail',
        'custom-fields',
        'revisions',
        'page-attributes'
      )
    )
  );
  //カスタム分類
  register_taxonomy(
    'cuisine_genre',
    'cuisine',
    array(
      'label'          => '料理カテゴリー',
      'hierarchical'   => true,
    )
  );
}
add_action( 'init', 'create_post_type' );

カスタムタクソノミーは投稿や固定ページにも追加できる

僕自身、カスタムタクソノミーはカスタム投稿タイプを使うときに一緒に使うものという思い込みがありましたが、先日、投稿に対して「カテゴリー」「タグ」に次ぐ第3の分類を追加する必要が出てきて、調べてみたところ、カスタムタクソノミーは普通の投稿にも追加できることを知りました。

というか、そもそもカスタムタクソノミーは投稿や固定ページ、カスタム投稿等関係なく、「色々な項目を色々な方法でグループ化するために非常にパワフルな機能」ということだそうです。

カスタムタクソノミーについての説明(WordPress公式)はこちらから

上記公式ページの例文では投稿(post)に対して分類を追加する例が示されています。

では、実際に投稿に対して新たな分類(タクソノミー)を追加してみましょう。
いろいろなパラメーターを追加することで細かな制御ができますが、ひとまず普通に使える最低限の記述でご紹介します。

カテゴリー的な使い方をする場合


function register_custom_taxonomy_for_post() {
  register_taxonomy(
    'cuisine_genre', /* 分類名 */
    'post', /* 投稿に追加するなら「post」、固定ページなら「page」、カスタム投稿タイプならカスタム投稿タイプ名 */
    array(
      'label'             => '料理ジャンル', /* 分類の表示名 */
      'hierarchical'      => true, /* 階層化の有無 */
      'show_admin_column' => true, /* 管理画面の投稿一覧ページで分類の列を表示するか */
    )
  );
}
add_action('init', 'register_custom_taxonomy_for_post');

カテゴリー的な使い方をする場合、「親カテゴリー > 子カテゴリー > 孫カテゴリー」のようなケースがあると思いますので、「hierarchical」パラメーターの値を「true」にします。

また、デフォルトでは管理画面の投稿一覧画面に追加した分類の列が表示されないので、「show_admin_column」パラメーターの値も「true」にします。

タグ的な使い方をする場合


function register_custom_taxonomy_for_post() {
  register_taxonomy(
    'price_range', /* 分類名 */
    'post', /* 投稿に追加するなら「post」、固定ページなら「page」、カスタム投稿タイプならカスタム投稿タイプ名 */
    array(
      'label'                 => '価格帯', /* 分類の表示名 */
      'hierarchical'          => false, /* 階層化の有無 */
      'show_admin_column'     => true, /* 管理画面の投稿一覧ページで分類の列を表示するか */
      'update_count_callback' => '_update_post_term_count', /* タグのような使い方をする際には必須 */
    )
  );
}
add_action('init', 'register_custom_taxonomy_for_post');

基本的な記述はカテゴリー的な使い方をする場合と変わりません。
ただ、タグ的な使い方をする場合、カテゴリーのような親子関係は必要ないので、「hierarchical」パラメーターの値は「false」にします。

また、カテゴリー的な使い方をする際には必要なかった「update_count_callback」というパラメーターを追加し、値を「_update_post_term_count」とします。
この設定をしないと、投稿画面からカンマ区切りで複数設定したはずのタグがまとまった1つの文字列として扱われてしまうので要注意です。

追加した分類での絞り込みを管理画面の投稿一覧に実装

管理画面の投稿一覧で、追加した分類での絞り込みができるようにするには以下のような記述を functions.php に追加します。


function add_term_dropdown( $post_type ) {
  if($post_type == 'post') { /* post、page、カスタム投稿タイプ名など */
    $term_slug = get_query_var('cuisine_genre'); /* 分類名 */
    wp_dropdown_categories(array(
      'show_option_all' => __('料理ジャンル', 'my_theme'),
      'selected'        => $term_slug,
      'name'            => 'cuisine_genre', /* 分類名 */
      'taxonomy'        => 'cuisine_genre', /* 分類名 */
      'value_field'     => 'slug',
    ));
  }
}
add_action('restrict_manage_posts', 'add_term_dropdown', 10, 3);

さて、今回は、WordPressで普通の投稿にカスタムタクソノミー(カスタム分類)を追加する方法について書いてみました。
いかがだったでしょうか?
僕自身は今回、目から鱗が落ちるような学びがありました。

読んでくださったあなたの参考に少しでもなれば嬉しいです。
それではまた次回。