デフォルトのタクソノミーには『カテゴリ』『タグ』がありますが、カスタマイズしたいことがあります。たとえばカテゴリを固定ページでも使いたいとか、タグで階層を使いたいとか。
やり方はかんたんです。カスタマイズ用の関数やフィルターが用意されています。
(もちろんカスタム・タクソノミーでも使える。)
タクソノミーは投稿のグループ化に使うもので、デフォルトでは『カテゴリ』と『タグ』があります。
タクソノミーは投稿と紐付けて使うので、投稿が使うタクソノミーを指定しなければいけません。
具体的な例でやってみましょう。
カテゴリを固定ページやカスタム投稿タイプでも使う
デフォルトでは、カテゴリは『投稿』でしか使えません。固定ページでは設定できないようになっています。
タクソノミーの登録処理でそうしているから。
register_taxonomy(
'category',
'post',
array(
'hierarchical' => true,
'query_var' => 'category_name',
'rewrite' => $rewrite['category'],
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'_builtin' => true,
'capabilities' => array(
'manage_terms' => 'manage_categories',
'edit_terms' => 'edit_categories',
'delete_terms' => 'delete_categories',
'assign_terms' => 'assign_categories',
),
'show_in_rest' => true,
'rest_base' => 'categories',
'rest_controller_class' => 'WP_REST_Terms_Controller',
)
);
2番目のパラメータが 'post' になっています。これに固定ページ('page')を追加しましょう。
add_action('init', function() {
register_taxonomy_for_object_type( 'category', 'page');
});
register_taxonomy()の2番目のパラメータは $object_type で、タクソノミーを使う投稿タイプを指定するもの。それを変更する関数が register_taxonomy_for_object_type()。
この関数は複数の投稿タイプを指定できません。複数指定するときはひとつずつこの関数を読んで追加していきましょう。
またこれは処理実行のタイミングが重要です。'init' アクションで処理するようにしましょう。
(アクションを使わず実行したら処理は上手くいかない。)
よくテーマのfunctions.phpにコードを挿入する説明が見られますが、よくありません。テーマは本来機能を入れるものではないので。
本来やるべきではありませんが、テーマに入れる場面ではfunctions.phpにいろいろな処理を入れると、数百行、へたすると千単位にもわたる縦長のソースコードになってしまいます。
その記述はプログラマの書くものではありません。機能、役割ごとにファイルを分割するのがプログラミングの基本中の基本。
functions.phpは、requireを使って各機能のphpファイルをロードする親ファイルに徹してください。
WordPress Codex 日本語版
関数リファレンス - register_taxonomy_for_object_type
WordPress.org リファレンス
タグに階層構成(親子関係)を付ける
あまりすることはないと思いますが、もうひとつのデフォルト・タクソノミーのタグに親子関係をつけてみましょう。
register_taxonomy() の3番目のパラメータは $args なんですが、この値を変更する方法も用意されています。
関数ではなくフィルターを使います。このフィルターはタクソノミーに何かしらの処理が発生したときに実行され、値を変更したものが返されます。
add_filter( 'register_taxonomy_args', function( $args, $taxonomy ) {
if ( 'post_tag' === $taxonomy ) {
$args['hierarchical'] = true;
}
return $args;
}, 10, 2 );
このフィルターはテーマのfunctions.phpで行ってもできますが、プラグインで行うほうがいいです。
このようにregister_taxonomy() で設定する値は、タクソノミーの名称以外のすべてを後で変更できます。最初に設定で失敗したなと思っても直せるので便利。
これはカスタム・タクソノミーでも同じです。