WordPress.org

Make WordPress Core

Ticket #24731: multiple-select.patch

File multiple-select.patch, 2.8 KB (added by louisremi, 5 years ago)

add a 'multiple' option to wp_dropdown_categories and handle multiple selected options

  • wp-includes/category-template.php

     
    307307                'name' => 'cat', 'id' => '',
    308308                'class' => 'postform', 'depth' => 0,
    309309                'tab_index' => 0, 'taxonomy' => 'category',
    310                 'hide_if_empty' => false
     310                'hide_if_empty' => false,
     311                'multiple' => false
    311312        );
    312313
    313314        $defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0;
     
    324325                $r['pad_counts'] = true;
    325326        }
    326327
     328        // make sure selected is always an array
     329        if ( !is_array( $r['selected'] ) ) {
     330                $r['selected'] = array($r['selected']);
     331        }
     332
    327333        extract( $r );
    328334
    329335        $tab_index_attribute = '';
    330336        if ( (int) $tab_index > 0 )
    331337                $tab_index_attribute = " tabindex=\"$tab_index\"";
    332338
     339        $multiple_attribute = '';
     340        if ( $r['multiple'] ) {
     341                $multiple_attribute = 'multiple';
     342
     343        // if this isn't a multiple select, make sure only one value is selected
     344        } else {
     345                $r['selected'] = array_slice( $r['selected'], 0, 1 );
     346        }
     347
    333348        $categories = get_terms( $taxonomy, $r );
    334349        $name = esc_attr( $name );
    335350        $class = esc_attr( $class );
    336351        $id = $id ? esc_attr( $id ) : $name;
    337352
    338353        if ( ! $r['hide_if_empty'] || ! empty($categories) )
    339                 $output = "<select name='$name' id='$id' class='$class' $tab_index_attribute>\n";
     354                $output = "<select $multiple_attribute name='$name' id='$id' class='$class' $tab_index_attribute>\n";
    340355        else
    341356                $output = '';
    342357
     
    349364
    350365                if ( $show_option_all ) {
    351366                        $show_option_all = apply_filters( 'list_cats', $show_option_all );
    352                         $selected = ( '0' === strval($r['selected']) ) ? " selected='selected'" : '';
     367                        $selected = ( in_array( '0', $r['selected'], true) ) ? " selected='selected'" : '';
    353368                        $output .= "\t<option value='0'$selected>$show_option_all</option>\n";
    354369                }
    355370
    356371                if ( $show_option_none ) {
    357372                        $show_option_none = apply_filters( 'list_cats', $show_option_none );
    358                         $selected = ( '-1' === strval($r['selected']) ) ? " selected='selected'" : '';
     373                        $selected = ( in_array( '-1', $r['selected'], true) ) ? " selected='selected'" : '';
    359374                        $output .= "\t<option value='-1'$selected>$show_option_none</option>\n";
    360375                }
    361376
     
    370385        if ( ! $r['hide_if_empty'] || ! empty($categories) )
    371386                $output .= "</select>\n";
    372387
    373         $output = apply_filters( 'wp_dropdown_cats', $output );
     388        $output = apply_filters( 'wp_dropdown_cats', $output, $r );
    374389
    375390        if ( $echo )
    376391                echo $output;
     
    938953
    939954                $cat_name = apply_filters('list_cats', $category->name, $category);
    940955                $output .= "\t<option class=\"level-$depth\" value=\"".$category->term_id."\"";
    941                 if ( $category->term_id == $args['selected'] )
     956                if ( in_array( $category->term_id, $args['selected'] ) )
    942957                        $output .= ' selected="selected"';
    943958                $output .= '>';
    944959                $output .= $pad.$cat_name;