Afișarea unei taxonomii personalizate ca un dropdown în pagina de editare articole
Când creezi o taxonomie personalizată, aparent singurele opțiuni sunt să o afișezi ca etichetă (non-ierarhică) sau categorie (ierarhică). Există vreo modalitate de a o afișa ca un meniu dropdown?
Înțeleg că acest lucru poate fi făcut folosind add_meta_box()
și adăugând-o manual, dar caut o modalitate încorporată (dacă există), pentru a economisi mult cod! Mulțumesc.

Puteți adăuga o nouă taxonomie cu propriul metabox începând cu WordPress 3.8 folosind meta_box_cb
"drop_cat()" - reconstruiește metabox-ul original de categorie din nucleu 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 );
}
// Conectare la acțiunea 'init'
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' />"; // Permite trimiterea unui set de termeni gol. 0 este un ID de Termen invalid și va fi ignorat de verificările 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
}

Aceasta a funcționat bine pentru mine, dar a trebuit să fac o modificare în cod pentru 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' ); ?>

Uite codul:
<select>
<?php
$tax_terms = get_terms('numele_taxonomiei', array('hide_empty' => '0'));
foreach ( $tax_terms as $tax_term ):
echo '<option value="'.$tax_term->name.'">'.$tax_term->name.'</option>';
endforeach;
?>
</select>
Șterge al doilea argument al variabilei $tax_terms dacă nu dorești să afișezi termenii goi.
De asemenea, folosește selected dacă vrei să salvezi opțiunea selectată :)

Din păcate, nu există nicio modalitate de a face acest lucru cu wp_register_taxonomy()
. Atunci când înregistrezi o taxonomie, caseta metabox implicită este fie casete de bifat (ierarhică), fie ca un nor (neierarhică).
Singura soluție este să anulezi înregistrarea metabox-ului existent și să adaugi unul nou în locul lui. Prin imitarea atentă a metabox-ului 'implicit' – nu va trebui să procesezi datele manual, ci vei lăsa WordPress să se ocupe automat de adăugarea/ștergerea termenilor.
Detaliile despre cum să faci acest lucru sunt prezentate în acest răspuns. De asemenea, s-ar putea să găsești util acest depozit GitHub (care acum include posibilitatea de a crea termeni în timp real în noul metabox). Resursele menționate se referă la crearea unui metabox cu butoane radio, dar ar putea fi ușor adaptat pentru meniuri drop-down.

Aveam dificultăți cu codul furnizat de Alexufo, așa că l-am rescris pe baza funcției actualizate din WP 4.1.2. Iată funcția mea actualizată drop_cat:
// funcția de mai jos a fost adaptată din 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 // am eliminat filele pentru cea mai recentă variantă aici ?>
<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' />"; // Permite trimiterea unui set de termeni gol. 0 este un ID de Termen invalid și va fi ignorat de verificările 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' => "Selectează $tax_name" ) ); ?>
</div>
<?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) :
// am eliminat codul pentru adăugarea dinamică de termeni aici, deoarece acest lucru adăuga o căsuță de selectare deasupra noului meniu drop-down, meniul drop-down ar trebui să fie re-randat dinamic pentru a afișa noul termen adăugat ?>
<?php endif; ?>
<p><a href="<?php echo site_url(); ?>/wp-admin/edit-tags.php?taxonomy=<?php echo $tax_name ?>&post_type=YOUR_POST_TYPE">Adaugă nou</a></p>
</div>
<?php
}
Singura problemă pe care o am (așa cum am indicat în comentariile din funcția de mai sus), este că nu pot folosi funcționalitatea de bază din WP pentru adăugarea de termeni/categorii în căsuța meta, deoarece implicit adaugă noii termeni ca o căsuță de selectare deasupra meniului meu de selectare. Pentru a funcționa cu un meniu de selectare, meniul va trebui să fie re-randat după adăugarea noului termen. Ceva ce sunt sigur că aș putea rezolva, dar voi lăsa pentru o altă zi.

Codul de mai sus avea câteva probleme la mine, permiteți-mi să pun codul corect care a funcționat pentru mine
'meta_box_cb' => 'drop_cat',
definiția categoriei dumneavoastră, apoi puneți acest cod aici
nu uitați să adăugați
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 //am eliminat tab-urile pentru cele mai recente aici ?>
<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' />"; // Permite trimiterea unui set de termeni gol. 0 este un ID de Termen invalid și va fi ignorat de verificările 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' => "Selectează $tax_name" ) ); ?>
</div>
<?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) :
// am eliminat codul pentru adăugarea dinamică a termenilor aici, deoarece făcând asta adăuga o căsuță de selectare deasupra meniului drop-down nou adăugat, meniul drop-down ar trebui să fie re-randat dinamic pentru a afișa noul termen adăugat ?>
<?php endif; ?>
<p><a href="<?php echo site_url(); ?>/wp-admin/edit-tags.php?taxonomy=<?php echo $tax_name ?>&post_type=YOUR_POST_TYPE">Adaugă nou</a></p>
</div>
<?php
}
