Visualizzare una tassonomia personalizzata come menu a discesa nella pagina di modifica dei post
Quando crei una tassonomia personalizzata, apparentemente le uniche opzioni sono visualizzarla come tag (non gerarchica) o categoria (gerarchica). Esiste un modo per visualizzarla come menu a discesa?
Mi rendo conto che questo può essere fatto usando add_meta_box()
e aggiungendolo manualmente, ma sto cercando un modo integrato (se esiste) per risparmiare molto codice! Grazie.

Puoi aggiungere una nuova tassonomia con il tuo metabox personalizzato da WordPress 3.8 utilizzando meta_box_cb
"drop_cat()" - consiste nella ricostruzione del metabox categoria originale del core wp-admin/includes/meta-boxes.php
function realty_type() {
$args = array(
'show_ui' => true,
'meta_box_cb' => 'drop_cat',
);
register_taxonomy( 'realty_type', array( 'YOUR_POST_TYPE' ), $args );
}
// Hook into the 'init' action
add_action( 'init', 'realty_type', 0 );
function drop_cat( $post, $box ) {
$defaults = array('taxonomy' => 'category');
if ( !isset($box['args']) || !is_array($box['args']) )
$args = array();
else
$args = $box['args'];
extract( wp_parse_args($args, $defaults), EXTR_SKIP );
$tax = get_taxonomy($taxonomy);
?>
<div id="taxonomy-<?php echo $taxonomy; ?>" class="acf-taxonomy-field categorydiv">
<?php
$name = ( $taxonomy == 'category' ) ? 'post_category' : 'tax_input[' . $taxonomy . ']';
echo "<input type='hidden' name='{$name}[]' value='0' />"; // Consente l'invio di un set di termini vuoto. 0 è un Term ID non valido e verrà ignorato dai controlli empty().
?>
<? $term_obj = wp_get_object_terms($post->ID, $taxonomy ); //_log($term_obj[0]->term_id)?>
<ul id="<?php echo $taxonomy; ?>checklist" data-wp-lists="list:<?php echo $taxonomy?>" class="categorychecklist form-no-clear">
<?php //wp_terms_checklist($post->ID, array( 'taxonomy' => $taxonomy) ) ?>
</ul>
<?php wp_dropdown_categories( array( 'taxonomy' => $taxonomy, 'hide_empty' => 0, 'name' => "{$name}[]", 'selected' => $term_obj[0]->term_id, 'orderby' => 'name', 'hierarchical' => 0, 'show_option_none' => '—' ) ); ?>
</div>
<?php
}

Questo ha funzionato bene per me, ma ho dovuto apportare una modifica al codice per WordPress 4.9.5 ... <?php wp_dropdown_categories( 'taxonomy' => $taxonomy, 'hide_empty' => 0, 'name' => "{$name}[]", 'selected' => $term_obj[0]->name, 'orderby' => 'name', 'hierarchical' => 0, 'show_option_none' => '—','option_none_value'=> '0', 'value_field' => 'name' ); ?>

Ecco qui:
<select>
<?php
$tax_terms = get_terms('nome_tua_tassonomia', array('hide_empty' => '0'));
foreach ( $tax_terms as $tax_term ):
echo '<option value="'.$tax_term->name.'">'.$tax_term->name.'</option>';
endforeach;
?>
</select>
Elimina il secondo argomento di $tax_terms se non vuoi visualizzare i termini vuoti.
Usa anche selected se vuoi salvare l'opzione selezionata :)

Sfortunatamente, non è possibile farlo con wp_register_taxonomy()
. Quando registri una tassonomia, il metabox predefinito è costituito da caselle di controllo (gerarchico) o da un cloud (non gerarchico).
L'unico modo per aggirare questo problema è annullare la registrazione del metabox esistente e aggiungerne uno nuovo al suo posto. Mimando attentamente il metabox "predefinito", non dovrai elaborare i dati manualmente, ma lascerai che WordPress gestisca automaticamente l'aggiunta/rimozione dei termini.
I dettagli su come fare questo sono forniti in questa risposta. Potresti anche trovare utile questo repository GitHub (che ora include la possibilità di creare termini al volo nel nuovo metabox). Le risorse collegate si riferiscono alla creazione di un metabox con pulsanti radio, ma potrebbe essere facilmente adattato per menu a discesa.

