Make WordPress Core

Ticket #38122: 38122.0.diff

File 38122.0.diff, 8.1 KB (added by westonruter, 7 years ago)
  • src/wp-admin/js/customize-nav-menus.js

    diff --git src/wp-admin/js/customize-nav-menus.js src/wp-admin/js/customize-nav-menus.js
    index c51cff3..5e4e5f9 100644
     
    302302
    303303                        $section.addClass( 'loading' );
    304304                        self.loading = true;
    305                         params = {
     305
     306                        params = api.previewer.query( { excludeCustomizedSaved: true } );
     307                        _.extend( params, {
    306308                                'customize-menus-nonce': api.settings.nonce['customize-menus'],
    307309                                'wp_customize': 'on',
    308310                                'search': self.searchTerm,
    309311                                'page': page
    310                         };
     312                        } );
    311313
    312314                        self.currentRequest = wp.ajax.post( 'search-available-menu-items-customizer', params );
    313315
     
    378380                 * @returns {void}
    379381                 */
    380382                loadItems: function( itemTypes, deprecated ) {
    381                         var self = this, _itemTypes, requestItemTypes = [], request, itemTemplate, availableMenuItemContainers = {};
     383                        var self = this, _itemTypes, requestItemTypes = [], params, request, itemTemplate, availableMenuItemContainers = {};
    382384                        itemTemplate = wp.template( 'available-menu-item' );
    383385
    384386                        if ( _.isString( itemTypes ) && _.isString( deprecated ) ) {
     
    408410                        }
    409411
    410412                        self.loading = true;
    411                         request = wp.ajax.post( 'load-available-menu-items-customizer', {
     413
     414                        params = api.previewer.query( { excludeCustomizedSaved: true } );
     415                        _.extend( params, {
    412416                                'customize-menus-nonce': api.settings.nonce['customize-menus'],
    413417                                'wp_customize': 'on',
    414418                                'item_types': requestItemTypes
    415419                        } );
    416420
     421                        request = wp.ajax.post( 'load-available-menu-items-customizer', params );
     422
    417423                        request.done(function( data ) {
    418424                                var typeInner;
    419425                                _.each( data.items, function( typeItems, name ) {
  • src/wp-includes/class-wp-customize-nav-menus.php

    diff --git src/wp-includes/class-wp-customize-nav-menus.php src/wp-includes/class-wp-customize-nav-menus.php
    index 89b5b02..37a8de8 100644
    final class WP_Customize_Nav_Menus { 
    174174                                );
    175175                        }
    176176
    177                         $posts = get_posts( array(
     177                        // Prepend posts with nav_menus_created_posts on first page.
     178                        $posts = array();
     179                        if ( 0 === $page && $this->manager->get_setting( 'nav_menus_created_posts' ) ) {
     180                                foreach ( $this->manager->get_setting( 'nav_menus_created_posts' )->value() as $post_id ) {
     181                                        $auto_draft_post = get_post( $post_id );
     182                                        if ( $post_type->name === $auto_draft_post->post_type ) {
     183                                                $posts[] = $auto_draft_post;
     184                                        }
     185                                }
     186                        }
     187
     188                        $posts = array_merge( $posts, get_posts( array(
    178189                                'numberposts' => 10,
    179190                                'offset'      => 10 * $page,
    180191                                'orderby'     => 'date',
    181192                                'order'       => 'DESC',
    182193                                'post_type'   => $object,
    183                         ) );
     194                        ) ) );
     195
    184196                        foreach ( $posts as $post ) {
    185197                                $post_title = $post->post_title;
    186198                                if ( '' === $post_title ) {
    final class WP_Customize_Nav_Menus { 
    305317                        $query['s'] = $args['s'];
    306318                }
    307319
     320                $posts = array();
     321
     322                // Prepend list of posts with nav_menus_created_posts search results on first page.
     323                $nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' );
     324                if ( 1 === $args['pagenum'] && $nav_menus_created_posts_setting && count( $nav_menus_created_posts_setting ) > 0 ) {
     325                        $stub_post_query = new WP_Query( array_merge(
     326                                $query,
     327                                array(
     328                                        'post_status' => 'auto-draft',
     329                                        'post__in' => $nav_menus_created_posts_setting->value(),
     330                                        'posts_per_page' => -1,
     331                                )
     332                        ) );
     333                        $posts = array_merge( $posts, $stub_post_query->posts );
     334                }
     335
    308336                // Query posts.
    309337                $get_posts = new WP_Query( $query );
    310 
    311                 // Check if any posts were found.
    312                 if ( $get_posts->post_count ) {
    313                         foreach ( $get_posts->posts as $post ) {
    314                                 $post_title = $post->post_title;
    315                                 if ( '' === $post_title ) {
    316                                         /* translators: %d: ID of a post */
    317                                         $post_title = sprintf( __( '#%d (no title)' ), $post->ID );
    318                                 }
    319                                 $items[] = array(
    320                                         'id'         => 'post-' . $post->ID,
    321                                         'title'      => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ),
    322                                         'type'       => 'post_type',
    323                                         'type_label' => $post_type_objects[ $post->post_type ]->labels->singular_name,
    324                                         'object'     => $post->post_type,
    325                                         'object_id'  => intval( $post->ID ),
    326                                         'url'        => get_permalink( intval( $post->ID ) ),
    327                                 );
     338                $posts = array_merge( $posts, $get_posts->posts );
     339
     340                // Create items for posts.
     341                foreach ( $posts as $post ) {
     342                        $post_title = $post->post_title;
     343                        if ( '' === $post_title ) {
     344                                /* translators: %d: ID of a post */
     345                                $post_title = sprintf( __( '#%d (no title)' ), $post->ID );
    328346                        }
     347                        $items[] = array(
     348                                'id'         => 'post-' . $post->ID,
     349                                'title'      => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ),
     350                                'type'       => 'post_type',
     351                                'type_label' => $post_type_objects[ $post->post_type ]->labels->singular_name,
     352                                'object'     => $post->post_type,
     353                                'object_id'  => intval( $post->ID ),
     354                                'url'        => get_permalink( intval( $post->ID ) ),
     355                        );
    329356                }
    330357
    331358                // Query taxonomy terms.
  • tests/phpunit/tests/ajax/CustomizeMenus.php

    diff --git tests/phpunit/tests/ajax/CustomizeMenus.php tests/phpunit/tests/ajax/CustomizeMenus.php
    index 5013701..fef7831 100644
    class Tests_Ajax_CustomizeMenus extends WP_Ajax_UnitTestCase { 
    322322         * @param array $post_args POST args.
    323323         */
    324324        function test2_ajax_load_available_items_structure( $post_args ) {
     325                do_action( 'customize_register', $this->wp_customize );
    325326
    326327                $expected_keys = array(
    327328                        'id',
    class Tests_Ajax_CustomizeMenus extends WP_Ajax_UnitTestCase { 
    336337                // Create some terms and pages.
    337338                self::factory()->term->create_many( 5 );
    338339                self::factory()->post->create_many( 5, array( 'post_type' => 'page' ) );
     340                $auto_draft_post = $this->wp_customize->nav_menus->insert_auto_draft_post( array( 'post_title' => 'Test Auto Draft', 'post_type' => 'post' ) );
     341                $this->wp_customize->set_post_value( 'nav_menus_created_posts', array( $auto_draft_post->ID ) );
     342                $this->wp_customize->get_setting( 'nav_menus_created_posts' )->preview();
    339343
    340344                $_POST = array_merge( array(
    341345                        'action'                => 'load-available-menu-items-customizer',
    class Tests_Ajax_CustomizeMenus extends WP_Ajax_UnitTestCase { 
    371375                                        }
    372376                                }
    373377                        }
     378                } elseif ( 'post' === $test_item['object'] ) {
     379                        $item_ids = wp_list_pluck( $response['data']['items']['post_type:post'], 'id' );
     380                        $this->assertContains( 'post-' . $auto_draft_post->ID, $item_ids );
    374381                }
    375382        }
    376383
    class Tests_Ajax_CustomizeMenus extends WP_Ajax_UnitTestCase { 
    497504         * @param array $expected_results Expected results.
    498505         */
    499506        function test_ajax_search_available_items_results( $post_args, $expected_results ) {
     507                do_action( 'customize_register', $this->wp_customize );
    500508
    501509                self::factory()->post->create_many( 5, array( 'post_title' => 'Test Post' ) );
     510                $included_auto_draft_post = $this->wp_customize->nav_menus->insert_auto_draft_post( array( 'post_title' => 'Test Included Auto Draft', 'post_type' => 'post' ) );
     511                $excluded_auto_draft_post = $this->wp_customize->nav_menus->insert_auto_draft_post( array( 'post_title' => 'Excluded Auto Draft', 'post_type' => 'post' ) );
     512                $this->wp_customize->set_post_value( 'nav_menus_created_posts', array( $included_auto_draft_post->ID, $excluded_auto_draft_post->ID ) );
     513                $this->wp_customize->get_setting( 'nav_menus_created_posts' )->preview();
    502514
    503515                $_POST = array_merge( array(
    504516                        'action'                => 'search-available-menu-items-customizer',
    class Tests_Ajax_CustomizeMenus extends WP_Ajax_UnitTestCase { 
    511523
    512524                if ( isset( $post_args['search'] ) && 'test' === $post_args['search'] ) {
    513525                        $this->assertsame( true, $response['success'] );
    514                         $this->assertSame( 5, count( $response['data']['items'] ) );
     526                        $this->assertSame( 6, count( $response['data']['items'] ) );
     527                        $item_ids = wp_list_pluck( $response['data']['items'], 'id' );
     528                        $this->assertContains( 'post-' . $included_auto_draft_post->ID, $item_ids );
     529                        $this->assertNotContains( 'post-' . $excluded_auto_draft_post->ID, $item_ids );
    515530                } else {
    516531                        $this->assertSame( $expected_results, $response );
    517532                }
    518 
    519533        }
    520534
    521535        /**