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つの子孫関係にあるカテゴリーだけを選択させたい場合もあるかなと思ったので、次回機会があれば対応してみたいと思います。