Отображение пользовательской таксономии в виде выпадающего меню на странице редактирования сообщений

Когда вы создаете пользовательскую таксономию, кажутся единственными опциями, чтобы отображать ее как тег (неиерархический) или категорию (иерархический). Есть ли способ показать их как выпадающее меню?

Я понимаю, что это нужно сделать с помощью add_meta_box() и фактически вручную добавить его, но я ищу встроенный способ (если он существует), чтобы сохранить много кода! Благодарю.

К сожалению, нет способа сделать это с помощью wp_register_taxonomy() . Когда вы регистрируете таксономию, метабокс по умолчанию – это либо флажки (иерархические), либо как облако (неиерархическое).

Единственный способ обойти это – снять регистрацию существующего метаболизма и добавить на его место новый. Тщательно подражая «обмену» по умолчанию – вам не придется обрабатывать данные самостоятельно, но пусть WordPress автоматически обрабатывает добавление / удаление терминов.

Подробные сведения о том, как это сделать, приводятся в этом ответе . Вы также можете найти этот полезный репозиторий GitHub (который теперь включает возможность создания условий «на лету» в новом метабоксе). Связанные ресурсы относятся к созданию метабокса с помощью радиобоксов, но его можно легко адаптировать для выпадающих меню.

Вы можете добавить новую таксономию с вашим собственным обменом, поскольку wp 3.8 by meta_box_cb

«drop_cat ()» – состоят из пересоздания исходной основной категории метабокс 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' />"; // Allows for an empty term set to be sent. 0 is an invalid Term ID and will be ignored by empty() checks. ?> <? $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' => '&mdash;' ) ); ?> </div> <?php } 

Ну вот:

 <select> <?php $tax_terms = get_terms('your_taxonomy_name', array('hide_empty' => '0')); foreach ( $tax_terms as $tax_term ): echo '<option value="'.$tax_term->name.'">'.$tax_term->name.'</option>'; endforeach; ?> </select> 

Удалите второй аргумент $ tax_terms, если вы не хотите отображать пустые термины.

Также используйте выбранные, если вы хотите сохранить выбранную опцию 🙂

У меня возникли трудности с кодом, представленным Alexufo, поэтому я переписал его на основе обновленной функции в WP 4.1.2. Вот моя обновленная функция drop_cat:

 //function below re-purposed from 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 //took out tabs for most recent here ?> <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' />"; // Allows for an empty term set to be sent. 0 is an invalid Term ID and will be ignored by empty() checks. ?> <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' => "Select $tax_name" ) ); ?> </div> <?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) : // removed code to add terms here dynamically, because doing so added a checkbox above the newly added drop menu, the drop menu would need to be re-rendered dynamically to display the newly added term ?> <?php endif; ?> <p><a href="<?php echo site_url(); ?>/wp-admin/edit-tags.php?taxonomy=<?php echo $tax_name ?>&post_type=YOUR_POST_TYPE">Add New</a></p> </div> <?php } 

Единственная проблема, с которой я столкнулся (как указано в моих комментариях в вышеприведенной функции), заключается в том, что я не могу использовать WP-ключ, добавляя функцию терминов / категорий в мета-поле, потому что по умолчанию он динамически добавляет новые термины в качестве флажка над моим выберите меню. Чтобы работать с меню выбора, меню нужно будет повторно отобразить после добавления нового термина. Что-то я уверен, что смогу понять, но уйду на другой день.