wordpressで投稿を編集するページは通常では、カテゴリやタクソノミーの一覧はセレクトボックスになっています。
単純なブログサイトのように、カテゴリが複数選択できるようになっていても構わない場合は問題ないのですが、開発を進めていくと、一つしか選択できない方が都合がいい事案に遭遇します。
今回は、タクソノミーの一覧をセレクトボックスやラジオボタンに簡単にカスタマイズできる方法をご紹介します。
注意点
Gutenbergを無効にしている投稿のみ使えます。
準備
fanction.phpに下記のソースをコピペしてください。
セレクトボックスに変更したい場合
function meta_box_change_select( $post, $box ) {
$defaults = array( 'taxonomy' => 'category' );
if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
$args = array();
} else {
$args = $box['args'];
}
$r = wp_parse_args( $args, $defaults );
$tax_name = esc_attr( $r['taxonomy'] );
$terms = get_terms( $tax_name, array( 'get' => 'all' , 'orderby' => 'id', 'order' => 'ASC' ) ); //並び順は自由に
$select_terms = get_the_terms( $post->ID,$tax_name );
$selected_id = '';
if( $select_terms ){
$selected_id = array_shift( $select_terms )->term_id;
}
echo '<select id="cat_name" name="tax_input['.$tax_name.'][]">';
foreach( $terms as $term ){
$selected = $selected_id == $term->term_id ? 'selected="selected"' : '';
echo '<option value="'.$term->term_id.'" '.$selected.'>'.$term->name.'</option>';
}
echo '</select>';
}
ラジオボタンに変更したい場合
function meta_box_change_radio( $post, $box ) {
$defaults = array( 'taxonomy' => 'category' );
if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
$args = array();
} else {
$args = $box['args'];
}
$r = wp_parse_args( $args, $defaults );
$tax_name = esc_attr( $r['taxonomy'] );
$taxonomy = get_taxonomy( $r['taxonomy'] );
echo '<div id="'.$tax_name.'-all" class="tabs-panel">';
$name = ( $tax_name == 'category' ) ? 'post_category' : 'tax_input['.$tax_name.']';
echo "<input type='hidden' name='{$name}[]' value='0' />";
$terms = get_terms( $tax_name, array( 'get' => 'all' , 'orderby' => 'id', 'order' => 'ASC' ) ); //並び順は自由に
$select_terms = get_the_terms($post->ID,$tax_name);
$selected_id = '';
if( $select_terms ){
$selected_id = array_shift($select_terms)->term_id;
}
echo '<ul id="'.$tax_name.'checklist" data-wp-lists="list:.'.$tax_name.'" class="categorychecklist form-no-clear">';
foreach( $terms as $term ){
$id = "popular-$tax_name-$term->term_id";
$selected = $selected_id == $term->term_id ? 'checked="checked"' : '';
echo '<li id="'.$id.'" class="popular-category">';
echo '<label class="selectit">';
echo '<input id="in-'.$id.'" type="radio" '.$selected.' value="'.(int) $term->term_id.'" name="tax_input['.$tax_name.'][]"/>';
echo esc_html( apply_filters( 'the_category', $term->name, '', '' ) );
echo '</label>';
echo '</li>';
}
echo '</ul>';
echo '</div>';
}
カスタムタクソノミーを作成する
register_taxonomyの'meta_box_cb'に、先ほど準備したmeta_box_changeを設定する。
//投稿画面のカテゴリをセレクトボックスに変更
'meta_box_cb' => 'meta_box_change_select',
//投稿画面のカテゴリをラジオボタンに変更する場合
'meta_box_cb' => 'meta_box_change_radio',
例
register_taxonomy(
'new_category',
array('new_post'),
array(
'hierarchical' => true,
'update_count_callback' => '_update_post_term_count',
'label' => 'カテゴリ',
'singular_label' => 'カテゴリ',
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'meta_box_cb' => 'meta_box_change_radio', //投稿画面のカテゴリをラジオボタンに変更
)
);
以上で設定完了です。