mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-06-28 14:20:15 +00:00
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:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user