WordPressの投稿画面の親カテゴリーを選択出来ないようにする

20151212_01WordPressの投稿画面でカテゴリーを選択する時に子カテゴリーがある親カテゴリーは選択しないと決めた場合、選択できないような方法がないか調べて見たと参考となる記事を見つけました。
このまま使用すると子カテゴリーがない主カテゴリーのチェックボックスも非表示になり選択ができなくなってしまいますので、子カテゴリーがある親カテゴリのみ選択できない仕様に変更しました。チェックボックスは子カテゴリーがない主カテゴリーのチェックボックスとレイアウトを揃えるために非表示ではなく選択できないdisabled表示にしてあります。

下記のコードを使用しているテーマのfunctions.phpに追加すると図のようなカテゴリー表示に変更されます。

require_once(ABSPATH . '/wp-admin/includes/template.php');
class Danda_Category_Checklist extends Walker_Category_Checklist {
 
     function start_el( &$output, $category, $depth, $args, $id = 0 ) {
        extract($args);
        if ( empty($taxonomy) )
            $taxonomy = 'category';
 
        if ( $taxonomy == 'category' )
            $name = 'post_category';
        else
            $name = 'tax_input['.$taxonomy.']';
 
        $class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
	$cat_child = get_category_children($category->term_id);
	if($cat_child !== "") {
            $output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), true, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
        }else{
            $output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), false, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
        }
    }
 
}

function lig_wp_category_terms_checklist_no_top( $args, $post_id = null ) {
    $args['checked_ontop'] = false;
    $args['walker'] = new Danda_Category_Checklist();
    return $args;
}
add_action( 'wp_terms_checklist_args', 'lig_wp_category_terms_checklist_no_top' );