First pass on 'Theme Locations' for navigation menus. Themes need to specify a location when calling wp_nav_menu and register locations in functions.php. Users then map menus to locations in the nav menu admin. Subject to review. see #13378.

git-svn-id: http://svn.automattic.com/wordpress/trunk@14620 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
nacin 2010-05-14 06:20:30 +00:00
parent c1dea00b62
commit a743de0788
9 changed files with 78 additions and 26 deletions

File diff suppressed because one or more lines are too long

View File

@ -197,7 +197,12 @@ body {
.customlinkdiv .howto input { .customlinkdiv .howto input {
width: 210px; width: 210px;
} }
#nav-menu-theme-locations .howto select {
width: 100%;
}
#nav-menu-theme-locations .button-controls {
text-align: right;
}
.add-menu-item-view-all { .add-menu-item-view-all {
height: 400px; height: 400px;
} }

View File

@ -308,6 +308,7 @@ function _wp_ajax_menu_quick_search( $request = array() ) {
**/ **/
function wp_nav_menu_setup() { function wp_nav_menu_setup() {
// Register meta boxes // Register meta boxes
add_meta_box( 'nav-menu-theme-locations', __( 'Theme Locations' ), 'wp_nav_menu_locations_meta_box' , 'nav-menus', 'side', 'default' );
add_meta_box( 'add-custom-links', __('Custom Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' ); add_meta_box( 'add-custom-links', __('Custom Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' );
wp_nav_menu_post_type_meta_boxes(); wp_nav_menu_post_type_meta_boxes();
wp_nav_menu_taxonomy_meta_boxes(); wp_nav_menu_taxonomy_meta_boxes();
@ -337,7 +338,7 @@ function wp_initial_nav_menu_meta_boxes() {
if ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array($wp_meta_boxes) ) if ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array($wp_meta_boxes) )
return; return;
$initial_meta_boxes = array( 'manage-menu', 'create-menu', 'add-custom-links', 'add-page', 'add-category' ); $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add-custom-links', 'add-page', 'add-category' );
$hidden_meta_boxes = array(); $hidden_meta_boxes = array();
foreach ( array_keys($wp_meta_boxes['nav-menus']) as $context ) { foreach ( array_keys($wp_meta_boxes['nav-menus']) as $context ) {
@ -396,6 +397,41 @@ function wp_nav_menu_taxonomy_meta_boxes() {
} }
} }
/**
* Displays a metabox for the nav menu theme locations.
*
* @since 3.0.0
*/
function wp_nav_menu_locations_meta_box() {
$locations = get_registered_nav_menus();
$mods = get_nav_menu_locations();
$menus = wp_get_nav_menus();
$menu_locations = get_nav_menu_locations();
//var_dump( $menus );
foreach ( $locations as $location => $description ) {
?>
<p>
<label class="howto" for="locations-<?php echo $location; ?>">
<span><?php echo $description; ?></span>
<select name="menu-locations[<?php echo $location; ?>]" id="locations-<?php echo $location; ?>">
<option value=""></option>
<?php foreach ( $menus as $menu ) : ?>
<option<?php selected( isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] == $menu->term_id ); ?>
value="<?php echo $menu->term_id; ?>"><?php echo $menu->name; ?></option>
<?php endforeach; ?>
</select>
</label>
</p>
<?php
}
?>
<p class="button-controls">
<img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />
<input type="submit" class="button-primary" name="nav-menu-locations" value="<?php esc_attr_e( 'Save' ); ?>" />
</p>
<?php
}
/** /**
* Displays a metabox for the custom links menu item. * Displays a metabox for the custom links menu item.
* *

View File

@ -52,7 +52,9 @@ $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'edit';
switch ( $action ) { switch ( $action ) {
case 'add-menu-item': case 'add-menu-item':
check_admin_referer( 'add-menu_item', 'menu-settings-column-nonce' ); check_admin_referer( 'add-menu_item', 'menu-settings-column-nonce' );
if ( isset( $_REQUEST['menu-item'] ) ) if ( isset( $_REQUEST['nav-menu-locations'] ) )
set_theme_mod( 'nav_menu_locations', $_REQUEST['menu-locations'] );
elseif ( isset( $_REQUEST['menu-item'] ) )
wp_save_nav_menu_item( $nav_menu_selected_id, $_REQUEST['menu-item'] ); wp_save_nav_menu_item( $nav_menu_selected_id, $_REQUEST['menu-item'] );
break; break;
case 'move-down-menu-item' : case 'move-down-menu-item' :

View File

@ -79,9 +79,6 @@ function twentyten_setup() {
// This theme uses post thumbnails // This theme uses post thumbnails
add_theme_support( 'post-thumbnails' ); add_theme_support( 'post-thumbnails' );
// This theme uses wp_nav_menu()
register_nav_menus( array('main' => __('Main Menu')) );
// Add default posts and comments RSS feed links to head // Add default posts and comments RSS feed links to head
add_theme_support( 'automatic-feed-links' ); add_theme_support( 'automatic-feed-links' );
@ -94,6 +91,11 @@ function twentyten_setup() {
if ( is_readable( $locale_file ) ) if ( is_readable( $locale_file ) )
require_once( $locale_file ); require_once( $locale_file );
// This theme uses wp_nav_menu() in one location.
register_nav_menus( array(
'primary' => __( 'Primary Menu', 'twentyten' ),
) );
// This theme allows users to set a custom background // This theme allows users to set a custom background
add_custom_background(); add_custom_background();

View File

@ -69,7 +69,7 @@
<div id="access" role="navigation"> <div id="access" role="navigation">
<div class="skip-link screen-reader-text"><a href="#content" title="<?php esc_attr_e( 'Skip to content', 'twentyten' ); ?>"><?php _e( 'Skip to content', 'twentyten' ); ?></a></div> <div class="skip-link screen-reader-text"><a href="#content" title="<?php esc_attr_e( 'Skip to content', 'twentyten' ); ?>"><?php _e( 'Skip to content', 'twentyten' ); ?></a></div>
<?php wp_nav_menu( array( 'sort_column' => 'menu_order', 'container_class' => 'menu-header', 'theme_menu' => 'main' ) ); ?> <?php wp_nav_menu( array( 'sort_column' => 'menu_order', 'container_class' => 'menu-header', 'theme_location' => 'primary' ) ); ?>
</div><!-- #access --> </div><!-- #access -->
</div><!-- #masthead --> </div><!-- #masthead -->
</div><!-- #header --> </div><!-- #header -->

View File

@ -193,23 +193,20 @@ class Walker_Nav_Menu_Checklist extends Walker_Nav_Menu {
function wp_nav_menu( $args = array() ) { function wp_nav_menu( $args = array() ) {
$defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'menu_class' => 'menu', 'echo' => true, $defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'menu_class' => 'menu', 'echo' => true,
'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '',
'depth' => 0, 'walker' => '', 'context' => 'frontend', 'theme_menu' => '' ); 'depth' => 0, 'walker' => '', 'context' => 'frontend', 'theme_location' => '' );
$args = wp_parse_args( $args, $defaults ); $args = wp_parse_args( $args, $defaults );
$args = apply_filters( 'wp_nav_menu_args', $args ); $args = apply_filters( 'wp_nav_menu_args', $args );
$args = (object) $args; $args = (object) $args;
// Get the nav menu // Get the nav menu based on the requested menu
$menu = wp_get_nav_menu_object( $args->menu ); $menu = wp_get_nav_menu_object( $args->menu );
if ( ! $menu && $slot ) { // Get the nav menu based on the theme_location
$slots = get_nav_menu_slots(); if ( ! $menu && $args->theme_location && ( $locations = get_nav_menu_locations() ) && isset( $locations[ $args->theme_location ] ) )
if ( isset($slots) && isset($slots['theme_menu']) ) $menu = wp_get_nav_menu_object( $locations[ $args->theme_location ] );
$menu = wp_get_nav_menu_object( $slots['theme_menu'] );
}
// If we couldn't find a menu based off the menu argument // get the first menu that has items if we still can't find a menu
// get the first menu that has items.
if ( ! $menu ) { if ( ! $menu ) {
$menus = wp_get_nav_menus(); $menus = wp_get_nav_menus();
foreach ( $menus as $menu_maybe ) { foreach ( $menus as $menu_maybe ) {

View File

@ -66,24 +66,34 @@ function is_nav_menu( $menu ) {
* *
* @since 3.0.0 * @since 3.0.0
* *
* @param array Associative array of menu slot identifiers and descriptions. * @param array $locations Associative array of menu location identifiers (like a slug) and descriptive text.
*/ */
function register_nav_menus( $menus = array() ) { function register_nav_menus( $locations = array() ) {
global $_wp_registered_nav_menus; global $_wp_registered_nav_menus;
add_theme_support( 'nav-menus' ); add_theme_support( 'nav-menus' );
$_wp_registered_nav_menus = $menus; $_wp_registered_nav_menus = array_merge( (array) $_wp_registered_nav_menus, $locations );
}
/**
* Register nav menu for a theme.
*
* @since 3.0.0
*
* @param string $location Menu location identifier, like a slug.
* @param string $description Menu location descriptive text.
*/
function register_nav_menu( $location, $description ) {
register_nav_menus( array( $location => $description ) );
} }
function get_registered_nav_menus() { function get_registered_nav_menus() {
global $_wp_registered_nav_menus; return $GLOBALS['_wp_registered_nav_menus'];
return $_wp_registered_nav_menus;
} }
function get_nav_menu_slots() { function get_nav_menu_locations() {
return get_theme_mod('nav_menu_slots'); return get_theme_mod('nav_menu_locations');
} }
/** /**

View File

@ -476,7 +476,7 @@ function wp_default_styles( &$styles ) {
$styles->add( 'farbtastic', '/wp-admin/css/farbtastic.css', array(), '1.2' ); $styles->add( 'farbtastic', '/wp-admin/css/farbtastic.css', array(), '1.2' );
$styles->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.css', array(), '0.9.8' ); $styles->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.css', array(), '0.9.8' );
$styles->add( 'imgareaselect', '/wp-includes/js/imgareaselect/imgareaselect.css', array(), '0.9.1' ); $styles->add( 'imgareaselect', '/wp-includes/js/imgareaselect/imgareaselect.css', array(), '0.9.1' );
$styles->add( 'nav-menu', "/wp-admin/css/nav-menu$suffix.css", array(), '20100512' ); $styles->add( 'nav-menu', "/wp-admin/css/nav-menu$suffix.css", array(), '20100514' );
foreach ( $rtl_styles as $rtl_style ) { foreach ( $rtl_styles as $rtl_style ) {
$styles->add_data( $rtl_style, 'rtl', true ); $styles->add_data( $rtl_style, 'rtl', true );