WordPress.org

Make WordPress Core

Ticket #34923: 34923.6.diff

File 34923.6.diff, 21.5 KB (added by westonruter, 22 months ago)

PR: https://github.com/xwp/wordpress-develop/pull/152 Changes: https://github.com/xwp/wordpress-develop/compare/1722c4d...5bb985e

  • src/wp-admin/css/customize-nav-menus.css

    diff --git src/wp-admin/css/customize-nav-menus.css src/wp-admin/css/customize-nav-menus.css
    index afe0cbc..ff5c69a 100644
     
    6161        text-align: right;
    6262}
    6363
     64.customize-control-nav_menu_item.has-notifications .menu-item-handle {
     65        border-left: 4px solid #00a0d2;
     66}
     67
    6468.wp-customizer .menu-item-settings {
    6569        max-width: 100%;
    6670        overflow: hidden;
     
    497501        color: #23282d;
    498502}
    499503
    500 #available-menu-items .accordion-section-content {
     504#available-menu-items .available-menu-items-list {
    501505        overflow-y: auto;
    502506        max-height: 200px; /* This gets set in JS to fit the screen size, and based on # of sections. */
    503507        background: transparent;
     
    534538}
    535539
    536540#available-menu-items .accordion-section-content {
    537         padding: 1px 15px 15px 15px;
    538         margin: 0;
    539541        max-height: 290px;
     542        margin: 0;
     543        padding: 0;
     544        position: relative;
     545        background: transparent;
     546}
     547
     548#available-menu-items .accordion-section-content .available-menu-items-list {
     549        margin: 0 0 45px 0;
     550        padding: 1px 15px 15px 15px;
     551}
     552
     553#available-menu-items .accordion-section-content .available-menu-items-list:only-child { /* Types that do not support new items for the current user */
     554        margin-bottom: 0;
     555}
     556
     557#new-custom-menu-item .accordion-section-content {
     558        padding: 0 15px 15px 15px;
     559}
     560
     561#available-menu-items .accordion-section-content .new-content-item {
     562        width: calc(100% - 30px);
     563        padding: 8px 15px;
     564        position: absolute;
     565        bottom: 0;
     566        z-index: 10;
     567        background: #eee;
     568        display: flex;
     569}
     570
     571#available-menu-items .new-content-item .create-item-input {
     572        flex-grow: 10;
     573        margin-left: 5px;
     574}
     575#available-menu-items .new-content-item .add-content {
     576        padding-left: 6px;
     577        flex-grow: 1;
     578}
     579
     580#available-menu-items .new-content-item .add-content:before {
     581        content: "\f543";
     582        font: 20px/16px dashicons;
     583        position: relative;
     584        display: inline-block;
     585        top: 5px;
     586        left: -2px;
    540587}
    541588
    542589#available-menu-items .menu-item-tpl {
  • 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 25495fe..5bdda8b 100644
     
    8080        });
    8181        api.Menus.availableMenuItems = new api.Menus.AvailableItemCollection( api.Menus.data.availableMenuItems );
    8282
     83        api.Menus.insertedAutoDrafts = [];
     84
     85        /**
     86         * Insert a new `auto-draft` post.
     87         *
     88         * @param {object} params - Parameters for the draft post to create.
     89         * @param {string} params.post_type - Post type to add.
     90         * @param {number} params.title - Post title to use.
     91         * @return {jQuery.promise} Promise resolved with the added post.
     92         */
     93        api.Menus.insertAutoDraftPost = function insertAutoDraftPost( params ) {
     94                var request, deferred = $.Deferred();
     95
     96                request = wp.ajax.post( 'customize-nav-menus-insert-auto-draft', {
     97                        'customize-menus-nonce': api.settings.nonce['customize-menus'],
     98                        'wp_customize': 'on',
     99                        'params': params
     100                } );
     101
     102                request.done( function( response ) {
     103                        if ( response.postId ) {
     104                                deferred.resolve( response );
     105                                api.Menus.insertedAutoDrafts.push( response.postId );
     106                                api( 'nav_menus_created_posts' ).set( _.clone( api.Menus.insertedAutoDrafts ) );
     107                        }
     108                } );
     109
     110                request.fail( function( response ) {
     111                        var error = response || '';
     112
     113                        if ( 'undefined' !== typeof response.message ) {
     114                                error = response.message;
     115                        }
     116
     117                        console.error( error );
     118                        deferred.rejectWith( error );
     119                } );
     120
     121                return deferred.promise();
     122        };
     123
    83124        /**
    84125         * wp.customize.Menus.AvailableMenuItemsPanelView
    85126         *
     
    100141                        'click .menu-item-tpl': '_submit',
    101142                        'click #custom-menu-item-submit': '_submitLink',
    102143                        'keypress #custom-menu-item-name': '_submitLink',
     144                        'click .new-content-item .add-content': '_submitNew',
     145                        'keypress .create-item-input': '_submitNew',
    103146                        'keydown': 'keyboardAccessible'
    104147                },
    105148
     
    115158                pages: {},
    116159                sectionContent: '',
    117160                loading: false,
     161                addingNew: false,
    118162
    119163                initialize: function() {
    120164                        var self = this;
     
    124168                        }
    125169
    126170                        this.$search = $( '#menu-items-search' );
    127                         this.sectionContent = this.$el.find( '.accordion-section-content' );
     171                        this.sectionContent = this.$el.find( '.available-menu-items-list' );
    128172
    129173                        this.debounceSearch = _.debounce( self.search, 500 );
    130174
     
    160204
    161205                        // Load more items.
    162206                        this.sectionContent.scroll( function() {
    163                                 var totalHeight = self.$el.find( '.accordion-section.open .accordion-section-content' ).prop( 'scrollHeight' ),
     207                                var totalHeight = self.$el.find( '.accordion-section.open .available-menu-items-list' ).prop( 'scrollHeight' ),
    164208                                        visibleHeight = self.$el.find( '.accordion-section.open' ).height();
    165209
    166210                                if ( ! self.loading && $( this ).scrollTop() > 3 / 4 * totalHeight - visibleHeight ) {
     
    337381                                }
    338382                                items = new api.Menus.AvailableItemCollection( items ); // @todo Why is this collection created and then thrown away?
    339383                                self.collection.add( items.models );
    340                                 typeInner = availableMenuItemContainer.find( '.accordion-section-content' );
     384                                typeInner = availableMenuItemContainer.find( '.available-menu-items-list' );
    341385                                items.each(function( menuItem ) {
    342386                                        typeInner.append( itemTemplate( menuItem.attributes ) );
    343387                                });
     
    356400
    357401                // Adjust the height of each section of items to fit the screen.
    358402                itemSectionHeight: function() {
    359                         var sections, totalHeight, accordionHeight, diff;
     403                        var sections, lists, totalHeight, accordionHeight, diff, totalWidth, button, buttonWidth;
    360404                        totalHeight = window.innerHeight;
    361405                        sections = this.$el.find( '.accordion-section:not( #available-menu-items-search ) .accordion-section-content' );
    362                         accordionHeight =  46 * ( 2 + sections.length ) - 13; // Magic numbers.
     406                        lists = this.$el.find( '.accordion-section:not( #available-menu-items-search ) .available-menu-items-list:not(":only-child")' );
     407                        accordionHeight =  46 * ( 1 + sections.length ) + 14; // Magic numbers.
    363408                        diff = totalHeight - accordionHeight;
    364409                        if ( 120 < diff && 290 > diff ) {
    365410                                sections.css( 'max-height', diff );
     411                                lists.css( 'max-height', ( diff - 60 ) );
    366412                        }
    367413                },
    368414
     
    456502                        itemName.val( '' );
    457503                },
    458504
     505                // Submit handler for keypress (enter) on field and click on button.
     506                _submitNew: function( event ) {
     507                        var container;
     508
     509                        // Only proceed with keypress if it is Enter.
     510                        if ( 'keypress' === event.type && 13 !== event.which ) {
     511                                return;
     512                        }
     513
     514                        if ( this.addingNew ) {
     515                                return;
     516                        }
     517
     518                        container = $( event.target ).closest( '.accordion-section' );
     519
     520                        this.submitNew( container );
     521                },
     522
     523                // Creates a new object and adds an associated menu item to the menu.
     524                submitNew: function( container ) {
     525                        var panel = this,
     526                                itemName = container.find( '.create-item-input' ),
     527                                title = itemName.val(),
     528                                dataContainer = container.find( '.available-menu-items-list' ),
     529                                itemType = dataContainer.data( 'type' ),
     530                                itemObject = dataContainer.data( 'object' ),
     531                                itemTypeLabel = dataContainer.data( 'type_label' ),
     532                                promise;
     533
     534                        if ( ! this.currentMenuControl ) {
     535                                return;
     536                        }
     537
     538                        if ( '' === itemName.val() ) {
     539                                itemName.addClass( 'invalid' );
     540                                return;
     541                        } else {
     542                                container.find( '.accordion-section-title' ).addClass( 'loading' );
     543                        }
     544
     545                        // Only posts are supported currently.
     546                        if ( 'post_type' !== itemType ) {
     547                                return;
     548                        }
     549
     550                        panel.addingNew = true;
     551                        itemName.attr( 'disabled', 'disabled' );
     552                        promise = api.Menus.insertAutoDraftPost( {
     553                                post_title: title,
     554                                post_type: itemObject,
     555                                post_status: 'publish'
     556                        } );
     557                        promise.done( function( data ) {
     558                                var menuItem = {
     559                                        'title': itemName.val(),
     560                                        'type': itemType,
     561                                        'type_label': itemTypeLabel,
     562                                        'object': itemObject,
     563                                        'object_id': data.postId,
     564                                        'url': data.url
     565                                }, availableItems, $content, itemTemplate;
     566
     567                                // Add new item to menu.
     568                                panel.currentMenuControl.addItemToMenu( menuItem );
     569
     570                                // Add the new item to the list of available items.
     571                                menuItem.id = 'post-' + data.postId; // `id` is used for available menu item Backbone models.
     572                                availableItems = new api.Menus.AvailableItemCollection( [ menuItem ] );
     573                                api.Menus.availableMenuItemsPanel.collection.add( availableItems.models );
     574                                $content = container.find( '.available-menu-items-list' ),
     575                                itemTemplate = wp.template( 'available-menu-item' );
     576                                $content.prepend( itemTemplate( menuItem ) );
     577                                $content.scrollTop();
     578
     579                                // Reset the create content form.
     580                                itemName.val( '' )
     581                                        .removeAttr( 'disabled' )
     582                                        .focus();
     583                                panel.addingNew = false;
     584                                container.find( '.accordion-section-title' ).removeClass( 'loading' );
     585                        } );
     586                },
     587
    459588                // Opens the panel.
    460589                open: function( menuControl ) {
    461590                        this.currentMenuControl = menuControl;
     
    25452674                        if ( data.nav_menu_updates || data.nav_menu_item_updates ) {
    25462675                                api.Menus.applySavedData( data );
    25472676                        }
     2677
     2678                        // Reset list of inserted auto draft post IDs.
     2679                        api.Menus.insertedAutoDrafts = [];
    25482680                } );
    25492681
    25502682                // Open and focus menu control.
  • src/wp-includes/class-wp-customize-manager.php

    diff --git src/wp-includes/class-wp-customize-manager.php src/wp-includes/class-wp-customize-manager.php
    index 5ee3b6d..6c96995 100644
    final class WP_Customize_Manager { 
    15351535                <script type="text/html" id="tmpl-customize-control-notifications">
    15361536                        <ul>
    15371537                                <# _.each( data.notifications, function( notification ) { #>
    1538                                         <li class="notice notice-{{ notification.type || 'info' }} {{ data.altNotice ? 'notice-alt' : '' }}" data-code="{{ notification.code }}" data-type="{{ notification.type }}">{{ notification.message || notification.code }}</li>
     1538                                        <li class="notice notice-{{ notification.type || 'info' }} {{ data.altNotice ? 'notice-alt' : '' }}" data-code="{{ notification.code }}" data-type="{{ notification.type }}">{{{ notification.message || notification.code }}}</li>
    15391539                                <# } ); #>
    15401540                        </ul>
    15411541                </script>
  • 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 f9832a6..218bc4c 100644
    final class WP_Customize_Nav_Menus { 
    5656                add_filter( 'customize_refresh_nonces', array( $this, 'filter_nonces' ) );
    5757                add_action( 'wp_ajax_load-available-menu-items-customizer', array( $this, 'ajax_load_available_items' ) );
    5858                add_action( 'wp_ajax_search-available-menu-items-customizer', array( $this, 'ajax_search_available_items' ) );
     59                add_action( 'wp_ajax_customize-nav-menus-insert-auto-draft', array( $this, 'ajax_insert_auto_draft_post' ) );
    5960                add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
    60 
    61                 // Needs to run after core Navigation section is set up.
    6261                add_action( 'customize_register', array( $this, 'customize_register' ), 11 );
    63 
    6462                add_filter( 'customize_dynamic_setting_args', array( $this, 'filter_dynamic_setting_args' ), 10, 2 );
    6563                add_filter( 'customize_dynamic_setting_class', array( $this, 'filter_dynamic_setting_class' ), 10, 3 );
    6664                add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_templates' ) );
    6765                add_action( 'customize_controls_print_footer_scripts', array( $this, 'available_items_template' ) );
    6866                add_action( 'customize_preview_init', array( $this, 'customize_preview_init' ) );
     67                add_action( 'customize_preview_init', array( $this, 'make_auto_draft_status_previewable' ) );
     68                add_action( 'customize_save_nav_menus_created_posts', array( $this, 'publish_auto_draft_posts' ) );
    6969
    7070                // Selective Refresh partials.
    7171                add_filter( 'customize_dynamic_partial_args', array( $this, 'customize_dynamic_partial_args' ), 10, 2 );
    final class WP_Customize_Nav_Menus { 
    356356        public function enqueue_scripts() {
    357357                wp_enqueue_style( 'customize-nav-menus' );
    358358                wp_enqueue_script( 'customize-nav-menus' );
     359                wp_enqueue_script( 'customize-posts' );
    359360
    360361                $temp_nav_menu_setting      = new WP_Customize_Nav_Menu_Setting( $this->manager, 'nav_menu[-1]' );
    361362                $temp_nav_menu_item_setting = new WP_Customize_Nav_Menu_Item_Setting( $this->manager, 'nav_menu_item[-1]' );
    final class WP_Customize_Nav_Menus { 
    392393                                'reorderModeOff'    => __( 'Reorder mode closed' ),
    393394                                'reorderLabelOn'    => esc_attr__( 'Reorder menu items' ),
    394395                                'reorderLabelOff'   => esc_attr__( 'Close reorder mode' ),
     396                                /* translators: %1$s: post type, %2$s: post title, %3$s: link to edit post */
     397                                'newPostPublished'  => __( 'New %1$s %2$s published. Edit it <a href="%3$s" target="_blank">here<span class="screen-reader-text"> (link opens in new tab)</span></a>.' ),
    395398                        ),
    396399                        'settingTransport'     => 'postMessage',
    397400                        'phpIntMax'            => PHP_INT_MAX,
    final class WP_Customize_Nav_Menus { 
    400403                                'nav_menu_item' => $temp_nav_menu_item_setting->default,
    401404                        ),
    402405                        'locationSlugMappedToName' => get_registered_nav_menus(),
     406                        'editPostURL'          => admin_url( 'post.php?post=%d&action=edit' ),
    403407                );
    404408
    405409                $data = sprintf( 'var _wpCustomizeNavMenusSettings = %s;', wp_json_encode( $settings ) );
    final class WP_Customize_Nav_Menus { 
    626630                        'section'  => 'add_menu',
    627631                        'settings' => array(),
    628632                ) ) );
     633
     634                $this->manager->add_setting( new WP_Customize_Filter_Setting( $this->manager, 'nav_menus_created_posts', array(
     635                        'transport' => 'postMessage',
     636                        'default'   => array(),
     637                        'sanitize_callback' => 'wp_parse_id_list',
     638                ) ) );
    629639        }
    630640
    631641        /**
    final class WP_Customize_Nav_Menus { 
    660670                        foreach ( $post_types as $slug => $post_type ) {
    661671                                $item_types[] = array(
    662672                                        'title'  => $post_type->labels->name,
     673                                        'label'  => $post_type->labels->singular_name,
    663674                                        'type'   => 'post_type',
    664675                                        'object' => $post_type->name,
    665676                                );
    final class WP_Customize_Nav_Menus { 
    674685                                }
    675686                                $item_types[] = array(
    676687                                        'title'  => $taxonomy->labels->name,
     688                                        'label'  => $taxonomy->labels->singular_name,
    677689                                        'type'   => 'taxonomy',
    678690                                        'object' => $taxonomy->name,
    679691                                );
    final class WP_Customize_Nav_Menus { 
    693705        }
    694706
    695707        /**
     708         * Add a new `auto-draft` post.
     709         *
     710         * @access public
     711         * @since 4.7.0
     712         *
     713         * @param string $post_type The post type.
     714         * @param string $title     The post title.
     715         * @return WP_Post|WP_Error
     716         */
     717        public function insert_auto_draft_post( $post_type, $title ) {
     718
     719                $post_type_obj = get_post_type_object( $post_type );
     720                if ( ! $post_type_obj ) {
     721                        return new WP_Error( 'unknown_post_type', __( 'Unknown post type', 'customize-posts' ) );
     722                }
     723
     724                add_filter( 'wp_insert_post_empty_content', '__return_false' );
     725                $args = array(
     726                        'post_status' => 'auto-draft',
     727                        'post_type'   => $post_type,
     728                        'post_title'  => $title,
     729                        'post_name'  => sanitize_title( $title ), // Auto-drafts are allowed to have empty post_names, so we need to explicitly set it.
     730                );
     731                $r = wp_insert_post( wp_slash( $args ), true );
     732                remove_filter( 'wp_insert_post_empty_content', '__return_false' );
     733
     734                if ( is_wp_error( $r ) ) {
     735                        return $r;
     736                } else {
     737                        return get_post( $r );
     738                }
     739        }
     740
     741        /**
     742         * Ajax handler for adding a new auto-draft post.
     743         *
     744         * @action wp_ajax_customize-posts-insert-auto-draft
     745         * @access public
     746         * @since 4.7.0
     747         */
     748        public function ajax_insert_auto_draft_post() {
     749                if ( ! check_ajax_referer( 'customize-menus', 'customize-menus-nonce' ) ) {
     750                        status_header( 400 );
     751                        wp_send_json_error( 'bad_nonce' );
     752                }
     753
     754                if ( ! current_user_can( 'customize' ) ) {
     755                        status_header( 403 );
     756                        wp_send_json_error( 'customize_not_allowed' );
     757                }
     758
     759                if ( empty( $_POST['params'] ) || ! is_array( $_POST['params'] ) ) {
     760                        status_header( 400 );
     761                        wp_send_json_error( 'missing_params' );
     762                }
     763
     764                $params = wp_unslash( $_POST['params'] );
     765
     766                if ( empty( $params['post_type'] ) ) {
     767                        status_header( 400 );
     768                        wp_send_json_error( 'missing_post_type_param' );
     769                }
     770
     771                $post_type_object = get_post_type_object( $params['post_type'] );
     772                if ( ! $post_type_object || ! current_user_can( $post_type_object->cap->create_posts ) ) {
     773                        status_header( 403 );
     774                        wp_send_json_error( 'insufficient_post_permissions' );
     775                }
     776
     777                if ( ! $params['title'] ) {
     778                        $params['title'] = '';
     779                }
     780
     781                $r = $this->insert_auto_draft_post( $post_type_object->name, $params['post_title'] );
     782                if ( is_wp_error( $r ) ) {
     783                        $error = $r;
     784                        if ( ! empty( $post_type_object->labels->singular_name ) ) {
     785                                $singular_name = $post_type_object->labels->singular_name;
     786                        } else {
     787                                $singular_name = __( 'Post' );
     788                        }
     789
     790                        $data = array(
     791                                /* translators: %1$s is the post type name and %2$s is the error message. */
     792                                'message' => sprintf( __( '%1$s could not be created: %2$s' ), $singular_name, $error->get_error_message() ),
     793                        );
     794                        wp_send_json_error( $data );
     795                } else {
     796                        $post = $r;
     797                        $data = array(
     798                                'postId' => $post->ID,
     799                                'url'    => get_permalink( $post->ID ),
     800                        );
     801                        wp_send_json_success( $data );
     802                }
     803        }
     804
     805        /**
    696806         * Print the JavaScript templates used to render Menu Customizer components.
    697807         *
    698808         * Templates are imported into the JS use wp.template.
    final class WP_Customize_Nav_Menus { 
    768878                                        <span class="spinner"></span>
    769879                                </div>
    770880                                <button type="button" class="clear-results"><span class="screen-reader-text"><?php _e( 'Clear Results' ); ?></span></button>
    771                                 <ul class="accordion-section-content" data-type="search"></ul>
     881                                <ul class="accordion-section-content available-menu-items-list" data-type="search"></ul>
    772882                        </div>
    773883                        <div id="new-custom-menu-item" class="accordion-section">
    774884                                <h4 class="accordion-section-title" role="presentation">
    final class WP_Customize_Nav_Menus { 
    797907                                </div>
    798908                        </div>
    799909                        <?php
    800                         // Containers for per-post-type item browsing; items added with JS.
     910                        /**
     911                         * Filter the content types that do not allow new items to be created from nav menus.
     912                         *
     913                         * Types are formated as 'post_type'|'taxonomy' _ post_type_name; for example, 'taxonomy_post_format'.
     914                         * Taxonomies are not yet supported by this UI but will be in the future. Post types are only available
     915                         * here if `show_in_nav_menus` is true.
     916                         *
     917                         * @since 4.7.0
     918                         *
     919                         * @param array  $types  Array of disallowed types.
     920                         */
     921                        $disallowed_new_content_types = apply_filters( 'customize_nav_menus_disallow_new_content_types', array( 'taxonomy_post_format' ) );
     922
     923                        // Containers for per-post-type item browsing; items are added with JS.
    801924                        foreach ( $this->available_item_types() as $available_item_type ) {
    802925                                $id = sprintf( 'available-menu-items-%s-%s', $available_item_type['type'], $available_item_type['object'] );
    803926                                ?>
    final class WP_Customize_Nav_Menus { 
    813936                                                        <span class="toggle-indicator" aria-hidden="true"></span>
    814937                                                </button>
    815938                                        </h4>
    816                                         <ul class="accordion-section-content" data-type="<?php echo esc_attr( $available_item_type['type'] ); ?>" data-object="<?php echo esc_attr( $available_item_type['object'] ); ?>"></ul>
     939                                        <div class="accordion-section-content">
     940                                                <?php if ( 'post_type' === $available_item_type['type'] && ! in_array( $available_item_type['type'] . '_' . $available_item_type['object'], $disallowed_new_content_types, true ) ) : ?>
     941                                                        <?php $post_type_obj = get_post_type_object( $available_item_type['object'] ); ?>
     942                                                        <?php if ( current_user_can( $post_type_obj->cap->create_posts ) && current_user_can( $post_type_obj->cap->publish_posts ) ) : ?>
     943                                                                <div class="new-content-item">
     944                                                                        <input type="text" class="create-item-input" placeholder="<?php
     945                                                                        /* translators: %s: Singular title of post type or taxonomy */
     946                                                                        printf( __( 'Create New %s' ), $post_type_obj->labels->singular_name ); ?>">
     947                                                                        <button type="button" class="button add-content"><?php _e( 'Add' ); ?></button>
     948                                                                </div>
     949                                                        <?php endif; ?>
     950                                                <?php endif; ?>
     951                                                <ul class="available-menu-items-list" data-type="<?php echo esc_attr( $available_item_type['type'] ); ?>" data-object="<?php echo esc_attr( $available_item_type['object'] ); ?>" data-type_label="<?php echo esc_attr( $available_item_type['label'] ); ?>"></ul>
     952                                        </div>
    817953                                </div>
    818954                                <?php
    819955                        }
    final class WP_Customize_Nav_Menus { 
    8811017        }
    8821018
    8831019        /**
     1020         * Make the auto-draft status protected so that it can be queried.
     1021         *
     1022         * @since 4.7.0
     1023         * @access public
     1024         */
     1025        public function make_auto_draft_status_previewable() {
     1026                global $wp_post_statuses;
     1027                $wp_post_statuses['auto-draft']->protected = true;
     1028        }
     1029
     1030        /**
     1031         * Publish the auto-draft posts that were created for nav menu items.
     1032         *
     1033         * @since 4.7.0
     1034         * @access public
     1035         *
     1036         * @param WP_Customize_Setting $setting Customizer Setting object.
     1037         */
     1038        public function publish_auto_draft_posts( $setting ) {
     1039                $value = $setting->post_value();
     1040                if ( ! empty( $value ) ) {
     1041                        foreach ( array_filter( $value ) as $post_id ) {
     1042                                $post = get_post( $post_id );
     1043                                if ( $post && 'auto-draft' === $post->post_status ) {
     1044                                        wp_publish_post( $post );
     1045                                }
     1046                        }
     1047                }
     1048        }
     1049
     1050        /**
    8841051         * Keep track of the arguments that are being passed to wp_nav_menu().
    8851052         *
    8861053         * @since 4.3.0
  • src/wp-includes/class-wp-customize-setting.php

    diff --git src/wp-includes/class-wp-customize-setting.php src/wp-includes/class-wp-customize-setting.php
    index a0d04d3..a16b100 100644
    class WP_Customize_Setting { 
    498498        /**
    499499         * Fetch and sanitize the $_POST value for the setting.
    500500         *
     501         * During a save request prior to save, post_value() provides the new value while value() does not.
     502         *
    501503         * @since 3.4.0
    502504         *
    503505         * @param mixed $default A default value which is used as a fallback. Default is null.