The most straightforward way would be to to de-register the taxonomy's metabox and replace it with your own custom metabox. Below is my attempt. There are some drawbacks though, without adding in some javascript, I was unable to replicate WordPress 'add new term' feature, consequently you can only select pre-existing categories. (Or a least I was, but it added a checkbox rather than radio button).
class My_Radio_Tax{
static $taxonomy = 'event-category'; //Slug of taxonomy
static $post_type = 'event';//Post type for meta-box
function load(){
add_action( 'admin_menu', array(__CLASS__,'remove_meta_box'));
add_action( 'add_meta_boxes', array(__CLASS__,'add_meta_box'));
}
//Remove taxonomy meta box
function remove_meta_box(){
//The taxonomy metabox ID. This is different for non-hierarchical taxonomies
$tax_mb_id = self::$taxonomy.'div';
remove_meta_box($tax_mb_id, self::$post_type, 'normal');
}
//Add new taxonomy meta box
function add_meta_box() {
add_meta_box( 'my_tax', 'My taxonomy',array(__CLASS__,'metabox_inner'),'event' ,'side','core');
}
//Callback to set up metabox
function metabox_inner( $post ) {
//Get taxonomy and terms
$taxonomy = self::$taxonomy;
$tax = get_taxonomy($taxonomy);
$name = 'tax_input[' . $taxonomy . ']';
$terms = get_terms('event-category',array('hide_empty' => 0));
//Get current and popular terms
$popular = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );
$postterms = get_the_terms( $post->ID,$taxonomy );
$current = ($postterms ? array_pop($postterms) : false);
$current = ($current ? $current->term_id : 0);
?>
<div id="taxonomy-<?php echo $taxonomy; ?>" class="categorydiv">
<!-- Display tabs-->
<ul id="<?php echo $taxonomy; ?>-tabs" class="category-tabs">
<li class="tabs"><a href="#<?php echo $taxonomy; ?>-all" tabindex="3"><?php echo $tax->labels->all_items; ?></a></li>
<li class="hide-if-no-js"><a href="#<?php echo $taxonomy; ?>-pop" tabindex="3"><?php _e( 'Most Used' ); ?></a></li>
</ul>
<!-- Display popular taxonomy terms -->
<div id="<?php echo $taxonomy; ?>-pop" class="tabs-panel" style="display: none;">
<ul id="<?php echo $taxonomy; ?>checklist-pop" class="categorychecklist form-no-clear" >
<?php foreach($popular as $term){
$id = "id='in-popular-event-category-$term->term_id'";
echo "<li id='popular-event-category-$taxonomy-$term->term_id'><label class='selectit'>";
echo "<input type='radio' {$id}".checked($current,$term->term_id,false)."value='$term->term_id' />$term->name<br />";
echo "</label></li>";
}?>
</ul>
</div>
<!-- Display taxonomy terms -->
<div id="<?php echo $taxonomy; ?>-all" class="tabs-panel">
<ul id="<?php echo $taxonomy; ?>checklist" class="list:<?php echo $taxonomy?> categorychecklist form-no-clear">
<?php foreach($terms as $term){
$id = "id='in-event-category-$term->term_id'";
echo "<li id='event-category-$taxonomy-$term->term_id'><label class='selectit'>";
echo "<input type='radio' {$id} name='{name}'".checked($current,$term->term_id,false)."value='$term->term_id' />$term->name<br />";
echo "</label></li>";
}?>
</ul>
</div>
</div>
<?php
}
}
My_Radio_Tax::load();