WordPress.org

Make WordPress Core

Ticket #38955: 38955.1.diff

File 38955.1.diff, 12.3 KB (added by westonruter, 5 years ago)

https://github.com/xwp/wordpress-develop/pull/206

  • src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php

    diff --git src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php
    index 802d67e..11b5cd6 100644
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    233233                        } else {
    234234                                $value = $post_value;
    235235                        }
     236                        if ( ! empty( $value ) && empty( $value['original_title'] ) ) {
     237                                $value['original_title'] = $this->get_original_title( (object) $value );
     238                        }
    236239                } elseif ( isset( $this->value ) ) {
    237240                        $value = $this->value;
    238241                } else {
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    260263                        $value = $this->value;
    261264                }
    262265
     266                if ( ! empty( $value ) && empty( $value['type_label'] ) ) {
     267                        $value['type_label'] = $this->get_type_label( (object) $value );
     268                }
     269
    263270                return $value;
    264271        }
    265272
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    273280         * @return string The original title.
    274281         */
    275282        protected function get_original_title( $item ) {
    276                 if ( empty( $item->object_id ) ) {
    277                         return '';
    278                 }
    279283                $original_title = '';
    280                 if ( 'post_type' === $item->type ) {
     284                if ( 'post_type' === $item->type && ! empty( $item->object_id ) ) {
    281285                        $original_object = get_post( $item->object_id );
    282286                        if ( $original_object ) {
    283287                                /** This filter is documented in wp-includes/post-template.php */
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    288292                                        $original_title = sprintf( __( '#%d (no title)' ), $original_object->ID );
    289293                                }
    290294                        }
    291                 } elseif ( 'taxonomy' === $item->type ) {
     295                } elseif ( 'taxonomy' === $item->type && ! empty( $item->object_id ) ) {
    292296                        $original_term_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
    293297                        if ( ! is_wp_error( $original_term_title ) ) {
    294298                                $original_title = $original_term_title;
    295299                        }
     300                } elseif ( 'post_type_archive' === $item->type ) {
     301                        $original_object = get_post_type_object( $item->object );
     302                        if ( $original_object ) {
     303                                $original_title = $original_object->labels->archives;
     304                        }
    296305                }
    297306                $original_title = html_entity_decode( $original_title, ENT_QUOTES, get_bloginfo( 'charset' ) );
    298307                return $original_title;
    299308        }
    300309
    301310        /**
     311         * Get type label.
     312         *
     313         * @since 4.7.0
     314         * @access protected
     315         *
     316         * @param object $item Nav menu item.
     317         * @returns string The type label.
     318         */
     319        protected function get_type_label( $item ) {
     320                if ( 'post_type' === $item->type ) {
     321                        $object = get_post_type_object( $item->object );
     322                        if ( $object ) {
     323                                $type_label = $object->labels->singular_name;
     324                        } else {
     325                                $type_label = $item->object;
     326                        }
     327                } elseif ( 'taxonomy' === $item->type ) {
     328                        $object = get_taxonomy( $item->object );
     329                        if ( $object ) {
     330                                $type_label = $object->labels->singular_name;
     331                        } else {
     332                                $type_label = $item->object;
     333                        }
     334                } elseif ( 'post_type_archive' === $item->type ) {
     335                        $type_label = __( 'Post Type Archive' );
     336                } else {
     337                        $type_label = __( 'Custom Link' );
     338                }
     339                return $type_label;
     340        }
     341
     342        /**
    302343         * Ensure that the value is fully populated with the necessary properties.
    303344         *
    304345         * Translates some properties added by wp_setup_nav_menu_item() and removes others.
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    584625                }
    585626
    586627                if ( ! isset( $post->type_label ) ) {
    587                         if ( 'post_type' === $post->type ) {
    588                                 $object = get_post_type_object( $post->object );
    589                                 if ( $object ) {
    590                                         $post->type_label = $object->labels->singular_name;
    591                                 } else {
    592                                         $post->type_label = $post->object;
    593                                 }
    594                         } elseif ( 'taxonomy' === $post->type ) {
    595                                 $object = get_taxonomy( $post->object );
    596                                 if ( $object ) {
    597                                         $post->type_label = $object->labels->singular_name;
    598                                 } else {
    599                                         $post->type_label = $post->object;
    600                                 }
    601                         } else {
    602                                 $post->type_label = __( 'Custom Link' );
    603                         }
     628                        $post->type_label = $this->get_type_label( $post );
    604629                }
    605630
    606631                // Ensure nav menu item URL is set according to linked object.
  • tests/phpunit/tests/customize/nav-menu-item-setting.php

    diff --git tests/phpunit/tests/customize/nav-menu-item-setting.php tests/phpunit/tests/customize/nav-menu-item-setting.php
    index 45aefb9..bcb3dc5 100644
    class Test_WP_Customize_Nav_Menu_Item_Setting extends WP_UnitTestCase { 
    811811
    812812                $setting->preview();
    813813
     814                $item_value = $setting->value();
     815                $this->assertArrayHasKey( 'type_label', $item_value );
    814816                $nav_menu_item = $setting->value_as_wp_post_nav_menu_item();
    815817                $this->assertEquals( 'Custom Link', $nav_menu_item->type_label );
     818                $this->assertEquals( $item_value['type_label'], $nav_menu_item->type_label );
    816819                add_filter( 'wp_setup_nav_menu_item', array( $this, 'filter_type_label' ) );
    817820                $nav_menu_item = $setting->value_as_wp_post_nav_menu_item();
    818821                $this->assertEquals( 'Custom Label', $nav_menu_item->type_label );
    class Test_WP_Customize_Nav_Menu_Item_Setting extends WP_UnitTestCase { 
    895898        }
    896899
    897900        /**
     901         * Test WP_Customize_Nav_Menu_Item_Setting::value_as_wp_post_nav_menu_item() for obtaining original title.
     902         *
     903         * @ticket 38945
     904         * @covers WP_Customize_Nav_Menu_Item_Setting::get_original_title()
     905         */
     906        function test_get_original_title() {
     907                $menu_id = wp_create_nav_menu( 'Menu' );
     908                register_post_type( 'press_release', array(
     909                        'has_archive' => true,
     910                        'labels' => array(
     911                                'name' => 'PRs',
     912                                'singular_name' => 'PR',
     913                                'archives' => 'All PRs',
     914                        ),
     915                ) );
     916                $original_post_title = 'The PR Post';
     917                $post_id = self::factory()->post->create( array( 'post_type' => 'press_release', 'post_title' => $original_post_title ) );
     918                $original_term_title = 'The Category Term';
     919                $term_id = self::factory()->term->create( array( 'taxonomy' => 'category', 'name' => $original_term_title ) );
     920
     921                // Post: existing nav menu item.
     922                $nav_menu_item_id = wp_update_nav_menu_item( $menu_id, 0, array(
     923                        'menu-item-object-id' => $post_id,
     924                        'menu-item-type' => 'post_type',
     925                        'menu-item-object' => 'press_release',
     926                        'menu-item-title' => '',
     927                        'menu-item-status' => 'publish',
     928                ) );
     929                $setting = new WP_Customize_Nav_Menu_Item_Setting(
     930                        $this->wp_customize,
     931                        'nav_menu_item[' . $nav_menu_item_id . ']'
     932                );
     933                $item_value = $setting->value();
     934                $this->assertEquals( $original_post_title, $item_value['original_title'] );
     935                $this->assertEquals( '', $item_value['title'] );
     936                $item = $setting->value_as_wp_post_nav_menu_item();
     937                $this->assertObjectHasAttribute( 'type_label', $item );
     938                $this->assertEquals( $original_post_title, $item->original_title );
     939                $this->assertEquals( $original_post_title, $item->title );
     940                $this->assertArrayHasKey( 'type_label', $item_value );
     941                $this->assertEquals( get_post_type_object( 'press_release' )->labels->singular_name, $item_value['type_label'] );
     942                $this->assertEquals( $item->type_label, $item_value['type_label'] );
     943
     944                // Post: staged nav menu item.
     945                $setting = new WP_Customize_Nav_Menu_Item_Setting(
     946                        $this->wp_customize,
     947                        'nav_menu_item[-1]'
     948                );
     949                $this->wp_customize->set_post_value( $setting->id, array(
     950                        'object_id' => $post_id,
     951                        'type' => 'post_type',
     952                        'object' => 'press_release',
     953                        'title' => '',
     954                        'status' => 'publish',
     955                ) );
     956                $setting->preview();
     957                $item_value = $setting->value();
     958                $this->assertEquals( $original_post_title, $item_value['original_title'] );
     959                $this->assertEquals( '', $item_value['title'] );
     960                $item = $setting->value_as_wp_post_nav_menu_item();
     961                $this->assertObjectHasAttribute( 'type_label', $item );
     962                $this->assertEquals( $original_post_title, $item->original_title );
     963                $this->assertEquals( $original_post_title, $item->title );
     964                $this->assertArrayHasKey( 'type_label', $item_value );
     965                $this->assertEquals( get_post_type_object( 'press_release' )->labels->singular_name, $item_value['type_label'] );
     966                $this->assertEquals( $item->type_label, $item_value['type_label'] );
     967
     968                // Term: existing nav menu item.
     969                $nav_menu_item_id = wp_update_nav_menu_item( $menu_id, 0, array(
     970                        'menu-item-object-id' => $term_id,
     971                        'menu-item-type' => 'taxonomy',
     972                        'menu-item-object' => 'category',
     973                        'menu-item-title' => '',
     974                        'menu-item-status' => 'publish',
     975                ) );
     976                $setting = new WP_Customize_Nav_Menu_Item_Setting(
     977                        $this->wp_customize,
     978                        'nav_menu_item[' . $nav_menu_item_id . ']'
     979                );
     980                $item_value = $setting->value();
     981                $this->assertEquals( $original_term_title, $item_value['original_title'] );
     982                $this->assertEquals( '', $item_value['title'] );
     983                $item = $setting->value_as_wp_post_nav_menu_item();
     984                $this->assertObjectHasAttribute( 'type_label', $item );
     985                $this->assertEquals( $original_term_title, $item->original_title );
     986                $this->assertEquals( $original_term_title, $item->title );
     987                $this->assertArrayHasKey( 'type_label', $item_value );
     988                $this->assertEquals( get_taxonomy( 'category' )->labels->singular_name, $item_value['type_label'] );
     989                $this->assertEquals( $item->type_label, $item_value['type_label'] );
     990
     991                // Term: staged nav menu item.
     992                $setting = new WP_Customize_Nav_Menu_Item_Setting(
     993                        $this->wp_customize,
     994                        'nav_menu_item[-2]'
     995                );
     996                $this->wp_customize->set_post_value( $setting->id, array(
     997                        'object_id' => $term_id,
     998                        'type' => 'taxonomy',
     999                        'object' => 'category',
     1000                        'title' => '',
     1001                        'status' => 'publish',
     1002                ) );
     1003                $setting->preview();
     1004                $item_value = $setting->value();
     1005                $this->assertEquals( $original_term_title, $item_value['original_title'] );
     1006                $this->assertEquals( '', $item_value['title'] );
     1007                $item = $setting->value_as_wp_post_nav_menu_item();
     1008                $this->assertObjectHasAttribute( 'type_label', $item );
     1009                $this->assertEquals( $original_term_title, $item->original_title );
     1010                $this->assertEquals( $original_term_title, $item->title );
     1011                $this->assertArrayHasKey( 'type_label', $item_value );
     1012                $this->assertEquals( get_taxonomy( 'category' )->labels->singular_name, $item_value['type_label'] );
     1013                $this->assertEquals( $item->type_label, $item_value['type_label'] );
     1014
     1015                // Post Type Archive: existing nav menu item.
     1016                $nav_menu_item_id = wp_update_nav_menu_item( $menu_id, 0, array(
     1017                        'menu-item-type' => 'post_type_archive',
     1018                        'menu-item-object' => 'press_release',
     1019                        'menu-item-title' => '',
     1020                        'menu-item-status' => 'publish',
     1021                ) );
     1022                $setting = new WP_Customize_Nav_Menu_Item_Setting(
     1023                        $this->wp_customize,
     1024                        'nav_menu_item[' . $nav_menu_item_id . ']'
     1025                );
     1026                $item_value = $setting->value();
     1027                $this->assertEquals( get_post_type_object( 'press_release' )->labels->archives, $item_value['original_title'] );
     1028                $this->assertEquals( '', $item_value['title'] );
     1029                $item = $setting->value_as_wp_post_nav_menu_item();
     1030                $this->assertObjectHasAttribute( 'type_label', $item );
     1031                $this->assertEquals( get_post_type_object( 'press_release' )->labels->archives, $item->original_title );
     1032                $this->assertEquals( get_post_type_object( 'press_release' )->labels->archives, $item->title );
     1033                $this->assertArrayHasKey( 'type_label', $item_value );
     1034                $this->assertEquals( __( 'Post Type Archive' ), $item_value['type_label'] );
     1035                $this->assertEquals( $item->type_label, $item_value['type_label'] );
     1036
     1037                // Post Type Archive: staged nav menu item.
     1038                $setting = new WP_Customize_Nav_Menu_Item_Setting(
     1039                        $this->wp_customize,
     1040                        'nav_menu_item[-3]'
     1041                );
     1042                $this->wp_customize->set_post_value( $setting->id, array(
     1043                        'type' => 'post_type_archive',
     1044                        'object' => 'press_release',
     1045                        'title' => '',
     1046                        'status' => 'publish',
     1047                ) );
     1048                $setting->preview();
     1049                $item_value = $setting->value();
     1050                $this->assertEquals( get_post_type_object( 'press_release' )->labels->archives, $item_value['original_title'] );
     1051                $this->assertEquals( '', $item_value['title'] );
     1052                $item = $setting->value_as_wp_post_nav_menu_item();
     1053                $this->assertObjectHasAttribute( 'type_label', $item );
     1054                $this->assertEquals( get_post_type_object( 'press_release' )->labels->archives, $item->original_title );
     1055                $this->assertEquals( get_post_type_object( 'press_release' )->labels->archives, $item->title );
     1056                $this->assertArrayHasKey( 'type_label', $item_value );
     1057                $this->assertEquals( __( 'Post Type Archive' ), $item_value['type_label'] );
     1058                $this->assertEquals( $item->type_label, $item_value['type_label'] );
     1059        }
     1060
     1061        /**
    8981062         * Test WP_Customize_Nav_Menu_Item_Setting::value_as_wp_post_nav_menu_item() where title is empty.
    8991063         *
    9001064         * @ticket 38015