--- /dev/null
+<?php
+/**
+ * Taxonomy API: Walker_CategoryDropdown class
+ *
+ * @package WordPress
+ * @subpackage Template
+ * @since 4.4.0
+ */
+
+/**
+ * Core class used to create an HTML dropdown list of Categories.
+ *
+ * @since 2.1.0
+ *
+ * @see Walker
+ */
+class Walker_CategoryDropdown extends Walker {
+ /**
+ * @see Walker::$tree_type
+ * @since 2.1.0
+ * @var string
+ */
+ public $tree_type = 'category';
+
+ /**
+ * @see Walker::$db_fields
+ * @since 2.1.0
+ * @todo Decouple this
+ * @var array
+ */
+ public $db_fields = array ('parent' => 'parent', 'id' => 'term_id');
+
+ /**
+ * Start the element output.
+ *
+ * @see Walker::start_el()
+ * @since 2.1.0
+ *
+ * @param string $output Passed by reference. Used to append additional content.
+ * @param object $category Category data object.
+ * @param int $depth Depth of category. Used for padding.
+ * @param array $args Uses 'selected', 'show_count', and 'value_field' keys, if they exist.
+ * See {@see wp_dropdown_categories()}.
+ */
+ public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
+ $pad = str_repeat(' ', $depth * 3);
+
+ /** This filter is documented in wp-includes/category-template.php */
+ $cat_name = apply_filters( 'list_cats', $category->name, $category );
+
+ if ( isset( $args['value_field'] ) && isset( $category->{$args['value_field']} ) ) {
+ $value_field = $args['value_field'];
+ } else {
+ $value_field = 'term_id';
+ }
+
+ $output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $category->{$value_field} ) . "\"";
+
+ // Type-juggling causes false matches, so we force everything to a string.
+ if ( (string) $category->{$value_field} === (string) $args['selected'] )
+ $output .= ' selected="selected"';
+ $output .= '>';
+ $output .= $pad.$cat_name;
+ if ( $args['show_count'] )
+ $output .= ' ('. number_format_i18n( $category->count ) .')';
+ $output .= "</option>\n";
+ }
+}