WordPress カテゴリーの選択を1つだけに制限

WordPress の投稿の編集画面においてカテゴリーおよびタクソノミーの選択を1つだけに制限する方法を紹介します。

カテゴリー用のものは既に多くのサイトで紹介されていますが、タクソノミーに対応したものは見つかりませんでした。また、カテゴリー用のものでも「よく使うもの」に対応したものは見つかりませんでした。

ここでは、タクソノミーおよび「よく使うもの」に対応した方法を紹介します。

PHP コード

functions.php 等に、下記コードを追加します。

// 投稿の編集画面のタクソノミー(カテゴリー)の選択およびクイック編集のカテゴリー選択を1つだけに制限するスクリプトを組み込みます。
function my_admin_enqueue_scripts_single_select_taxonomy( $hook_suffix ) {
	if ( 'post-new.php' === $hook_suffix || 'post.php' === $hook_suffix ) {
		// 投稿の編集画面のタクソノミー(カテゴリー)

		//global $post;
		//if ( $post->post_type !== 'post' )
		//	return;

		$script = <<<SCRIPT
jQuery(function($) {
  $(".categorydiv").each( function() {
    var this_id = $(this).attr("id"), taxonomyParts, taxonomy;
    taxonomyParts = this_id.split("-");
    taxonomyParts.shift();
    taxonomy = taxonomyParts.join("-");
    $("#" + taxonomy + "checklist, #" + taxonomy + "checklist-pop").on("click", "label input[type='checkbox']", function() {
      var t = $(this), c = t.is(":checked"), id = t.val();
      if ( id && t.parents("#taxonomy-" + taxonomy).length ) {
        $("#" + taxonomy + "-all input").prop("checked", false);
        $("#" + taxonomy + "-pop input").prop("checked", false);
        $("#in-" + taxonomy + "-" + id + ", #in-popular-" + taxonomy + "-" + id).prop("checked", c);
      }
   });
  $("#" + taxonomy + "-all").after("<p class=\"howto\" style=\"margin-top: 4px;\">一つのみ選択可</p>");
  });
});
SCRIPT;
		wp_add_inline_script( 'jquery-migrate', $script, 'after' );
	} else if ( $hook_suffix === 'edit.php' ) {
		// クイック編集のカテゴリー
		$script = <<<SCRIPT
jQuery(function($) {
  $(".category-checklist input[type='checkbox']").click( function() {
    var c = $(this).is(":checked");
      $(this).parents(".category-checklist").find("input[type='checkbox']").prop("checked", false);
      $(this).prop("checked", c);
  });
  $(".category-checklist").after("<p class=\"howto\" style=\"font-size: 12px;\">一つのみ選択可</p>");
});
SCRIPT;
		wp_add_inline_script( 'jquery-migrate', $script, 'after' );
	}
}

add_action( 'admin_enqueue_scripts', 'my_admin_enqueue_scripts_single_select_taxonomy' );

投稿の編集画面のみに限定する場合、上記コードの 6 行目から 7 行目までの 3 行のコメントを外してください。

変更後

		global $post;
		if ( $post->post_type !== 'post' )
			return;

最後に

今回は常に1つだけ選択できるようにしましたが、コーディングしていて、階層構造(親子関係)のカテゴリーの場合、1つの子孫関係にあるカテゴリーだけを選択させたい場合もあるかなと思ったので、次回機会があれば対応してみたいと思います。

コメントを残す

メールアドレスが公開されることはありません。

日本語でコメントを入力してください。(スパム対策)