Make WordPress Core


Ignore:
Timestamp:
09/08/2015 07:03:17 PM (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 ===.

Merges [33681] to the 4.3 branch.

Fixes #33452 for 4.3.1.

Location:
branches/4.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/4.3

  • branches/4.3/src/wp-includes/category-template.php

    r33318 r33949  
    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.