Make WordPress Core


Ignore:
Timestamp:
08/21/2015 01:10:34 AM (9 years ago)
Author:
boonebgorges
Message:

In Walker_CategoryDropdown::start_el(), cast values to strings before deciding whether to append 'selected' attribute.

As of [32484], wp_dropdown_categories() uses the $value_field value to
decide whether a given <option> should be 'selected'. However, $value_field
can refer to a value that is a string, such as a category's slug. This causes
problems when doing a loose comparison (==) with the value of the 'selected'
parameter, which defaults to 0, because when doing a loose comparison
between an integer and a string, PHP will cast the string to an integer. This
creates false matches, resulting in <option> elements getting a 'selected'
attribute incorrectly.

We address the issue by casting the comparison values to strings, and then
using the strict comparison operator ===.

Fixes #33452 for trunk.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/category-template.php

    r33318 r33681  
    12081208        $output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $category->{$value_field} ) . "\"";
    12091209
    1210         if ( $category->{$value_field} == $args['selected'] )
     1210        // Type-juggling causes false matches, so we force everything to a string.
     1211        if ( (string) $category->{$value_field} === (string) $args['selected'] )
    12111212            $output .= ' selected="selected"';
    12121213        $output .= '>';
Note: See TracChangeset for help on using the changeset viewer.