WordPress の投稿で選べるカテゴリーを 1 つだけにする(ラジオボタン化と、保存のときに 1 つに絞るコード)

概要説明

WordPress の投稿のカテゴリーを 1 つだけにする方法。クラシックエディタでカテゴリーの欄をラジオボタンにするコードと、ブロックエディタやクイック編集でも効く、保存のときに 1 つに絞る functions.php のコード。前からある投稿の注意も。

WordPress の投稿で選べるカテゴリーを 1 つだけにする(ラジオボタン化と、保存のときに 1 つに絞るコード)

カテゴリーを 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 つ以上付いている投稿は、先に投稿の一覧で確かめておきます。

WordPress の投稿で選べるカテゴリーを 1 つだけにする(ラジオボタン化と、保存のときに 1 つに絞るコード)

保存のときに 1 つだけにする(どのエディタでも効く)

WordPress の投稿で選べるカテゴリーを 1 つだけにする(ラジオボタン化と、保存のときに 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_ を付けた(ほかのプラグインとぶつからないように)。

関連機能

  1. WordPress 固定ページの投稿画面に新規作成したテンプレートファイルを追加する

  2. WordPressログインページ、管理画面にIP制限を設定 ( .htaccess )

  3. 管理画面ヘッダーにログアウトを追加

サイドバー

よく使うカスタマイズ

最近の記事

Profile

PAGE TOP