Stavo avendo difficoltà con il codice fornito da Alexufo, quindi l'ho riscritto basandomi sulla funzione aggiornata in WP 4.1.2. Ecco la mia funzione drop_cat aggiornata:
//funzione riadattata da wp-admin/includes/meta-boxes.php - post_categories_meta_box()
function drop_cat( $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'] );
?>
<div id="taxonomy-<?php echo $tax_name; ?>" class="categorydiv">
<?php //rimossi i tab per i più recenti qui ?>
<div id="<?php echo $tax_name; ?>-all">
<?php
$name = ( $tax_name == 'category' ) ? 'post_category' : 'tax_input[' . $tax_name . ']';
echo "<input type='hidden' name='{$name}[]' value='0' />"; // Permette l'invio di un set di termini vuoto. 0 è un Term ID invalido che verrà ignorato dai controlli empty().
?>
<ul id="<?php echo $tax_name; ?>checklist" data-wp-lists="list:<?php echo $tax_name; ?>" class="categorychecklist form-no-clear">
<?php //wp_terms_checklist( $post->ID, array( 'taxonomy' => $tax_name, 'popular_cats' => $popular_ids ) ); ?>
</ul>
<?php $term_obj = wp_get_object_terms($post->ID, $tax_name ); //_log($term_obj[0]->term_id) ?>
<?php wp_dropdown_categories( array( 'taxonomy' => $tax_name, 'hide_empty' => 0, 'name' => "{$name}[]", 'selected' => $term_obj[0]->term_id, 'orderby' => 'name', 'hierarchical' => 0, 'show_option_none' => "Seleziona $tax_name" ) ); ?>
</div>
<?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) :
// rimosso il codice per aggiungere termini dinamicamente qui, perché così facendo veniva aggiunta una checkbox sopra il menu a discesa, il menu a discesa avrebbe bisogno di essere ri-renderizzato dinamicamente per mostrare il nuovo termine aggiunto ?>
<?php endif; ?>
<p><a href="<?php echo site_url(); ?>/wp-admin/edit-tags.php?taxonomy=<?php echo $tax_name ?>&post_type=YOUR_POST_TYPE">Aggiungi Nuovo</a></p>
</div>
<?php
}
L'unico problema che sto riscontrando (come indicato nei miei commenti nella funzione sopra), è che non posso utilizzare la funzionalità di aggiunta termini/categorie di WP nel meta box, perché di default aggiunge dinamicamente i nuovi termini come una checkbox sopra il mio menu a discesa. Per funzionare con un menu a discesa, il menu dovrebbe essere ri-renderizzato dopo l'aggiunta del nuovo termine. Qualcosa che sono sicuro di poter risolvere ma che lascerò per un altro giorno.

Il codice sopra presentava alcuni problemi per me, lasciami inserire il codice corretto che ha funzionato nel mio caso
'meta_box_cb' => 'drop_cat',
nella definizione della tua categoria, poi inserisci questo codice qui
ricordati di aggiungere
function drop_cat( $post, $box ) {
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'] );
?>
<div id="taxonomy-<?php echo $tax_name; ?>" class="categorydiv">
<?php //ho rimosso le tabs per la versione più recente qui ?>
<div id="<?php echo $tax_name; ?>-all">
<?php
$name = ( $tax_name == 'category' ) ? 'post_category' : 'tax_input[' . $tax_name . ']';
echo "<input type='hidden' name='{$name}[]' value='0' />"; // Permette l'invio di un set di termini vuoto. 0 è un Term ID non valido e verrà ignorato dai controlli empty().
?>
<ul id="<?php echo $tax_name; ?>checklist" data-wp-lists="list:<?php echo $tax_name; ?>" class="categorychecklist form-no-clear">
<?php //wp_terms_checklist( $post->ID, array( 'taxonomy' => $tax_name, 'popular_cats' => $popular_ids ) ); ?>
</ul>
<?php $term_obj = wp_get_object_terms($post->ID, $tax_name ); //_log($term_obj[0]->term_id)
?>
<?php wp_dropdown_categories( array( 'taxonomy' => $tax_name, 'option_none_value' => 0 ,'id'=>$term_obj[0]->term_id, 'value_field'=> 'slug' , 'hide_empty' => 0, 'name' => "{$name}[]", 'selected' => $term_obj[0]->slug, 'orderby' => 'name', 'hierarchical' => 0, 'show_option_none' => "Seleziona $tax_name" ) ); ?>
</div>
<?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) :
// ho rimosso il codice per aggiungere termini dinamicamente qui, perché così facendo veniva aggiunto un checkbox sopra il menu a discesa, che avrebbe bisogno di essere ri-renderizzato dinamicamente per mostrare il nuovo termine aggiunto ?>
<?php endif; ?>
<p><a href="<?php echo site_url(); ?>/wp-admin/edit-tags.php?taxonomy=<?php echo $tax_name ?>&post_type=IL_TUO_POST_TYPE">Aggiungi Nuovo</a></p>
</div>
<?php
}
