この記事では、投稿のタグやカテゴリをカスタム投稿タイプに追加する方法についてまとめておきます。
実際にカスタム投稿タイプに投稿タグを追加しようとして、自分がやってドハマりしたので、備忘録として残します。
カスタム投稿タイプに投稿タグやカテゴリを追加する
カスタム投稿タイプに投稿タグやカテゴリを追加する場合、追加先のカスタム投稿タイプは、
- 既存のカスタム投稿タイプを使用しないといけない場合
- 新規にカスタム投稿タイプを作れる場合
の2通りがあると思います。
新規にカスタム投稿タイプを追加する場合
カスタム投稿タイプを新規に作る場合は、素直にカスタム投稿タイプを作れるプラグインCPT UIを使うのをおススメします。

おススメする理由は、設定メニューに投稿タグやカテゴリを使えるようにする設定項目があるからです。
このプラグインは、カスタム投稿タイプやカスタムタクソノミーを作る必要性に迫られないと使用する機会はないですが、素晴らしいプラグインだと思います。
既存のカスタム投稿タイプに投稿タグやカテゴリを追加する場合
カスタム投稿タイプに投稿タグやカテゴリを追加する際に問題が起きるのは、既存のカスタム投稿タイプに追加する場合です。
特に有料テーマなどではニュースやお知らせなどと言う名前のカスタム投稿タイプが用意されていることも多いと思います。
私の場合は、それら既存のカスタム投稿タイプとCPT UIで自分で作成したカスタム投稿タイプに投稿タグやカテゴリを追加する時に問題が起きました。
カスタム投稿タイプに投稿タグ、カテゴリを追加する方法とかで、少し検索するとそれらしいサイトが出てきます。しかし、そのまま真似すると動きが少し変になりました。
惜しいんだけど動かなかった例
この記事を見た時に、これはそのものずばりじゃないか!と思ったのですが、完全には動きません。

まず、投稿タグやカテゴリを使用する投稿タイプをすべて指定する必要があります。
指定しない投稿タイプがあると、その投稿タイプから投稿タグやカテゴリが削除されてしまいます。
極端な例だと、’post’を指定しないと、投稿からもタグやカテゴリが削除されます。つまり、CPT UIで投稿タグやカテゴリを追加したカスタム投稿タイプについても全て書かないといけません。
また、致命的な問題点としてカスタム投稿タイプにカテゴリやタグは追加されるのですが、パーマリンクがおかしくなります。
/**
* PHP 5.4 以上じゃないとエラーがでるので注意してください。
*/
add_action( 'init', function () {
register_taxonomy( 'post_tag', [ 'post', 'teratail' ],
[
'hierarchical' => false,
'query_var' => 'tag',
]
);
register_taxonomy( 'category', [ 'post', 'teratail' ],
[
'hierarchical' => true,
'query_var' => 'category_name',
]
);
} );
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() && ! $query->is_main_query() ) {
return;
}
if ( $query->is_category() || $query->is_tag() ) {
$query->set( 'post_type', [ 'post', 'teratail' ] );
}
} );
奇跡のように動く事例
半ばあきらめかけていた時に、見つけた凄い記事がコレです。
今回ひっかかったのは、タグのリンクが正常に動作しなくなること。
WordPressのデフォルトのタグは タクソノミーが「post_tag」、スラッグが「tag」に設定されています。
上述の記述をすると、スラッグが「post_tag」にセットされ、タグの一覧のリンクURLも /tag/ から /post_tag/ に書き換わります。
すると、WordPressは通常のタグを /tag/として処理しているのかタグのページがおかしなことになってしまう。パーマリンク設定を変えても変化なし。
そのものズバリ!
更に実際のソースがとても短い!
register_taxonomy(
'post_tag',
array('post','スラッグ名'),
get_taxonomy('post_tag')
);
この記事の凄いところは、
- 追加したい投稿タイプだけ指定すればよい(ただし、postは必要)
- タグのパーマリンクがおかしくならない
ところです。
まとめ
この方法であれば、有料テーマのカスタム投稿タイプと、CPT UIで作成したカスタム投稿タイプをシームレスにつなげることができます。これがあるかないかでユーザービリティはだいぶ違うのではないかと思いました。