Make WordPress Core

Changeset 46413


Ignore:
Timestamp:
10/06/2019 03:04:18 PM (5 years ago)
Author:
SergeyBiryukov
Message:

Menus: In Walker_Nav_Menu, Walker_Category, and Walker_Page, properly output link attributes having a legitimate "empty" value, for example an HTML data attribute with a value of zero (0).

Props nevma, AkSDvP, greenshady, SergeyBiryukov.
Fixes #47720.

Location:
trunk
Files:
2 added
5 edited

Legend:

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

    r46163 r46413  
    140140        $attributes = '';
    141141        foreach ( $atts as $attr => $value ) {
    142             if ( ! empty( $value ) ) {
     142            if ( is_scalar( $value ) && '' !== $value && false !== $value ) {
    143143                $value       = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
    144144                $attributes .= ' ' . $attr . '="' . $value . '"';
  • trunk/src/wp-includes/class-walker-nav-menu.php

    r45537 r46413  
    204204        $attributes = '';
    205205        foreach ( $atts as $attr => $value ) {
    206             if ( ! empty( $value ) ) {
     206            if ( is_scalar( $value ) && '' !== $value && false !== $value ) {
    207207                $value       = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
    208208                $attributes .= ' ' . $attr . '="' . $value . '"';
  • trunk/src/wp-includes/class-walker-page.php

    r45932 r46413  
    183183        $attributes = '';
    184184        foreach ( $atts as $attr => $value ) {
    185             if ( ! empty( $value ) ) {
     185            if ( is_scalar( $value ) && '' !== $value && false !== $value ) {
    186186                $value       = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
    187187                $attributes .= ' ' . $attr . '="' . $value . '"';
  • trunk/tests/phpunit/tests/menu/walker-nav-menu-edit.php

    r37953 r46413  
    55 * @group walker
    66 */
    7 class Tests_Walker_Nav_Menu_Edit extends WP_UnitTestCase {
     7class Tests_Menu_Walker_Nav_Menu_Edit extends WP_UnitTestCase {
    88    protected $_wp_nav_menu_max_depth;
    99
  • trunk/tests/phpunit/tests/menu/walker-nav-menu.php

    r45141 r46413  
    44 * @group walker
    55 */
    6 class Tests_Walker_Nav_Menu extends WP_UnitTestCase {
     6class Tests_Menu_Walker_Nav_Menu extends WP_UnitTestCase {
    77
    88    /**
     
    1919        parent::setUp();
    2020
    21         /** Walker_Nav_Menu_Edit class */
     21        /** Walker_Nav_Menu class */
    2222        require_once ABSPATH . 'wp-includes/class-walker-nav-menu.php';
    2323        $this->walker = new Walker_Nav_Menu();
     
    3838
    3939    /**
    40      * Tests when an items target it _blank, that rel="'noopener noreferrer" is added.
     40     * Tests when an item's target is _blank, that rel="noopener noreferrer" is added.
    4141     *
    42      * @ticket #43290
     42     * @ticket 43290
    4343     */
    4444    public function test_noopener_no_referrer_for_target_blank() {
     
    6767        $this->assertSame( "<li id=\"menu-item-{$post_id}\" class=\"menu-item-{$post_id}\"><a target=\"_blank\" rel=\"noopener noreferrer\">{$post_title}</a>", $expected );
    6868    }
     69
     70    /**
     71     * @ticket 47720
     72     *
     73     * @dataProvider data_start_el_with_empty_attributes
     74     */
     75    public function test_start_el_with_empty_attributes( $value, $expected ) {
     76        $output     = '';
     77        $post_id    = $this->factory->post->create();
     78        $post_title = get_the_title( $post_id );
     79
     80        $item = array(
     81            'ID'        => $post_id,
     82            'object_id' => $post_id,
     83            'title'     => $post_title,
     84            'target'    => '',
     85            'xfn'       => '',
     86            'current'   => false,
     87        );
     88
     89        $args = array(
     90            'before'      => '',
     91            'after'       => '',
     92            'link_before' => '',
     93            'link_after'  => '',
     94        );
     95
     96        add_filter(
     97            'nav_menu_link_attributes',
     98            function( $atts ) use ( $value ) {
     99                $atts['data-test'] = $value;
     100                return $atts;
     101            }
     102        );
     103
     104        $this->walker->start_el( $output, (object) $item, 0, (object) $args );
     105
     106        if ( '' !== $expected ) {
     107            $expected = sprintf( ' data-test="%s"', $expected );
     108        }
     109
     110        $this->assertSame( "<li id=\"menu-item-{$post_id}\" class=\"menu-item-{$post_id}\"><a{$expected}>{$post_title}</a>", $output );
     111    }
     112
     113    public function data_start_el_with_empty_attributes() {
     114        return array(
     115            array(
     116                '',
     117                '',
     118            ),
     119            array(
     120                0,
     121                '0',
     122            ),
     123            array(
     124                0.0,
     125                '0',
     126            ),
     127            array(
     128                '0',
     129                '0',
     130            ),
     131            array(
     132                null,
     133                '',
     134            ),
     135            array(
     136                false,
     137                '',
     138            ),
     139            array(
     140                true,
     141                '1',
     142            ),
     143            array(
     144                array(),
     145                '',
     146            ),
     147        );
     148    }
    69149}
Note: See TracChangeset for help on using the changeset viewer.