概要説明
WordPress の投稿のカテゴリーを 1 つだけにする方法。クラシックエディタでカテゴリーの欄をラジオボタンにするコードと、ブロックエディタやクイック編集でも効く、保存のときに 1 つに絞る functions.php のコード。前からある投稿の注意も。
~ 目次 ~
クラシックエディタ:カテゴリーの欄をラジオボタンにする
カテゴリーを 1 つに決めて運用したいサイトでは、投稿の画面でカテゴリーを 1 つしか選べないようにしておくと、付け間違いが減ります。WordPress の標準ではチェックボックスなので、いくつでも選べてしまいます。
クラシックエディタ(Classic Editor プラグイン)を使っているサイトでは、次のコードでカテゴリーの欄をラジオボタンにできます。
functions.php
/*----------------------------------------------------
クラシックエディタ:カテゴリーの欄をラジオボタンにする(投稿だけ)
----------------------------------------------------*/
if ( ! function_exists( 'fs_category_radio' ) ) {
function fs_category_radio() {
$screen = get_current_screen();
if ( ! $screen || 'post' !== $screen->post_type || $screen->is_block_editor() ) {
return;
}
?>
<script>
jQuery( function ( $ ) {
$( '#categorychecklist input[type=checkbox]' ).each( function () {
$( this ).replaceWith( $( this ).clone().attr( 'type', 'radio' ) );
} );
$( '#category-tabs, #category-pop' ).hide(); // 「よく使うもの」はチェックボックスのままなので隠す
} );
</script>
<?php
}
add_action( 'admin_footer-post.php', 'fs_category_radio' );
add_action( 'admin_footer-post-new.php', 'fs_category_radio' );
}
- 投稿(post)の編集画面だけで動きます。固定ページやほかの投稿タイプには効きません。
- 「よく使うもの」のタブはチェックボックスのままなので、隠しています。
- ブロックエディタでは効きません(カテゴリーの欄の作りが違うため)。ブロックエディタのサイトは、下の「保存のときに 1 つだけにする」を使ってください。
ラジオボタンにすると、画面では 1 つしか選ばれていない状態になります。そのまま更新すると、残りのカテゴリーは外れます。カテゴリーが 2 つ以上付いている投稿は、先に投稿の一覧で確かめておきます。
保存のときに 1 つだけにする(どのエディタでも効く)
ラジオボタンは画面だけの仕組みなので、クイック編集・一括編集・ブロックエディタ・アプリなどから保存すると、カテゴリーが 2 つ以上付くことがあります。保存のときに、先頭の 1 つだけを残すようにしておくと確実です。
functions.php
/*----------------------------------------------------
投稿のカテゴリーを 1 つだけにする(保存のときに先頭の 1 つだけ残す)
クラシックエディタ・ブロックエディタ・クイック編集のどれで保存しても効く
----------------------------------------------------*/
if ( ! function_exists( 'fs_keep_one_category' ) ) {
function fs_keep_one_category( $object_id, $terms, $tt_ids, $taxonomy ) {
if ( 'category' !== $taxonomy || 'post' !== get_post_type( $object_id ) || count( $tt_ids ) <= 1 ) {
return;
}
$first = get_term_by( 'term_taxonomy_id', (int) reset( $tt_ids ), 'category' );
if ( ! $first ) {
return;
}
remove_action( 'set_object_terms', 'fs_keep_one_category', 10 ); // 自分で呼び直すので、くり返さないように外す
wp_set_object_terms( $object_id, array( (int) $first->term_id ), 'category' );
add_action( 'set_object_terms', 'fs_keep_one_category', 10, 4 );
}
add_action( 'set_object_terms', 'fs_keep_one_category', 10, 4 );
}
- カテゴリーが付けられた直後(set_object_terms)に、2 つ以上なら先頭の 1 つだけにします。どの画面から保存しても、最後はここを通ります。
- 投稿(post)のカテゴリーだけが対象です。タグやほかの分類には効きません。
- ラジオボタンのコードと一緒に使うと、画面でも保存でも 1 つになります。
確かめた結果
- 作業環境(WordPress 7.1)で、上の保存のコードを入れて、投稿にカテゴリーを 2 つ付けて保存すると、先に指定した 1 つだけが残りました。コードを外して同じことをすると、2 つとも付きました。
- クラシックエディタの編集画面で、ラジオボタンのコードの中身を動かすと、カテゴリー 21 個がラジオボタンになり、1 つだけ選べる状態になりました。「よく使うもの」のタブは隠れました。
前に載せていたコードから直したところ
- 投稿の編集画面だけで動くようにした(ブロックエディタの画面では何もしない)。
- 保存のときに 1 つに絞るコードを足した(画面のラジオボタンだけでは、ほかの保存の方法で 2 つ以上付くため)。
- 関数の名前の頭に fs_ を付けた(ほかのプラグインとぶつからないように)。


