管理画面にカスタム投稿のカテゴリやタグを表示する方法

WordPress

2017/2/8

カスタム投稿タイプを使って制作実績のページを制作中、ちょっとハマったので備忘録。申し遅れました小倉(@ogr8beat)です。

なお、今回の記事ではカスタム投稿タイプやタクソノミーの作り方には触れていません。

タクソノミーとは

そのものずばり、記事をグループ化する、カテゴライズする、分類する仕組みです。要はおなじみのカテゴリやタグなどのこと。投稿ページを開くとカテゴリやタグの欄があるのはなぜか?

わぷー
わぷー
そうだよね、多くなるだろうしグループ分けできた方がいいよね!

…とWordPressのインストール時点で分類方法として設定してくれているためです。いわば既定のものなので「デフォルト分類」といいます。

対して「カスタム分類」は、デフォルト分類である「カテゴリ」や「タグ」とは別にユーザ自身で設定する分類方法のこと。とはいっても、親子関係がつけられるカテゴリ、カテゴリをまたぎ関連づけられるタグ、この2つがあれば一般的には十分ですよね。だからまるでカスタム投稿タイプ専用のように使われがちですが、実は通常の投稿(ブログ記事)や固定ページでも使えます。

カスタム分類だとかカスタムタクソノミーだとか呼び方が複数ありますが、「分類」が英語か日本語かというだけで全くの同義語です。スマホって呼ぶかスマフォって呼ぶかみたいな感じでしょうか。

さて、私も例に漏れず、カスタム投稿タイプでこのカスタム分類を使いました。カテゴリ型のカスタム分類と、タグ型のカスタム分類です。

ゲシュタルト崩壊しそうなので、ここで作った2つのカスタム分類は便宜上「カテゴリ」「タグ」と呼ぶことにします。

カスタム投稿の記事一覧にはタクソノミーの項目がない

ダッシュボード内、管理画面の話です。

通常の投稿記事一覧にはあるのに、カスタム投稿一覧にはカテゴリもタグも表示されていません。ユーザが自分で追加した分類方法の紐づけを WordPress に認識させなければならないんですね。通常の投稿(ブログ記事)と同じようにするとなると、実現させたいのは以下の3点。

  • カテゴリとタグどちらも表示
  • タームが複数あるなら全て表示
  • クリックで同じタームの記事を絞り込み

ここで「ターム」という新しいワードが出てきましたが、なんてことはありません。「中華」というカテゴリのタームは「中華」、「ラーメン」というタグのタームは「ラーメン」です。うまい言い方が思いつきませんが、分類に使う文字列そのもののようなイメージです。

Codexのダイアグラムを参考に作成

タクソノミーとタームの関係性については次のサイトが分かりやすいかなと思います。カスタム投稿タイプやカスタム分類を作るコードも記載されていたので、それについてはこちらを参照してください。

カテゴリとタグを表示させるコード

前提として、いくつかのスラッグを把握しておく必要があります。カスタム投稿タイプのスラッグと、そのカスタム分類それぞれのスラッグ、つまり英語版の名前です。

  1. 「レシピ」というカスタム投稿タイプで、スラッグは「recipe
  2. レシピを和食とか洋食とか親子関係をもって分類するためのカテゴリ、スラッグは「recipe-category
  3. レシピを麺類とか肉料理とか縦横無尽に分類するためのタグ、スラッグは「recipe-tag

上記を例にして、さっそくサンプルコードです。もちろん functions.php に書くのでバックアップなどの事前準備は各自行ってください。

PHP

//管理画面のカスタム投稿一覧にカテゴリとタグを表示
function add_posts_columns($columns) {
  $columns['recipe_category'] = 'カテゴリ'; //カスタム分類(カテゴリ)のスラッグ
  $columns['recipe_tag'] = 'タグ';  //カスタム分類(タグ)のスラッグ
  return $columns;
}
function add_posts_columns_list($column_name, $post_id) {
  if ( 'recipe_category' == $column_name ) {
    $terms = $terms = get_the_terms( $id, 'recipe_category' );
    $cnt = 0;
    foreach((array)$terms as $var) {
      echo $cnt != 0 ? ", " : "";
      echo "" . $var->name . "";
      ++$cnt;
    }
  } elseif ( 'recipe_tag' == $column_name ) {
    $terms = $terms = get_the_terms( $id, 'recipe_tag' );
    $cnt = 0;
    foreach((array)$terms as $var) {
      echo $cnt != 0 ? ", " : "";
      echo "" . $var->name . "";
      ++$cnt;
    }
  }
}
add_filter( 'manage_edit-recipe_columns', 'add_posts_columns' );
add_action( 'manage_recipe_posts_custom_column', 'add_posts_columns_list', 10, 2 );

各スラッグの部分を書き換えればコピペで実装できると思います。
なお、関数名(add_posts_columnsadd_posts_columns_list)、変数名($columns など)は自分が分かりやすい好きな文字列に変えることもできます。

  • 複数のカテゴリ、複数のタグをつけるケースを想定して foreach
  • 下書き中やタグなしなどの配列データがないケースを想定して null チェックのエラーを回避
  • get_the_term_list()でタームを表示させようとするとフロントエンドページにリンクされてしまう

思いのほか時間をかけてしまったので、このシェアで皆さんの検索時間が少しでも短縮されれば幸いです。

WordPress