WordPress.org

Make WordPress Core

Changeset 38618


Ignore:
Timestamp:
09/17/16 21:49:49 (8 months ago)
Author:
westonruter
Message:

Customize: Ensure nav menu items lacking a label use the title from the original object.

Use original title as placeholder for label and in control title. Prevent original title from overriding empty label in initial setting values.

Fixes #38015.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/js/customize-nav-menus.js

    r38436 r38618  
    13981398 
    13991399                var titleEl = control.container.find( '.menu-item-title' ), 
    1400                     titleText = item.title || api.Menus.data.l10n.untitled; 
     1400                    titleText = item.title || item.original_title || api.Menus.data.l10n.untitled; 
    14011401 
    14021402                if ( item._invalid ) { 
     
    14051405 
    14061406                // Don't update to an empty title. 
    1407                 if ( item.title ) { 
     1407                if ( item.title || item.original_title ) { 
    14081408                    titleEl 
    14091409                        .text( titleText ) 
  • trunk/src/wp-includes/class-wp-customize-nav-menus.php

    r38479 r38618  
    588588 
    589589                $value = (array) $item; 
     590                if ( empty( $value['post_title'] ) ) { 
     591                    $value['title'] = ''; 
     592                } 
     593 
    590594                $value['nav_menu_term_id'] = $menu_id; 
    591595                $this->manager->add_setting( new WP_Customize_Nav_Menu_Item_Setting( $this->manager, $menu_item_setting_id, array( 
  • trunk/src/wp-includes/customize/class-wp-customize-nav-menu-item-control.php

    r37153 r38618  
    7070                <span class="item-title" aria-hidden="true"> 
    7171                    <span class="spinner"></span> 
    72                     <span class="menu-item-title<# if ( ! data.title ) { #> no-title<# } #>">{{ data.title || wp.customize.Menus.data.l10n.untitled }}</span> 
     72                    <span class="menu-item-title<# if ( ! data.title && ! data.original_title ) { #> no-title<# } #>">{{ data.title || data.original_title || wp.customize.Menus.data.l10n.untitled }}</span> 
    7373                </span> 
    7474                <span class="item-controls"> 
     
    9797                <label for="edit-menu-item-title-{{ data.menu_item_id }}"> 
    9898                    <?php _e( 'Navigation Label' ); ?><br /> 
    99                     <input type="text" id="edit-menu-item-title-{{ data.menu_item_id }}" class="widefat edit-menu-item-title" name="menu-item-title" /> 
     99                    <input type="text" id="edit-menu-item-title-{{ data.menu_item_id }}" placeholder="{{ data.original_title }}" class="widefat edit-menu-item-title" name="menu-item-title" /> 
    100100                </label> 
    101101            </p> 
  • trunk/src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php

    r37539 r38618  
    234234                $value = $post_value; 
    235235            } 
    236         } else if ( isset( $this->value ) ) { 
     236        } elseif ( isset( $this->value ) ) { 
    237237            $value = $this->value; 
    238238        } else { 
     
    243243                $post = get_post( $this->post_id ); 
    244244                if ( $post && self::POST_TYPE === $post->post_type ) { 
     245                    $is_title_empty = empty( $post->post_title ); 
    245246                    $value = (array) wp_setup_nav_menu_item( $post ); 
     247                    if ( $is_title_empty ) { 
     248                        $value['title'] = ''; 
     249                    } 
    246250                } 
    247251            } 
     
    261265 
    262266    /** 
     267     * Get original title. 
     268     * 
     269     * @since 4.7.0 
     270     * 
     271     * @param object $item Nav menu item. 
     272     * @return string The original title. 
     273     */ 
     274    protected function get_original_title( $item ) { 
     275        if ( empty( $item->object_id ) ) { 
     276            return ''; 
     277        } 
     278        $original_title = ''; 
     279        if ( 'post_type' === $item->type ) { 
     280            $original_object = get_post( $item->object_id ); 
     281            if ( $original_object ) { 
     282                /** This filter is documented in wp-includes/post-template.php */ 
     283                $original_title = apply_filters( 'the_title', $original_object->post_title, $original_object->ID ); 
     284 
     285                if ( '' === $original_title ) { 
     286                    /* translators: %d: ID of a post */ 
     287                    $original_title = sprintf( __( '#%d (no title)' ), $original_object->ID ); 
     288                } 
     289            } 
     290        } elseif ( 'taxonomy' === $item->type ) { 
     291            $original_term_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' ); 
     292            if ( ! is_wp_error( $original_term_title ) ) { 
     293                $original_title = $original_term_title; 
     294            } 
     295        } 
     296        $original_title = html_entity_decode( $original_title, ENT_QUOTES, get_bloginfo( 'charset' ) ); 
     297        return $original_title; 
     298    } 
     299 
     300    /** 
    263301     * Ensure that the value is fully populated with the necessary properties. 
    264302     * 
     
    285323 
    286324        if ( ! isset( $this->value['original_title'] ) ) { 
    287             $original_title = ''; 
    288             if ( 'post_type' === $this->value['type'] ) { 
    289                 $original_title = get_the_title( $this->value['object_id'] ); 
    290             } elseif ( 'taxonomy' === $this->value['type'] ) { 
    291                 $original_title = get_term_field( 'name', $this->value['object_id'], $this->value['object'], 'raw' ); 
    292                 if ( is_wp_error( $original_title ) ) { 
    293                     $original_title = ''; 
    294                 } 
    295             } 
    296             $this->value['original_title'] = html_entity_decode( $original_title, ENT_QUOTES, get_bloginfo( 'charset' ) ); 
     325            $this->value['original_title'] = $this->get_original_title( (object) $this->value ); 
    297326        } 
    298327 
     
    535564        unset( $item->position ); 
    536565 
     566        if ( empty( $item->original_title ) ) { 
     567            $item->original_title = $this->get_original_title( $item ); 
     568        } 
     569        if ( empty( $item->title ) && ! empty( $item->original_title ) ) { 
     570            $item->title = $item->original_title; 
     571        } 
    537572        if ( $item->title ) { 
    538573            $item->post_title = $item->title; 
     
    555590                    $post->type_label = $post->object; 
    556591                } 
    557             } elseif ( 'taxonomy' == $post->type ) { 
     592            } elseif ( 'taxonomy' === $post->type ) { 
    558593                $object = get_taxonomy( $post->object ); 
    559594                if ( $object ) { 
  • trunk/tests/phpunit/tests/customize/nav-menu-item-setting.php

    r37405 r38618  
    186186 
    187187    /** 
     188     * Test value method with post without nav menu item title (label). 
     189     * 
     190     * @see WP_Customize_Nav_Menu_Item_Setting::value() 
     191     */ 
     192    function test_value_type_post_type_without_label() { 
     193        do_action( 'customize_register', $this->wp_customize ); 
     194 
     195        $original_title = 'Hello World'; 
     196        $post_id = self::factory()->post->create( array( 'post_title' => $original_title ) ); 
     197 
     198        $menu_id = wp_create_nav_menu( 'Menu' ); 
     199        $item_id = wp_update_nav_menu_item( $menu_id, 0, array( 
     200            'menu-item-type' => 'post_type', 
     201            'menu-item-object' => 'post', 
     202            'menu-item-object-id' => $post_id, 
     203            'menu-item-title' => '', 
     204            'menu-item-status' => 'publish', 
     205        ) ); 
     206 
     207        $setting_id = "nav_menu_item[$item_id]"; 
     208        $setting = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id ); 
     209 
     210        $value = $setting->value(); 
     211        $this->assertEquals( '', $value['title'] ); 
     212        $this->assertEquals( $original_title, $value['original_title'] ); 
     213    } 
     214 
     215    /** 
    188216     * Test value method with taxonomy. 
    189217     * 
     
    805833        $this->assertEquals( 'Attempted \o/ o&#8217;o markup', $nav_menu_item->description ); 
    806834    } 
     835 
     836    /** 
     837     * Test WP_Customize_Nav_Menu_Item_Setting::value_as_wp_post_nav_menu_item() where title is empty. 
     838     * 
     839     * @ticket 38015 
     840     * @see WP_Customize_Nav_Menu_Item_Setting::value_as_wp_post_nav_menu_item() 
     841     */ 
     842    function test_value_as_wp_post_nav_menu_item_with_empty_title() { 
     843        $original_title = 'The Original Title'; 
     844        $post_id = self::factory()->post->create( array( 'post_title' => $original_title ) ); 
     845 
     846        $setting = new WP_Customize_Nav_Menu_Item_Setting( 
     847            $this->wp_customize, 
     848            'nav_menu_item[123]' 
     849        ); 
     850 
     851        $post_value = array_merge( 
     852            $setting->default, 
     853            array( 
     854                'object_id'        => $post_id, 
     855                'object'           => 'post', 
     856                'type'             => 'post_type', 
     857                'status'           => 'publish', 
     858                'nav_menu_term_id' => 0, 
     859            ) 
     860        ); 
     861        $this->wp_customize->set_post_value( $setting->id, $post_value ); 
     862 
     863        $setting->preview(); 
     864 
     865        $nav_menu_item = $setting->value_as_wp_post_nav_menu_item(); 
     866        $this->assertEquals( $original_title, $nav_menu_item->title ); 
     867    } 
    807868} 
Note: See TracChangeset for help on using the changeset viewer.