Customize: Allow page stubs to be created via `dropdown-pages` controls in the Static Front Page section.
This ability was previously added to nav menus via the available page items panel. The "Add New Page" button only appears when the `allow_addition` control param is supplied as `true`. Code is adapted from the Customize Posts feature plugin. Props celloexpressions, westonruter. See #38013, #34923. Fixes #38164. Built from https://develop.svn.wordpress.org/trunk@38906 git-svn-id: http://core.svn.wordpress.org/trunk@38849 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
6a0ca394e8
commit
30a71555cb
|
@ -565,8 +565,8 @@ p.customize-section-description {
|
|||
}
|
||||
|
||||
.customize-control select {
|
||||
min-width: 50%;
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
max-width: 300px;
|
||||
height: 28px;
|
||||
line-height: 28px;
|
||||
}
|
||||
|
@ -587,6 +587,7 @@ p.customize-section-description {
|
|||
display: block;
|
||||
font-style: italic;
|
||||
line-height: 18px;
|
||||
margin-top: 0;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
|
@ -674,6 +675,54 @@ p.customize-section-description {
|
|||
float: right;
|
||||
}
|
||||
|
||||
#available-menu-items .accordion-section-content .new-content-item,
|
||||
.customize-control-dropdown-pages .new-content-item {
|
||||
width: -webkit-calc(100% - 30px);
|
||||
width: calc(100% - 30px);
|
||||
padding: 8px 15px;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
z-index: 10;
|
||||
background: #eee;
|
||||
display: -webkit-box;
|
||||
display: -moz-box;
|
||||
display: -ms-flexbox;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.customize-control-dropdown-pages .new-content-item {
|
||||
width: 100%;
|
||||
max-width: 300px;
|
||||
padding: 5px 1px 5px 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#available-menu-items .new-content-item .create-item-input,
|
||||
.customize-control-dropdown-pages .new-content-item .create-item-input {
|
||||
-webkit-box-flex: 10;
|
||||
-webkit-flex-grow: 10;
|
||||
-moz-box-flex: 10;
|
||||
-ms-flex-positive: 10;
|
||||
-ms-flex: 10;
|
||||
flex-grow: 10;
|
||||
}
|
||||
|
||||
#available-menu-items .new-content-item .add-content,
|
||||
.customize-control-dropdown-pages .new-content-item .add-content {
|
||||
margin: 2px 6px 2px 0;
|
||||
-webkit-box-flex: 10;
|
||||
-webkit-flex-grow: 10;
|
||||
-moz-box-flex: 10;
|
||||
-ms-flex-positive: 10;
|
||||
-ms-flex: 10;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.customize-control-dropdown-pages .new-content-item .create-item-input.invalid {
|
||||
border: 1px solid #f00;
|
||||
}
|
||||
|
||||
#customize-preview iframe {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -565,8 +565,8 @@ p.customize-section-description {
|
|||
}
|
||||
|
||||
.customize-control select {
|
||||
min-width: 50%;
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
max-width: 300px;
|
||||
height: 28px;
|
||||
line-height: 28px;
|
||||
}
|
||||
|
@ -587,6 +587,7 @@ p.customize-section-description {
|
|||
display: block;
|
||||
font-style: italic;
|
||||
line-height: 18px;
|
||||
margin-top: 0;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
|
@ -674,6 +675,54 @@ p.customize-section-description {
|
|||
float: left;
|
||||
}
|
||||
|
||||
#available-menu-items .accordion-section-content .new-content-item,
|
||||
.customize-control-dropdown-pages .new-content-item {
|
||||
width: -webkit-calc(100% - 30px);
|
||||
width: calc(100% - 30px);
|
||||
padding: 8px 15px;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
z-index: 10;
|
||||
background: #eee;
|
||||
display: -webkit-box;
|
||||
display: -moz-box;
|
||||
display: -ms-flexbox;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.customize-control-dropdown-pages .new-content-item {
|
||||
width: 100%;
|
||||
max-width: 300px;
|
||||
padding: 5px 0 5px 1px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#available-menu-items .new-content-item .create-item-input,
|
||||
.customize-control-dropdown-pages .new-content-item .create-item-input {
|
||||
-webkit-box-flex: 10;
|
||||
-webkit-flex-grow: 10;
|
||||
-moz-box-flex: 10;
|
||||
-ms-flex-positive: 10;
|
||||
-ms-flex: 10;
|
||||
flex-grow: 10;
|
||||
}
|
||||
|
||||
#available-menu-items .new-content-item .add-content,
|
||||
.customize-control-dropdown-pages .new-content-item .add-content {
|
||||
margin: 2px 0 2px 6px;
|
||||
-webkit-box-flex: 10;
|
||||
-webkit-flex-grow: 10;
|
||||
-moz-box-flex: 10;
|
||||
-ms-flex-positive: 10;
|
||||
-ms-flex: 10;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.customize-control-dropdown-pages .new-content-item .create-item-input.invalid {
|
||||
border: 1px solid #f00;
|
||||
}
|
||||
|
||||
#customize-preview iframe {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -572,41 +572,6 @@
|
|||
padding: 0 15px 15px 15px;
|
||||
}
|
||||
|
||||
#available-menu-items .accordion-section-content .new-content-item {
|
||||
width: -webkit-calc(100% - 30px);
|
||||
width: calc(100% - 30px);
|
||||
padding: 8px 15px;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
z-index: 10;
|
||||
background: #eee;
|
||||
display: -webkit-box;
|
||||
display: -moz-box;
|
||||
display: -ms-flexbox;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#available-menu-items .new-content-item .create-item-input {
|
||||
-webkit-box-flex: 10;
|
||||
-webkit-flex-grow: 10;
|
||||
-moz-box-flex: 10;
|
||||
-ms-flex-positive: 10;
|
||||
-ms-flex: 10;
|
||||
flex-grow: 10;
|
||||
margin-right: 5px;
|
||||
padding: 4.5px;
|
||||
}
|
||||
#available-menu-items .new-content-item .add-content {
|
||||
padding-right: 6px;
|
||||
-webkit-box-flex: 10;
|
||||
-webkit-flex-grow: 10;
|
||||
-moz-box-flex: 10;
|
||||
-ms-flex-positive: 10;
|
||||
-ms-flex: 10;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
#available-menu-items .menu-item-tpl {
|
||||
margin: 0;
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -572,41 +572,6 @@
|
|||
padding: 0 15px 15px 15px;
|
||||
}
|
||||
|
||||
#available-menu-items .accordion-section-content .new-content-item {
|
||||
width: -webkit-calc(100% - 30px);
|
||||
width: calc(100% - 30px);
|
||||
padding: 8px 15px;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
z-index: 10;
|
||||
background: #eee;
|
||||
display: -webkit-box;
|
||||
display: -moz-box;
|
||||
display: -ms-flexbox;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#available-menu-items .new-content-item .create-item-input {
|
||||
-webkit-box-flex: 10;
|
||||
-webkit-flex-grow: 10;
|
||||
-moz-box-flex: 10;
|
||||
-ms-flex-positive: 10;
|
||||
-ms-flex: 10;
|
||||
flex-grow: 10;
|
||||
margin-left: 5px;
|
||||
padding: 4.5px;
|
||||
}
|
||||
#available-menu-items .new-content-item .add-content {
|
||||
padding-left: 6px;
|
||||
-webkit-box-flex: 10;
|
||||
-webkit-flex-grow: 10;
|
||||
-moz-box-flex: 10;
|
||||
-ms-flex-positive: 10;
|
||||
-ms-flex: 10;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
#available-menu-items .menu-item-tpl {
|
||||
margin: 0;
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -2516,9 +2516,28 @@
|
|||
/**
|
||||
* Triggered when the control's markup has been injected into the DOM.
|
||||
*
|
||||
* @abstract
|
||||
* @returns {void}
|
||||
*/
|
||||
ready: function() {},
|
||||
ready: function() {
|
||||
var control = this, newItem;
|
||||
if ( 'dropdown-pages' === control.params.type && control.params.allow_addition ) {
|
||||
newItem = control.container.find( '.new-content-item' );
|
||||
newItem.hide(); // Hide in JS to preserve flex display when showing.
|
||||
control.container.on( 'click', '.add-new-toggle', function( e ) {
|
||||
$( e.currentTarget ).slideUp( 180 );
|
||||
newItem.slideDown( 180 );
|
||||
newItem.find( '.create-item-input' ).focus();
|
||||
});
|
||||
control.container.on( 'click', '.add-content', function() {
|
||||
control.addNewPage();
|
||||
});
|
||||
control.container.on( 'keyup', '.create-item-input', function( e ) {
|
||||
if ( 13 === e.which ) { // Enter
|
||||
control.addNewPage();
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the element inside of a control's container that contains the validation error message.
|
||||
|
@ -2736,6 +2755,73 @@
|
|||
control.container.html( template( control.params ) );
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Add a new page to a dropdown-pages control reusing menus code for this.
|
||||
*
|
||||
* @since 4.7.0
|
||||
* @access private
|
||||
* @returns {void}
|
||||
*/
|
||||
addNewPage: function () {
|
||||
var control = this, promise, toggle, container, input, title, select;
|
||||
|
||||
if ( 'dropdown-pages' !== control.params.type || ! control.params.allow_addition || ! api.Menus ) {
|
||||
return;
|
||||
}
|
||||
|
||||
toggle = control.container.find( '.add-new-toggle' );
|
||||
container = control.container.find( '.new-content-item' );
|
||||
input = control.container.find( '.create-item-input' );
|
||||
title = input.val();
|
||||
select = control.container.find( 'select' );
|
||||
|
||||
if ( ! title ) {
|
||||
input.addClass( 'invalid' );
|
||||
return;
|
||||
}
|
||||
|
||||
input.removeClass( 'invalid' );
|
||||
input.attr( 'disabled', 'disabled' );
|
||||
|
||||
// The menus functions add the page, publish when appropriate, and also add the new page to the dropdown-pages controls.
|
||||
promise = api.Menus.insertAutoDraftPost( {
|
||||
post_title: title,
|
||||
post_type: 'page'
|
||||
} );
|
||||
promise.done( function( data ) {
|
||||
var availableItem, $content, itemTemplate;
|
||||
|
||||
// Prepare the new page as an available menu item.
|
||||
// See api.Menus.submitNew().
|
||||
availableItem = new api.Menus.AvailableItemModel( {
|
||||
'id': 'post-' + data.post_id, // Used for available menu item Backbone models.
|
||||
'title': title,
|
||||
'type': 'page',
|
||||
'type_label': api.Menus.data.l10n.page_label,
|
||||
'object': 'post_type',
|
||||
'object_id': data.post_id,
|
||||
'url': data.url
|
||||
} );
|
||||
|
||||
// Add the new item to the list of available menu items.
|
||||
api.Menus.availableMenuItemsPanel.collection.add( availableItem );
|
||||
$content = $( '#available-menu-items-post_type-page' ).find( '.available-menu-items-list' );
|
||||
itemTemplate = wp.template( 'available-menu-item' );
|
||||
$content.prepend( itemTemplate( availableItem.attributes ) );
|
||||
|
||||
// Focus the select control.
|
||||
select.focus();
|
||||
control.setting.set( String( data.post_id ) ); // Triggers a preview refresh and updates the setting.
|
||||
|
||||
// Reset the create page form.
|
||||
container.slideUp( 180 );
|
||||
toggle.slideDown( 180 );
|
||||
} )
|
||||
.always( function() {
|
||||
input.val( '' ).removeAttr( 'disabled' );
|
||||
} );
|
||||
}
|
||||
});
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -101,7 +101,6 @@
|
|||
|
||||
request.done( function( response ) {
|
||||
if ( response.post_id ) {
|
||||
deferred.resolve( response );
|
||||
api.Menus.insertedAutoDrafts.push( response.post_id );
|
||||
api( 'nav_menus_created_posts' ).set( _.clone( api.Menus.insertedAutoDrafts ) );
|
||||
|
||||
|
@ -121,6 +120,7 @@
|
|||
}
|
||||
} );
|
||||
}
|
||||
deferred.resolve( response );
|
||||
}
|
||||
} );
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -114,6 +114,15 @@ class WP_Customize_Control {
|
|||
*/
|
||||
public $input_attrs = array();
|
||||
|
||||
/**
|
||||
* Show UI for adding new content, currently only used for the dropdown-pages control.
|
||||
*
|
||||
* @since 4.7.0
|
||||
* @access public
|
||||
* @var array
|
||||
*/
|
||||
public $allow_addition = false;
|
||||
|
||||
/**
|
||||
* @deprecated It is better to just call the json() method
|
||||
* @access public
|
||||
|
@ -296,6 +305,10 @@ class WP_Customize_Control {
|
|||
$this->json['label'] = $this->label;
|
||||
$this->json['description'] = $this->description;
|
||||
$this->json['instanceNumber'] = $this->instance_number;
|
||||
|
||||
if ( 'dropdown-pages' === $this->type ) {
|
||||
$this->json['allow_addition'] = $this->allow_addition;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -554,10 +567,34 @@ class WP_Customize_Control {
|
|||
|
||||
// Hackily add in the data link parameter.
|
||||
$dropdown = str_replace( '<select', '<select ' . $this->get_link(), $dropdown );
|
||||
|
||||
// Even more hacikly add auto-draft page stubs.
|
||||
// @todo Eventually this should be removed in favor of the pages being injected into the underlying get_pages() call. See <https://github.com/xwp/wp-customize-posts/pull/250>.
|
||||
$nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' );
|
||||
if ( $nav_menus_created_posts_setting && current_user_can( 'publish_pages' ) ) {
|
||||
$auto_draft_page_options = '';
|
||||
foreach ( $nav_menus_created_posts_setting->value() as $auto_draft_page_id ) {
|
||||
$post = get_post( $auto_draft_page_id );
|
||||
if ( $post && 'page' === $post->post_type ) {
|
||||
$auto_draft_page_options .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $post->ID ), esc_html( $post->post_title ) );
|
||||
}
|
||||
}
|
||||
if ( $auto_draft_page_options ) {
|
||||
$dropdown = str_replace( '</select>', $auto_draft_page_options . '</select>', $dropdown );
|
||||
}
|
||||
}
|
||||
|
||||
echo $dropdown;
|
||||
?>
|
||||
</label>
|
||||
<?php
|
||||
<?php if ( $this->allow_addition && current_user_can( 'publish_pages' ) && current_user_can( 'edit_theme_options' ) ) : // Currently tied to menus functionality. ?>
|
||||
<button type="button" class="button add-new-toggle"><?php echo get_post_type_object( 'page' )->labels->add_new_item; ?></button>
|
||||
<div class="new-content-item">
|
||||
<label for="create-input-<?php echo $this->id; ?>"><span class="screen-reader-text"><?php _e( 'New page title' ); ?></span></label>
|
||||
<input type="text" id="create-input-<?php echo $this->id; ?>" class="create-item-input" placeholder="<?php esc_attr_e( 'New page title…' ); ?>">
|
||||
<button type="button" class="button add-content"><?php _e( 'Add' ); ?></button>
|
||||
</div>
|
||||
<?php endif;
|
||||
break;
|
||||
default:
|
||||
?>
|
||||
|
|
|
@ -3356,6 +3356,7 @@ final class WP_Customize_Manager {
|
|||
'label' => __( 'Front page' ),
|
||||
'section' => 'static_front_page',
|
||||
'type' => 'dropdown-pages',
|
||||
'allow_addition' => true,
|
||||
) );
|
||||
|
||||
$this->add_setting( 'page_for_posts', array(
|
||||
|
@ -3367,6 +3368,7 @@ final class WP_Customize_Manager {
|
|||
'label' => __( 'Posts page' ),
|
||||
'section' => 'static_front_page',
|
||||
'type' => 'dropdown-pages',
|
||||
'allow_addition' => true,
|
||||
) );
|
||||
|
||||
/* Custom CSS */
|
||||
|
|
|
@ -370,6 +370,7 @@ final class WP_Customize_Nav_Menus {
|
|||
'untitled' => _x( '(no label)', 'missing menu item navigation label' ),
|
||||
'unnamed' => _x( '(unnamed)', 'Missing menu name.' ),
|
||||
'custom_label' => __( 'Custom Link' ),
|
||||
'page_label' => get_post_type_object( 'page' )->labels->singular_name,
|
||||
/* translators: %s: menu location */
|
||||
'menuLocation' => _x( '(Currently set to: %s)', 'menu' ),
|
||||
'menuNameLabel' => __( 'Menu Name' ),
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
*
|
||||
* @global string $wp_version
|
||||
*/
|
||||
$wp_version = '4.7-alpha-38905';
|
||||
$wp_version = '4.7-alpha-38906';
|
||||
|
||||
/**
|
||||
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
||||
|
|
Loading…
Reference in New Issue