Make WordPress Core

Changeset 46413


Ignore:
Timestamp:
10/06/2019 03:04:18 PM (7 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.