Add menu management to the Customizer.

This brings in the Menu Customizer plugin: https://wordpress.org/plugins/menu-customizer/.

props celloexpressions, westonruter, valendesigns, voldemortensen, ocean90, adamsilverstein, kucrut, jorbin, designsimply, afercia, davidakennedy, obenland.
see #32576.

git-svn-id: https://develop.svn.wordpress.org/trunk@32806 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Dominik Schilling (ocean90)
2015-06-16 22:07:08 +00:00
parent 0433b87fdf
commit c0a66eba79
14 changed files with 7864 additions and 57 deletions

View File

@@ -1402,3 +1402,479 @@ class WP_Widget_Form_Customize_Control extends WP_Customize_Control {
return $this->manager->widgets->is_widget_rendered( $this->widget_id );
}
}
/**
* Customize Nav Menus Panel Class
*
* Needed to add screen options.
*
* @since 4.3.0
*/
class WP_Customize_Nav_Menus_Panel extends WP_Customize_Panel {
/**
* Control type.
*
* @since 4.3.0
*
* @access public
* @var string
*/
public $type = 'nav_menus';
/**
* Render screen options for Menus.
*
* @since 4.3.0
*/
public function render_screen_options() {
// Essentially adds the screen options.
add_filter( 'manage_nav-menus_columns', array( $this, 'wp_nav_menu_manage_columns' ) );
// Display screen options.
$screen = WP_Screen::get( 'nav-menus.php' );
$screen->render_screen_options();
}
/**
* Returns the advanced options for the nav menus page.
*
* Link title attribute added as it's a relatively advanced concept for new users.
*
* @since 4.3.0
*
* @return array The advanced menu properties.
*/
function wp_nav_menu_manage_columns() {
return array(
'_title' => __( 'Show advanced menu properties' ),
'cb' => '<input type="checkbox" />',
'link-target' => __( 'Link Target' ),
'attr-title' => __( 'Title Attribute' ),
'css-classes' => __( 'CSS Classes' ),
'xfn' => __( 'Link Relationship (XFN)' ),
'description' => __( 'Description' ),
);
}
/**
* An Underscore (JS) template for this panel's content (but not its container).
*
* Class variables for this panel class are available in the `data` JS object;
* export custom variables by overriding {@see WP_Customize_Panel::json()}.
*
* @since 4.3.0
*
* @see WP_Customize_Panel::print_template()
*
* @since 4.3.0
*/
protected function content_template() {
?>
<li class="panel-meta customize-info accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>">
<button type="button" class="customize-panel-back" tabindex="-1">
<span class="screen-reader-text"><?php _e( 'Back' ); ?></span>
</button>
<div class="accordion-section-title">
<span class="preview-notice">
<?php
/* translators: %s is the site/panel title in the Customizer */
printf( __( 'You are customizing %s' ), '<strong class="panel-title">{{ data.title }}</strong>' );
?>
</span>
<button type="button" class="customize-screen-options-toggle" aria-expanded="false">
<span class="screen-reader-text"><?php _e( 'Menu Options' ); ?></span>
</button>
<button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false">
<span class="screen-reader-text"><?php _e( 'Help' ); ?></span>
</button>
</div>
<# if ( data.description ) { #>
<div class="description customize-panel-description">{{{ data.description }}}</div>
<# } #>
<?php $this->render_screen_options(); ?>
</li>
<?php
}
}
/**
* Customize Nav Menu Control Class
*
* @since 4.3.0
*/
class WP_Customize_Nav_Menu_Control extends WP_Customize_Control {
/**
* Control type.
*
* @since 4.3.0
*
* @access public
* @var string
*/
public $type = 'nav_menu';
/**
* The nav menu setting.
*
* @since 4.3.0
*
* @var WP_Customize_Nav_Menu_Setting
*/
public $setting;
/**
* Don't render the control's content - it uses a JS template instead.
*
* @since 4.3.0
*/
public function render_content() {}
/**
* JS/Underscore template for the control UI.
*
* @since 4.3.0
*/
public function content_template() {
?>
<button type="button" class="button-secondary add-new-menu-item">
<?php _e( 'Add Items' ); ?>
</button>
<button type="button" class="not-a-button reorder-toggle">
<span class="reorder"><?php _ex( 'Reorder', 'Reorder menu items in Customizer' ); ?></span>
<span class="reorder-done"><?php _ex( 'Done', 'Cancel reordering menu items in Customizer' ); ?></span>
</button>
<span class="add-menu-item-loading spinner"></span>
<span class="menu-delete-item">
<button type="button" class="not-a-button menu-delete">
<?php _e( 'Delete menu' ); ?> <span class="screen-reader-text">{{ data.menu_name }}</span>
</button>
</span>
<?php if ( current_theme_supports( 'menus' ) ) : ?>
<ul class="menu-settings">
<li class="customize-control">
<span class="customize-control-title"><?php _e( 'Menu locations' ); ?></span>
</li>
<?php foreach ( get_registered_nav_menus() as $location => $description ) : ?>
<li class="customize-control customize-control-checkbox assigned-menu-location">
<label>
<input type="checkbox" data-menu-id="{{ data.menu_id }}" data-location-id="<?php echo esc_attr( $location ); ?>" class="menu-location" /> <?php echo $description; ?>
<span class="theme-location-set"><?php printf( _x( '(Current: %s)', 'Current menu location' ), '<span class="current-menu-location-name-' . esc_attr( $location ) . '"></span>' ); ?></span>
</label>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<p>
<label>
<input type="checkbox" class="auto_add">
<?php _e( 'Automatically add new top-level pages to this menu.' ) ?>
</label>
</p>
<?php
}
/**
* Return params for this control.
*
* @since 4.3.0
*
* @return array
*/
function json() {
$exported = parent::json();
$exported['menu_id'] = $this->setting->term_id;
return $exported;
}
}
/**
* Customize control to represent the name field for a given menu.
*
* @since 4.3.0
*/
class WP_Customize_Nav_Menu_Item_Control extends WP_Customize_Control {
/**
* Control type.
*
* @since 4.3.0
*
* @access public
* @var string
*/
public $type = 'nav_menu_item';
/**
* The nav menu item setting.
*
* @since 4.3.0
*
* @var WP_Customize_Nav_Menu_Item_Setting
*/
public $setting;
/**
* Constructor.
*
* @since 4.3.0
*
* @uses WP_Customize_Control::__construct()
*
* @param WP_Customize_Manager $manager An instance of the WP_Customize_Manager class.
* @param string $id The control ID.
* @param array $args Optional. Overrides class property defaults.
*/
public function __construct( $manager, $id, $args = array() ) {
parent::__construct( $manager, $id, $args );
}
/**
* Don't render the control's content - it's rendered with a JS template.
*
* @since 4.3.0
*/
public function render_content() {}
/**
* JS/Underscore template for the control UI.
*
* @since 4.3.0
*/
public function content_template() {
?>
<dl class="menu-item-bar">
<dt class="menu-item-handle">
<span class="item-type">{{ data.item_type_label }}</span>
<span class="item-title">
<span class="spinner"></span>
<span class="menu-item-title">{{ data.title }}</span>
</span>
<span class="item-controls">
<button type="button" class="not-a-button item-edit"><span class="screen-reader-text"><?php _e( 'Edit Menu Item' ); ?></span></button>
<button type="button" class="not-a-button item-delete submitdelete deletion"><span class="screen-reader-text"><?php _e( 'Remove Menu Item' ); ?></span></button>
</span>
</dt>
</dl>
<div class="menu-item-settings" id="menu-item-settings-{{ data.menu_item_id }}">
<# if ( 'custom' === data.item_type ) { #>
<p class="field-url description description-thin">
<label for="edit-menu-item-url-{{ data.menu_item_id }}">
<?php _e( 'URL' ); ?><br />
<input class="widefat code edit-menu-item-url" type="text" id="edit-menu-item-url-{{ data.menu_item_id }}" name="menu-item-url" />
</label>
</p>
<# } #>
<p class="description description-thin">
<label for="edit-menu-item-title-{{ data.menu_item_id }}">
<?php _e( 'Navigation Label' ); ?><br />
<input type="text" id="edit-menu-item-title-{{ data.menu_item_id }}" class="widefat edit-menu-item-title" name="menu-item-title" />
</label>
</p>
<p class="field-link-target description description-thin">
<label for="edit-menu-item-target-{{ data.menu_item_id }}">
<input type="checkbox" id="edit-menu-item-target-{{ data.menu_item_id }}" class="edit-menu-item-target" value="_blank" name="menu-item-target" />
<?php _e( 'Open link in a new tab' ); ?>
</label>
</p>
<p class="field-attr-title description description-thin">
<label for="edit-menu-item-attr-title-{{ data.menu_item_id }}">
<?php _e( 'Title Attribute' ); ?><br />
<input type="text" id="edit-menu-item-attr-title-{{ data.menu_item_id }}" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title" />
</label>
</p>
<p class="field-css-classes description description-thin">
<label for="edit-menu-item-classes-{{ data.menu_item_id }}">
<?php _e( 'CSS Classes' ); ?><br />
<input type="text" id="edit-menu-item-classes-{{ data.menu_item_id }}" class="widefat code edit-menu-item-classes" name="menu-item-classes" />
</label>
</p>
<p class="field-xfn description description-thin">
<label for="edit-menu-item-xfn-{{ data.menu_item_id }}">
<?php _e( 'Link Relationship (XFN)' ); ?><br />
<input type="text" id="edit-menu-item-xfn-{{ data.menu_item_id }}" class="widefat code edit-menu-item-xfn" name="menu-item-xfn" />
</label>
</p>
<p class="field-description description description-thin">
<label for="edit-menu-item-description-{{ data.menu_item_id }}">
<?php _e( 'Description' ); ?><br />
<textarea id="edit-menu-item-description-{{ data.menu_item_id }}" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description">{{ data.description }}</textarea>
<span class="description"><?php _e( 'The description will be displayed in the menu if the current theme supports it.' ); ?></span>
</label>
</p>
<div class="menu-item-actions description-thin submitbox">
<# if ( 'custom' != data.item_type && '' != data.original_title ) { #>
<p class="link-to-original">
<?php printf( __( 'Original: %s' ), '<a class="original-link" href="{{ data.url }}">{{{ data.original_title }}}</a>' ); ?>
</p>
<# } #>
<button type="button" class="not-a-button item-delete submitdelete deletion"><?php _e( 'Remove' ); ?></button>
<span class="spinner"></span>
</div>
<input type="hidden" name="menu-item-db-id[{{ data.menu_item_id }}]" class="menu-item-data-db-id" value="{{ data.menu_item_id }}" />
<input type="hidden" name="menu-item-parent-id[{{ data.menu_item_id }}]" class="menu-item-data-parent-id" value="{{ data.parent }}" />
</div><!-- .menu-item-settings-->
<ul class="menu-item-transport"></ul>
<?php
}
/**
* Return params for this control.
*
* @since 4.3.0
*
* @return array
*/
function json() {
$exported = parent::json();
$exported['menu_item_id'] = $this->setting->post_id;
return $exported;
}
}
/**
* Customize Menu Location Control Class
*
* This custom control is only needed for JS.
*
* @since 4.3.0
*/
class WP_Customize_Nav_Menu_Location_Control extends WP_Customize_Control {
/**
* Control type.
*
* @since 4.3.0
*
* @access public
* @var string
*/
public $type = 'nav_menu_location';
/**
* Location ID.
*
* @since 4.3.0
*
* @access public
* @var string
*/
public $location_id = '';
/**
* Refresh the parameters passed to JavaScript via JSON.
*
* @since 4.3.0
*
* @uses WP_Customize_Control::to_json()
*/
public function to_json() {
parent::to_json();
$this->json['locationId'] = $this->location_id;
}
/**
* Render content just like a normal select control.
*
* @since 4.3.0
*/
public function render_content() {
if ( empty( $this->choices ) ) {
return;
}
?>
<label>
<?php if ( ! empty( $this->label ) ) : ?>
<span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
<?php endif; ?>
<?php if ( ! empty( $this->description ) ) : ?>
<span class="description customize-control-description"><?php echo $this->description; ?></span>
<?php endif; ?>
<select <?php $this->link(); ?>>
<?php
foreach ( $this->choices as $value => $label ) :
echo '<option value="' . esc_attr( $value ) . '"' . selected( $this->value(), $value, false ) . '>' . $label . '</option>';
endforeach;
?>
</select>
</label>
<?php
}
}
/**
* Customize control to represent the name field for a given menu.
*
* @since 4.3.0
*/
class WP_Customize_Nav_Menu_Name_Control extends WP_Customize_Control {
/**
* Type of control, used by JS.
*
* @since 4.3.0
*
* @var string
*/
public $type = 'nav_menu_name';
/**
* No-op since we're using JS template.
*
* @since 4.3.0
*/
protected function render_content() {}
/**
* Render the Underscore template for this control.
*
* @since 4.3.0
*/
protected function content_template() {
?>
<label>
<input type="text" class="menu-name-field live-update-section-title" />
</label>
<?php
}
}
/**
* Customize control class for new menus.
*
* @since 4.3.0
*/
class WP_New_Menu_Customize_Control extends WP_Customize_Control {
/**
* Control type.
*
* @since 4.3.0
*
* @access public
* @var string
*/
public $type = 'new_menu';
/**
* Render the control's content.
*
* @since 4.3.0
*/
public function render_content() {
?>
<button type="button" class="button button-primary" id="create-new-menu-submit"><?php _e( 'Create Menu' ); ?></button>
<span class="spinner"></span>
<?php
}
}