2010-02-20 16:57:43 -05:00
< ? php
/**
2010-02-23 15:38:27 -05:00
* WordPress Administration for Navigation Menus
2010-02-20 16:57:43 -05:00
* Interface functions
*
2010-02-27 18:06:56 -05:00
* @ version 2.0 . 0
2010-02-20 16:57:43 -05:00
*
* @ package WordPress
* @ subpackage Administration
*/
2010-02-20 19:03:42 -05:00
2010-03-15 12:26:46 -04:00
/** Load WordPress Administration Bootstrap */
2010-04-26 21:05:58 -04:00
require_once ( 'admin.php' );
2010-02-20 16:57:43 -05:00
2010-03-22 15:56:16 -04:00
// Load all the nav menu interface functions
require_once ( ABSPATH . 'wp-admin/includes/nav-menu.php' );
2010-05-24 05:23:56 -04:00
if ( ! current_theme_supports ( 'nav-menus' ) && ! current_theme_supports ( 'widgets' ) )
wp_die ( __ ( 'Your theme does not support navigation menus or widgets.' ) );
2010-03-15 12:26:46 -04:00
// Permissions Check
2010-05-12 15:19:57 -04:00
if ( ! current_user_can ( 'edit_theme_options' ) )
wp_die ( __ ( 'Cheatin’ uh?' ) );
2010-02-23 15:48:50 -05:00
2010-03-15 12:26:46 -04:00
// Nav Menu CSS
2010-02-25 12:10:00 -05:00
wp_admin_css ( 'nav-menu' );
2010-03-15 12:26:46 -04:00
// jQuery
2010-02-20 18:35:05 -05:00
wp_enqueue_script ( 'jquery' );
2010-02-20 19:10:20 -05:00
wp_enqueue_script ( 'jquery-ui-draggable' );
wp_enqueue_script ( 'jquery-ui-droppable' );
wp_enqueue_script ( 'jquery-ui-sortable' );
2010-03-15 12:26:46 -04:00
// Nav Menu functions
2010-03-17 12:13:16 -04:00
wp_enqueue_script ( 'nav-menu' );
2010-03-15 12:26:46 -04:00
// Metaboxes
wp_enqueue_script ( 'common' );
wp_enqueue_script ( 'wp-lists' );
wp_enqueue_script ( 'postbox' );
// Container for any messages displayed to the user
2010-04-29 03:33:56 -04:00
$messages = array ();
2010-03-01 22:59:28 -05:00
2010-03-15 12:26:46 -04:00
// Container that stores the name of the active menu
$nav_menu_selected_title = '' ;
2010-02-24 01:41:35 -05:00
2010-03-15 12:26:46 -04:00
// The menu id of the current menu being edited
$nav_menu_selected_id = isset ( $_REQUEST [ 'menu' ] ) ? ( int ) $_REQUEST [ 'menu' ] : 0 ;
2010-02-25 16:06:44 -05:00
2010-03-15 12:26:46 -04:00
// Allowed actions: add, update, delete
$action = isset ( $_REQUEST [ 'action' ] ) ? $_REQUEST [ 'action' ] : 'edit' ;
2010-02-25 16:06:44 -05:00
2010-03-15 12:26:46 -04:00
switch ( $action ) {
2010-04-26 21:05:58 -04:00
case 'add-menu-item' :
2010-05-12 15:19:57 -04:00
check_admin_referer ( 'add-menu_item' , 'menu-settings-column-nonce' );
2010-05-14 02:20:30 -04:00
if ( isset ( $_REQUEST [ 'nav-menu-locations' ] ) )
set_theme_mod ( 'nav_menu_locations' , $_REQUEST [ 'menu-locations' ] );
elseif ( isset ( $_REQUEST [ 'menu-item' ] ) )
2010-05-19 01:59:43 -04:00
wp_save_nav_menu_items ( $nav_menu_selected_id , $_REQUEST [ 'menu-item' ] );
2010-04-26 21:05:58 -04:00
break ;
case 'move-down-menu-item' :
// moving down a menu item is the same as moving up the next in order
check_admin_referer ( 'move-menu_item' );
2010-05-04 15:40:04 -04:00
$menu_item_id = isset ( $_REQUEST [ 'menu-item' ] ) ? ( int ) $_REQUEST [ 'menu-item' ] : 0 ;
2010-04-27 22:04:30 -04:00
if ( is_nav_menu_item ( $menu_item_id ) ) {
2010-04-26 21:05:58 -04:00
$menus = isset ( $_REQUEST [ 'menu' ] ) ? array ( ( int ) $_REQUEST [ 'menu' ] ) : wp_get_object_terms ( $menu_item_id , 'nav_menu' , array ( 'fields' => 'ids' ) );
2010-05-04 15:40:04 -04:00
if ( ! is_wp_error ( $menus ) && ! empty ( $menus [ 0 ] ) ) {
$menu_id = ( int ) $menus [ 0 ];
$ordered_menu_items = wp_get_nav_menu_items ( $menu_id );
$menu_item_data = ( array ) wp_setup_nav_menu_item ( get_post ( $menu_item_id ) );
// setup the data we need in one pass through the array of menu items
$dbids_to_orders = array ();
$orders_to_dbids = array ();
foreach ( ( array ) $ordered_menu_items as $ordered_menu_item_object ) {
if ( isset ( $ordered_menu_item_object -> ID ) ) {
if ( isset ( $ordered_menu_item_object -> menu_order ) ) {
$dbids_to_orders [ $ordered_menu_item_object -> ID ] = $ordered_menu_item_object -> menu_order ;
$orders_to_dbids [ $ordered_menu_item_object -> menu_order ] = $ordered_menu_item_object -> ID ;
2010-04-26 21:05:58 -04:00
}
}
2010-05-04 15:40:04 -04:00
}
// get next in order
2010-05-25 22:42:15 -04:00
if (
2010-05-04 15:40:04 -04:00
isset ( $orders_to_dbids [ $dbids_to_orders [ $menu_item_id ] + 1 ] )
) {
$next_item_id = $orders_to_dbids [ $dbids_to_orders [ $menu_item_id ] + 1 ];
$next_item_data = ( array ) wp_setup_nav_menu_item ( get_post ( $next_item_id ) );
// if not siblings of same parent, bubble menu item up but keep order
2010-05-25 22:42:15 -04:00
if (
2010-05-04 15:40:04 -04:00
! empty ( $menu_item_data [ 'menu_item_parent' ] ) &&
(
empty ( $next_item_data [ 'menu_item_parent' ] ) ||
$next_item_data [ 'menu_item_parent' ] != $menu_item_data [ 'menu_item_parent' ]
)
) {
$parent_db_id = in_array ( $menu_item_data [ 'menu_item_parent' ], $orders_to_dbids ) ? ( int ) $menu_item_data [ 'menu_item_parent' ] : 0 ;
2010-05-25 22:42:15 -04:00
2010-05-04 15:40:04 -04:00
$parent_object = wp_setup_nav_menu_item ( get_post ( $parent_db_id ) );
if ( ! is_wp_error ( $parent_object ) ) {
$parent_data = ( array ) $parent_object ;
2010-05-25 22:42:15 -04:00
$menu_item_data [ 'menu_item_parent' ] = $parent_data [ 'menu_item_parent' ];
2010-05-04 15:40:04 -04:00
update_post_meta ( $menu_item_data [ 'ID' ], '_menu_item_menu_item_parent' , ( int ) $menu_item_data [ 'menu_item_parent' ] );
}
// make menu item a child of its next sibling
} else {
$next_item_data [ 'menu_order' ] = $next_item_data [ 'menu_order' ] - 1 ;
$menu_item_data [ 'menu_order' ] = $menu_item_data [ 'menu_order' ] + 1 ;
2010-04-26 21:05:58 -04:00
2010-05-25 22:42:15 -04:00
$menu_item_data [ 'menu_item_parent' ] = $next_item_data [ 'ID' ];
2010-05-04 15:40:04 -04:00
update_post_meta ( $menu_item_data [ 'ID' ], '_menu_item_menu_item_parent' , ( int ) $menu_item_data [ 'menu_item_parent' ] );
2010-05-25 22:42:15 -04:00
2010-05-04 15:40:04 -04:00
wp_update_post ( $menu_item_data );
wp_update_post ( $next_item_data );
2010-04-26 21:05:58 -04:00
}
2010-05-25 22:42:15 -04:00
2010-05-04 15:40:04 -04:00
// the item is last but still has a parent, so bubble up
2010-05-25 22:42:15 -04:00
} elseif (
2010-05-04 15:40:04 -04:00
! empty ( $menu_item_data [ 'menu_item_parent' ] ) &&
in_array ( $menu_item_data [ 'menu_item_parent' ], $orders_to_dbids )
) {
$menu_item_data [ 'menu_item_parent' ] = ( int ) get_post_meta ( $menu_item_data [ 'menu_item_parent' ], '_menu_item_menu_item_parent' , true );
update_post_meta ( $menu_item_data [ 'ID' ], '_menu_item_menu_item_parent' , ( int ) $menu_item_data [ 'menu_item_parent' ] );
2010-04-26 21:05:58 -04:00
}
}
}
2010-05-04 15:40:04 -04:00
break ;
2010-04-26 21:05:58 -04:00
case 'move-up-menu-item' :
check_admin_referer ( 'move-menu_item' );
2010-05-04 15:40:04 -04:00
$menu_item_id = isset ( $_REQUEST [ 'menu-item' ] ) ? ( int ) $_REQUEST [ 'menu-item' ] : 0 ;
2010-04-27 22:04:30 -04:00
if ( is_nav_menu_item ( $menu_item_id ) ) {
2010-04-26 21:05:58 -04:00
$menus = isset ( $_REQUEST [ 'menu' ] ) ? array ( ( int ) $_REQUEST [ 'menu' ] ) : wp_get_object_terms ( $menu_item_id , 'nav_menu' , array ( 'fields' => 'ids' ) );
2010-05-04 15:40:04 -04:00
if ( ! is_wp_error ( $menus ) && ! empty ( $menus [ 0 ] ) ) {
$menu_id = ( int ) $menus [ 0 ];
$ordered_menu_items = wp_get_nav_menu_items ( $menu_id );
$menu_item_data = ( array ) wp_setup_nav_menu_item ( get_post ( $menu_item_id ) );
// setup the data we need in one pass through the array of menu items
$dbids_to_orders = array ();
$orders_to_dbids = array ();
foreach ( ( array ) $ordered_menu_items as $ordered_menu_item_object ) {
if ( isset ( $ordered_menu_item_object -> ID ) ) {
if ( isset ( $ordered_menu_item_object -> menu_order ) ) {
$dbids_to_orders [ $ordered_menu_item_object -> ID ] = $ordered_menu_item_object -> menu_order ;
$orders_to_dbids [ $ordered_menu_item_object -> menu_order ] = $ordered_menu_item_object -> ID ;
2010-04-26 21:05:58 -04:00
}
}
2010-05-04 15:40:04 -04:00
}
2010-04-26 21:05:58 -04:00
2010-05-04 15:40:04 -04:00
// if this menu item is not first
if ( ! empty ( $dbids_to_orders [ $menu_item_id ] ) && ! empty ( $orders_to_dbids [ $dbids_to_orders [ $menu_item_id ] - 1 ] ) ) {
// if this menu item is a child of the previous
if (
! empty ( $menu_item_data [ 'menu_item_parent' ] ) &&
in_array ( $menu_item_data [ 'menu_item_parent' ], array_keys ( $dbids_to_orders ) ) &&
isset ( $orders_to_dbids [ $dbids_to_orders [ $menu_item_id ] - 1 ] ) &&
( $menu_item_data [ 'menu_item_parent' ] == $orders_to_dbids [ $dbids_to_orders [ $menu_item_id ] - 1 ] )
) {
$parent_db_id = in_array ( $menu_item_data [ 'menu_item_parent' ], $orders_to_dbids ) ? ( int ) $menu_item_data [ 'menu_item_parent' ] : 0 ;
$parent_object = wp_setup_nav_menu_item ( get_post ( $parent_db_id ) );
if ( ! is_wp_error ( $parent_object ) ) {
$parent_data = ( array ) $parent_object ;
// if there is something before the parent and parent a child of it, make menu item a child also of it
2010-05-25 22:42:15 -04:00
if (
! empty ( $dbids_to_orders [ $parent_db_id ] ) &&
2010-05-04 15:40:04 -04:00
! empty ( $orders_to_dbids [ $dbids_to_orders [ $parent_db_id ] - 1 ] ) &&
! empty ( $parent_data [ 'menu_item_parent' ] )
) {
$menu_item_data [ 'menu_item_parent' ] = $parent_data [ 'menu_item_parent' ];
// else if there is something before parent and parent not a child of it, make menu item a child of that something's parent
2010-05-25 22:42:15 -04:00
} elseif (
! empty ( $dbids_to_orders [ $parent_db_id ] ) &&
2010-05-04 15:40:04 -04:00
! empty ( $orders_to_dbids [ $dbids_to_orders [ $parent_db_id ] - 1 ] )
) {
$_possible_parent_id = ( int ) get_post_meta ( $orders_to_dbids [ $dbids_to_orders [ $parent_db_id ] - 1 ], '_menu_item_menu_item_parent' , true );
if ( in_array ( $_possible_parent_id , array_keys ( $dbids_to_orders ) ) )
$menu_item_data [ 'menu_item_parent' ] = $_possible_parent_id ;
else
$menu_item_data [ 'menu_item_parent' ] = 0 ;
// else there isn't something before the parent
} else {
$menu_item_data [ 'menu_item_parent' ] = 0 ;
}
2010-05-03 16:26:11 -04:00
2010-05-04 15:40:04 -04:00
// set former parent's [menu_order] to that of menu-item's
$parent_data [ 'menu_order' ] = $parent_data [ 'menu_order' ] + 1 ;
2010-04-26 21:05:58 -04:00
2010-05-04 15:40:04 -04:00
// set menu-item's [menu_order] to that of former parent
$menu_item_data [ 'menu_order' ] = $menu_item_data [ 'menu_order' ] - 1 ;
2010-05-03 16:26:11 -04:00
2010-05-04 15:40:04 -04:00
// save changes
update_post_meta ( $menu_item_data [ 'ID' ], '_menu_item_menu_item_parent' , ( int ) $menu_item_data [ 'menu_item_parent' ] );
2010-04-26 21:05:58 -04:00
wp_update_post ( $menu_item_data );
2010-05-04 15:40:04 -04:00
wp_update_post ( $parent_data );
2010-04-26 21:05:58 -04:00
}
2010-05-04 15:40:04 -04:00
// else this menu item is not a child of the previous
2010-05-25 22:42:15 -04:00
} elseif (
2010-05-04 15:40:04 -04:00
empty ( $menu_item_data [ 'menu_order' ] ) ||
empty ( $menu_item_data [ 'menu_item_parent' ] ) ||
! in_array ( $menu_item_data [ 'menu_item_parent' ], array_keys ( $dbids_to_orders ) ) ||
empty ( $orders_to_dbids [ $dbids_to_orders [ $menu_item_id ] - 1 ] ) ||
2010-05-25 22:42:15 -04:00
$orders_to_dbids [ $dbids_to_orders [ $menu_item_id ] - 1 ] != $menu_item_data [ 'menu_item_parent' ]
2010-05-04 15:40:04 -04:00
) {
// just make it a child of the previous; keep the order
$menu_item_data [ 'menu_item_parent' ] = ( int ) $orders_to_dbids [ $dbids_to_orders [ $menu_item_id ] - 1 ];
update_post_meta ( $menu_item_data [ 'ID' ], '_menu_item_menu_item_parent' , ( int ) $menu_item_data [ 'menu_item_parent' ] );
wp_update_post ( $menu_item_data );
2010-04-26 21:05:58 -04:00
}
}
}
}
break ;
case 'delete-menu-item' :
$menu_item_id = ( int ) $_REQUEST [ 'menu-item' ];
check_admin_referer ( 'delete-menu_item_' . $menu_item_id );
2010-04-27 22:04:30 -04:00
if ( is_nav_menu_item ( $menu_item_id ) ) {
2010-04-26 21:05:58 -04:00
if ( wp_delete_post ( $menu_item_id , true ) ) {
2010-05-03 16:26:11 -04:00
2010-04-29 03:33:56 -04:00
$messages [] = '<div id="message" class="updated"><p>' . __ ( 'The menu item has been successfully deleted.' ) . '</p></div>' ;
2010-04-26 21:05:58 -04:00
}
}
break ;
2010-03-15 12:26:46 -04:00
case 'delete' :
check_admin_referer ( 'delete-nav_menu-' . $nav_menu_selected_id );
2010-02-23 15:48:50 -05:00
2010-04-26 21:05:58 -04:00
if ( is_nav_menu ( $nav_menu_selected_id ) ) {
2010-05-20 12:57:48 -04:00
$deleted_nav_menu = wp_get_nav_menu_object ( $nav_menu_selected_id );
2010-03-22 15:56:16 -04:00
$delete_nav_menu = wp_delete_nav_menu ( $nav_menu_selected_id );
2010-03-26 15:36:49 -04:00
2010-03-22 15:56:16 -04:00
if ( is_wp_error ( $delete_nav_menu ) ) {
2010-04-29 03:33:56 -04:00
$messages [] = '<div id="message" class="error"><p>' . $delete_nav_menu -> get_error_message () . '</p></div>' ;
2010-03-22 15:56:16 -04:00
} else {
2010-04-29 03:33:56 -04:00
$messages [] = '<div id="message" class="updated"><p>' . __ ( 'The menu has been successfully deleted.' ) . '</p></div>' ;
2010-05-20 12:57:48 -04:00
// Select the next available menu
$nav_menu_selected_id = 0 ;
$_nav_menus = wp_get_nav_menus ( array ( 'orderby' => 'name' ) );
foreach ( $_nav_menus as $index => $_nav_menu ) {
if ( strcmp ( $_nav_menu -> name , $deleted_nav_menu -> name ) >= 0
|| $index == count ( $_nav_menus ) - 1 ) {
$nav_menu_selected_id = $_nav_menu -> term_id ;
break ;
}
}
2010-03-22 15:56:16 -04:00
}
2010-05-20 12:57:48 -04:00
unset ( $delete_nav_menu , $deleted_nav_menu , $_nav_menus );
} else {
// Reset the selected menu
$nav_menu_selected_id = 0 ;
unset ( $_REQUEST [ 'menu' ] );
2010-02-23 15:48:50 -05:00
}
2010-03-15 12:26:46 -04:00
break ;
2010-03-17 12:27:25 -04:00
2010-03-15 12:26:46 -04:00
case 'update' :
2010-04-26 21:05:58 -04:00
check_admin_referer ( 'update-nav_menu' , 'update-nav-menu-nonce' );
2010-03-17 12:27:25 -04:00
2010-05-24 05:23:56 -04:00
// Update menu theme locations
2010-05-24 07:15:31 -04:00
if ( isset ( $_POST [ 'menu-locations' ] ) )
set_theme_mod ( 'nav_menu_locations' , $_POST [ 'menu-locations' ] );
2010-05-24 05:23:56 -04:00
2010-03-15 12:26:46 -04:00
// Add Menu
2010-04-26 21:05:58 -04:00
if ( 0 == $nav_menu_selected_id ) {
2010-05-24 05:23:56 -04:00
$new_menu_title = esc_html ( $_POST [ 'menu-name' ] );
2010-03-15 12:26:46 -04:00
2010-05-24 05:23:56 -04:00
if ( $new_menu_title ) {
$_nav_menu_selected_id = wp_update_nav_menu_object ( 0 , array ( 'menu-name' => $new_menu_title ) );
2010-03-15 12:26:46 -04:00
2010-05-24 05:23:56 -04:00
if ( is_wp_error ( $_nav_menu_selected_id ) ) {
$messages [] = '<div id="message" class="error"><p>' . $_nav_menu_selected_id -> get_error_message () . '</p></div>' ;
2010-03-15 12:26:46 -04:00
} else {
2010-05-24 05:23:56 -04:00
if ( ( $_menu_locations = get_registered_nav_menus () ) && 1 == count ( wp_get_nav_menus () ) )
set_theme_mod ( 'nav_menu_locations' , array ( key ( $_menu_locations ) => $_nav_menu_selected_id ) );
unset ( $_menu_locations );
$_menu_object = wp_get_nav_menu_object ( $_nav_menu_selected_id );
$nav_menu_selected_id = $_nav_menu_selected_id ;
$nav_menu_selected_title = $_menu_object -> name ;
$messages [] = '<div id="message" class="updated"><p>' . sprintf ( __ ( 'The <strong>%s</strong> menu has been successfully created.' ), $nav_menu_selected_title ) . '</p></div>' ;
2010-03-15 12:26:46 -04:00
}
2010-05-24 05:23:56 -04:00
} else {
$messages [] = '<div id="message" class="error"><p>' . __ ( 'Please enter a valid menu name.' ) . '</p></div>' ;
2010-03-15 12:26:46 -04:00
}
2010-04-26 21:05:58 -04:00
// update existing menu
2010-03-17 15:57:08 -04:00
} else {
2010-03-26 15:36:49 -04:00
2010-04-26 21:05:58 -04:00
$_menu_object = wp_get_nav_menu_object ( $nav_menu_selected_id );
if ( ! is_wp_error ( $_menu_object ) ) {
2010-04-28 16:44:08 -04:00
$_nav_menu_selected_id = wp_update_nav_menu_object ( $nav_menu_selected_id , array ( 'menu-name' => $_POST [ 'menu-name' ] ) );
if ( is_wp_error ( $_nav_menu_selected_id ) ) {
$_menu_object = $_nav_menu_selected_id ;
2010-04-29 03:33:56 -04:00
$messages [] = '<div id="message" class="error"><p>' . $_nav_menu_selected_id -> get_error_message () . '</p></div>' ;
2010-04-28 16:44:08 -04:00
} else {
$_menu_object = wp_get_nav_menu_object ( $_nav_menu_selected_id );
$nav_menu_selected_title = $_menu_object -> name ;
}
2010-03-17 15:57:08 -04:00
}
2010-03-26 15:36:49 -04:00
2010-03-17 15:57:08 -04:00
// Update menu items
2010-03-26 15:36:49 -04:00
2010-04-26 21:05:58 -04:00
if ( ! is_wp_error ( $_menu_object ) ) {
2010-05-24 15:50:20 -04:00
$unsorted_menu_items = wp_get_nav_menu_items ( $nav_menu_selected_id , array ( 'orderby' => 'ID' , 'output' => ARRAY_A , 'output_key' => 'ID' ) );
$menu_items = array ();
// Index menu items by db ID
foreach ( $unsorted_menu_items as $_item )
$menu_items [ $_item -> db_id ] = $_item ;
2010-05-11 15:52:50 -04:00
$post_fields = array ( 'menu-item-db-id' , 'menu-item-object-id' , 'menu-item-object' , 'menu-item-parent-id' , 'menu-item-position' , 'menu-item-type' , 'menu-item-title' , 'menu-item-url' , 'menu-item-description' , 'menu-item-attr-title' , 'menu-item-target' , 'menu-item-classes' , 'menu-item-xfn' );
2010-05-11 12:41:23 -04:00
wp_defer_term_counting ( true );
2010-04-26 21:05:58 -04:00
// Loop through all the menu items' POST variables
2010-04-28 16:44:08 -04:00
if ( ! empty ( $_POST [ 'menu-item-db-id' ] ) ) {
foreach ( ( array ) $_POST [ 'menu-item-db-id' ] as $_key => $k ) {
// Menu item title can't be blank
2010-04-28 23:43:39 -04:00
if ( empty ( $_POST [ 'menu-item-title' ][ $_key ] ) )
2010-04-28 16:44:08 -04:00
continue ;
2010-04-28 23:43:39 -04:00
$args = array ();
foreach ( $post_fields as $field )
$args [ $field ] = isset ( $_POST [ $field ][ $_key ] ) ? $_POST [ $field ][ $_key ] : '' ;
2010-04-28 16:44:08 -04:00
$menu_item_db_id = wp_update_nav_menu_item ( $nav_menu_selected_id , ( $_POST [ 'menu-item-db-id' ][ $_key ] != $_key ? 0 : $_key ), $args );
2010-05-03 16:26:11 -04:00
if ( is_wp_error ( $menu_item_db_id ) )
2010-04-29 03:33:56 -04:00
$messages [] = '<div id="message" class="error"><p>' . $menu_item_db_id -> get_error_message () . '</p></div>' ;
elseif ( isset ( $menu_items [ $menu_item_db_id ] ) )
2010-04-28 16:44:08 -04:00
unset ( $menu_items [ $menu_item_db_id ] );
2010-03-17 15:57:08 -04:00
}
2010-03-15 12:26:46 -04:00
}
2010-03-17 12:27:25 -04:00
2010-03-17 15:57:08 -04:00
// Remove menu items from the menu that weren't in $_POST
2010-04-27 22:04:30 -04:00
if ( ! empty ( $menu_items ) ) {
2010-03-17 15:57:08 -04:00
foreach ( array_keys ( $menu_items ) as $menu_item_id ) {
2010-04-27 22:04:30 -04:00
if ( is_nav_menu_item ( $menu_item_id ) ) {
wp_delete_post ( $menu_item_id );
}
2010-03-17 15:57:08 -04:00
}
2010-03-15 12:26:46 -04:00
}
2010-03-26 15:36:49 -04:00
2010-05-25 09:49:56 -04:00
// Store 'auto-add' pages.
$auto_add = ! empty ( $_POST [ 'auto-add-pages' ] );
$nav_menu_option = ( array ) get_option ( 'nav_menu_options' );
if ( ! isset ( $nav_menu_option [ 'auto_add' ] ) )
$nav_menu_option [ 'auto_add' ] = array ();
if ( $auto_add ) {
if ( ! in_array ( $nav_menu_selected_id , $nav_menu_option [ 'auto_add' ] ) )
$nav_menu_option [ 'auto_add' ][] = $nav_menu_selected_id ;
} else {
if ( false !== ( $key = array_search ( $nav_menu_selected_id , $nav_menu_option [ 'auto_add' ] ) ) )
unset ( $nav_menu_option [ 'auto_add' ][ $key ] );
}
2010-05-26 01:11:46 -04:00
// Remove nonexistent/deleted menus
$nav_menu_option [ 'auto_add' ] = array_intersect ( $nav_menu_option [ 'auto_add' ], wp_get_nav_menus ( array ( 'fields' => 'ids' ) ) );
2010-05-25 09:49:56 -04:00
update_option ( 'nav_menu_options' , $nav_menu_option );
2010-05-11 12:41:23 -04:00
wp_defer_term_counting ( false );
2010-03-22 15:56:16 -04:00
do_action ( 'wp_update_nav_menu' , $nav_menu_selected_id );
2010-03-26 15:36:49 -04:00
2010-04-29 03:33:56 -04:00
$messages [] = '<div id="message" class="updated"><p>' . sprintf ( __ ( 'The <strong>%s</strong> menu has been updated.' ), $nav_menu_selected_title ) . '</p></div>' ;
2010-05-24 15:50:20 -04:00
unset ( $menu_items , $unsorted_menu_items );
2010-03-15 12:26:46 -04:00
}
}
break ;
2010-02-23 15:48:50 -05:00
}
2010-02-20 19:03:42 -05:00
2010-03-15 12:26:46 -04:00
// Get all nav menus
2010-05-19 14:52:37 -04:00
$nav_menus = wp_get_nav_menus ( array ( 'orderby' => 'name' ) );
2010-03-01 22:59:28 -05:00
2010-03-15 12:26:46 -04:00
// Get recently edited nav menu
2010-04-26 21:05:58 -04:00
$recently_edited = ( int ) get_user_option ( 'nav_menu_recently_edited' );
2010-03-01 22:59:28 -05:00
2010-03-15 12:26:46 -04:00
// If there was no recently edited menu, and $nav_menu_selected_id is a nav menu, update recently edited menu.
2010-04-26 21:05:58 -04:00
if ( ! $recently_edited && is_nav_menu ( $nav_menu_selected_id ) ) {
2010-03-15 12:26:46 -04:00
$recently_edited = $nav_menu_selected_id ;
2010-02-23 15:48:50 -05:00
2010-04-26 21:05:58 -04:00
// Else if $nav_menu_selected_id is not a menu and not requesting that we create a new menu, but $recently_edited is a menu, grab that one.
} elseif ( 0 == $nav_menu_selected_id && ! isset ( $_REQUEST [ 'menu' ] ) && is_nav_menu ( $recently_edited ) ) {
2010-03-15 12:26:46 -04:00
$nav_menu_selected_id = $recently_edited ;
2010-02-25 11:49:57 -05:00
2010-03-15 12:26:46 -04:00
// Else try to grab the first menu from the menus list
2010-04-26 21:05:58 -04:00
} elseif ( 0 == $nav_menu_selected_id && ! isset ( $_REQUEST [ 'menu' ] ) && ! empty ( $nav_menus ) ) {
2010-03-17 12:27:25 -04:00
$nav_menu_selected_id = $nav_menus [ 0 ] -> term_id ;
2010-03-15 12:26:46 -04:00
}
2010-03-01 22:59:28 -05:00
2010-03-15 12:26:46 -04:00
// Update the user's setting
2010-04-26 21:05:58 -04:00
if ( $nav_menu_selected_id != $recently_edited && is_nav_menu ( $nav_menu_selected_id ) )
2010-03-15 12:26:46 -04:00
update_user_meta ( $current_user -> ID , 'nav_menu_recently_edited' , $nav_menu_selected_id );
2010-02-23 18:13:54 -05:00
2010-04-26 21:05:58 -04:00
// If there's a menu, get its name.
if ( ! $nav_menu_selected_title && is_nav_menu ( $nav_menu_selected_id ) ) {
$_menu_object = wp_get_nav_menu_object ( $nav_menu_selected_id );
$nav_menu_selected_title = ! is_wp_error ( $_menu_object ) ? $_menu_object -> name : '' ;
2010-03-15 12:26:46 -04:00
}
2010-02-25 11:49:57 -05:00
2010-05-03 16:40:32 -04:00
// Generate truncated menu names
2010-05-07 16:49:45 -04:00
foreach ( ( array ) $nav_menus as $key => $_nav_menu ) {
2010-05-03 16:40:32 -04:00
$_nav_menu -> truncated_name = trim ( wp_html_excerpt ( $_nav_menu -> name , 40 ) );
if ( $_nav_menu -> truncated_name != $_nav_menu -> name )
$_nav_menu -> truncated_name .= '…' ;
2010-05-07 16:49:45 -04:00
$nav_menus [ $key ] -> truncated_name = $_nav_menu -> truncated_name ;
2010-05-03 16:40:32 -04:00
}
2010-03-22 15:56:16 -04:00
// The theme supports menus
2010-04-26 21:05:58 -04:00
if ( current_theme_supports ( 'nav-menus' ) ) {
2010-04-28 23:43:39 -04:00
// Set up nav menu
wp_nav_menu_setup ();
2010-03-22 15:56:16 -04:00
2010-03-24 14:35:31 -04:00
// The theme does not support menus but supports widgets
} elseif ( current_theme_supports ( 'widgets' ) ) {
2010-04-28 23:43:39 -04:00
// Set up nav menu
wp_nav_menu_setup ();
2010-05-25 11:42:57 -04:00
$messages [] = '<div id="message" class="error"><p>' . __ ( 'The current theme does not natively support menus, but you can use the “Custom Menu” widget to add any menus you create here to the theme’s sidebar.' ) . '</p></div>' ;
2010-02-23 15:48:50 -05:00
}
2010-02-20 19:03:42 -05:00
2010-04-29 14:27:46 -04:00
wp_initial_nav_menu_meta_boxes ();
2010-03-15 12:26:46 -04:00
// Get the admin header
2010-04-26 21:05:58 -04:00
require_once ( 'admin-header.php' );
2010-02-23 15:48:50 -05:00
?>
2010-04-28 09:37:15 -04:00
< div class = " wrap " >
2010-02-24 19:03:42 -05:00
< ? php screen_icon (); ?>
2010-02-27 18:06:56 -05:00
< h2 >< ? php esc_html_e ( 'Menus' ); ?> </h2>
2010-05-03 16:26:11 -04:00
< ? php
2010-04-29 03:33:56 -04:00
foreach ( $messages as $message ) :
2010-05-03 16:26:11 -04:00
echo $message . " \n " ;
2010-04-29 03:33:56 -04:00
endforeach ;
?>
2010-04-28 23:43:39 -04:00
< div id = " nav-menus-frame " >
2010-04-26 21:05:58 -04:00
< div id = " menu-settings-column " class = " metabox-holder " >
< form id = " nav-menu-meta " action = " <?php echo admin_url( 'nav-menus.php' ); ?> " class = " nav-menu-meta " method = " post " enctype = " multipart/form-data " >
< input type = " hidden " name = " menu " id = " nav-menu-meta-object-id " value = " <?php echo esc_attr( $nav_menu_selected_id ); ?> " />
< input type = " hidden " name = " action " value = " add-menu-item " />
< ? php wp_nonce_field ( 'add-menu_item' , 'menu-settings-column-nonce' ); ?>
< ? php do_meta_boxes ( 'nav-menus' , 'side' , null ); ?>
</ form >
</ div ><!-- / #menu-settings-column -->
2010-04-27 12:04:18 -04:00
< div id = " menu-management-liquid " >
2010-04-28 23:43:39 -04:00
< div id = " menu-management " >
2010-05-02 19:51:43 -04:00
< div id = " select-nav-menu-container " class = " hide-if-js " >
2010-05-06 15:19:53 -04:00
< form id = " select-nav-menu " action = " " >
2010-05-14 02:38:01 -04:00
< strong >< label for = " select-nav-menu " >< ? php esc_html_e ( 'Select Menu:' ); ?> </label></strong>
2010-05-06 15:19:53 -04:00
< select class = " select-nav-menu " name = " menu " >
2010-05-02 19:51:43 -04:00
< ? php foreach ( ( array ) $nav_menus as $_nav_menu ) : ?>
< option value = " <?php echo esc_attr( $_nav_menu->term_id ) ?> " < ? php selected ( $nav_menu_selected_id , $_nav_menu -> term_id ); ?> >
2010-05-03 16:40:32 -04:00
< ? php echo esc_html ( $_nav_menu -> truncated_name ); ?>
2010-05-02 19:51:43 -04:00
</ option >
< ? php endforeach ; ?>
< option value = " 0 " >< ? php esc_html_e ( 'Add New Menu' ); ?> </option>
</ select >
< input type = " hidden " name = " action " value = " edit " />
< input class = " button-secondary " name = " select_menu " type = " submit " value = " <?php esc_attr_e('Select'); ?> " />
</ form >
</ div >
2010-05-03 06:28:35 -04:00
< div class = " nav-tabs-wrapper " >
2010-04-28 23:43:39 -04:00
< div class = " nav-tabs " >
2010-05-03 16:26:11 -04:00
< ? php
2010-04-27 12:04:18 -04:00
foreach ( ( array ) $nav_menus as $_nav_menu ) :
2010-05-17 12:43:41 -04:00
if ( $nav_menu_selected_id == $_nav_menu -> term_id ) : ?> <span class="nav-tab nav-tab-active">
2010-05-15 15:18:35 -04:00
< ? php echo esc_html ( $_nav_menu -> truncated_name ); ?>
2010-05-17 12:43:41 -04:00
</ span >< ? php else : ?> <a href="<?php
2010-05-15 15:18:35 -04:00
echo esc_url ( add_query_arg (
array (
'action' => 'edit' ,
'menu' => $_nav_menu -> term_id ,
),
admin_url ( 'nav-menus.php' )
));
?> " class="nav-tab hide-if-no-js">
< ? php echo esc_html ( $_nav_menu -> truncated_name ); ?>
2010-05-17 12:43:41 -04:00
</ a >< ? php endif ;
2010-04-27 12:04:18 -04:00
endforeach ;
2010-05-17 12:43:41 -04:00
if ( 0 == $nav_menu_selected_id ) : ?> <span class="nav-tab menu-add-new nav-tab-active">
< ? php printf ( '<abbr title="%s">+</abbr>' , esc_html__ ( 'Add menu' ) ); ?>
</ span >< ? php else : ?> <a href="<?php
2010-05-06 15:19:53 -04:00
echo esc_url ( add_query_arg (
2010-04-26 21:05:58 -04:00
array (
'action' => 'edit' ,
2010-04-27 12:04:18 -04:00
'menu' => 0 ,
2010-04-26 21:05:58 -04:00
),
admin_url ( 'nav-menus.php' )
2010-05-06 15:19:53 -04:00
));
2010-05-17 12:43:41 -04:00
?> " class="nav-tab menu-add-new">
< ? php printf ( '<abbr title="%s">+</abbr>' , esc_html__ ( 'Add menu' ) ); ?>
</ a >< ? php endif ; ?>
2010-04-28 23:43:39 -04:00
</ div >
2010-05-03 06:28:35 -04:00
</ div >
2010-04-27 12:04:18 -04:00
< div class = " menu-edit " >
< form id = " update-nav-menu " action = " <?php echo admin_url( 'nav-menus.php' ); ?> " method = " post " enctype = " multipart/form-data " >
2010-04-28 23:43:39 -04:00
< div id = " nav-menu-header " >
< div id = " submitpost " class = " submitbox " >
< div class = " major-publishing-actions " >
< label class = " menu-name-label howto open-label " for = " menu-name " >
< span >< ? php _e ( 'Menu Name' ); ?> </span>
2010-05-15 23:49:50 -04:00
< input name = " menu-name " id = " menu-name " type = " text " class = " menu-name regular-text menu-item-textbox input-with-default-title " title = " <?php esc_attr_e('Enter menu name here.'); ?> " value = " <?php echo esc_attr( $nav_menu_selected_title ); ?> " />
2010-04-27 12:04:18 -04:00
</ label >
2010-05-13 18:57:42 -04:00
2010-04-28 23:43:39 -04:00
< div class = " publishing-action " >
2010-05-13 21:32:48 -04:00
< input class = " button-primary menu-save " name = " save_menu " type = " submit " value = " <?php empty( $nav_menu_selected_id ) ? esc_attr_e('Create Menu') : esc_attr_e('Save Menu'); ?> " />
2010-04-28 23:43:39 -04:00
</ div ><!-- END . publishing - action -->
2010-05-03 16:26:11 -04:00
2010-04-28 23:43:39 -04:00
< ? php if ( ! empty ( $nav_menu_selected_id ) ) : ?>
< div class = " delete-action " >
2010-05-06 15:19:53 -04:00
< a class = " submitdelete deletion menu-delete " href = " <?php echo esc_url( wp_nonce_url( admin_url('nav-menus.php?action=delete&menu=' . $nav_menu_selected_id ), 'delete-nav_menu-' . $nav_menu_selected_id ) ); ?> " >< ? php _e ( 'Delete Menu' ); ?> </a>
2010-04-28 23:43:39 -04:00
</ div ><!-- END . delete - action -->
< ? php endif ; ?>
2010-05-25 09:49:56 -04:00
< ? php if ( ! empty ( $nav_menu_selected_id ) ) :
if ( ! isset ( $auto_add ) ) {
$auto_add = get_option ( 'nav_menu_options' );
if ( ! isset ( $auto_add [ 'auto_add' ] ) )
$auto_add = false ;
elseif ( false !== array_search ( $nav_menu_selected_id , $auto_add [ 'auto_add' ] ) )
$auto_add = true ;
else
$auto_add = false ;
2010-05-25 22:42:15 -04:00
}
2010-05-25 09:49:56 -04:00
?>
< div class = " auto-add-pages " >
< label class = " howto " >< input type = " checkbox " < ? php checked ( $auto_add ); ?> name="auto-add-pages" value="1" /> <?php printf( __('Automatically add new top-level pages to this menu' ), esc_url( admin_url( 'edit.php?post_type=page' ) ) ); ?></label>
</ div >
< ? php endif ; ?>
2010-04-28 23:43:39 -04:00
</ div ><!-- END . major - publishing - actions -->
</ div ><!-- END #submitpost .submitbox-->
2010-05-24 15:50:20 -04:00
< ? php
wp_nonce_field ( 'closedpostboxes' , 'closedpostboxesnonce' , false );
wp_nonce_field ( 'meta-box-order' , 'meta-box-order-nonce' , false );
wp_nonce_field ( 'update-nav_menu' , 'update-nav-menu-nonce' );
?>
2010-04-28 23:43:39 -04:00
< input type = " hidden " name = " action " value = " update " />
< input type = " hidden " name = " menu " id = " menu " value = " <?php echo esc_attr( $nav_menu_selected_id ); ?> " />
</ div ><!-- END #nav-menu-header-->
2010-04-27 12:04:18 -04:00
< div id = " post-body " >
< div id = " post-body-content " >
2010-05-24 05:23:56 -04:00
< ? php if ( is_nav_menu ( $nav_menu_selected_id ) ) : ?>
2010-04-27 12:04:18 -04:00
< ul class = " menu " id = " menu-to-edit " >
2010-05-03 16:26:11 -04:00
< ? php
$edit_markup = wp_get_nav_menu_to_edit ( $nav_menu_selected_id );
2010-04-27 12:04:18 -04:00
if ( ! is_wp_error ( $edit_markup ) ) {
echo $edit_markup ;
}
?>
</ ul >
2010-04-27 13:40:48 -04:00
< ? php elseif ( empty ( $nav_menu_selected_id ) ) :
2010-04-29 01:12:12 -04:00
echo '<div class="post-body-plain">' ;
2010-05-02 14:15:41 -04:00
echo '<p>' . __ ( 'To create a custom menu, give it a name above and click Create Menu. Then choose items like pages, categories or custom links from the left column to add to this menu.' ) . '</p>' ;
echo '<p>' . __ ( 'After you have added your items, drag and drop to put them in the order you want. You can also click each item to reveal additional configuration options.' ) . '</p>' ;
echo '<p>' . __ ( 'When you have finished building your custom menu, make sure you click the Save Menu button.' ) . '</p>' ;
2010-04-27 13:40:48 -04:00
echo '<p>' . __ ( 'You can create multiple menus. You can also display custom menus using the new "Custom Menu" widget.' ) . '</p>' ;
2010-04-29 01:12:12 -04:00
echo '<p>' . sprintf ( __ ( 'For more information on this feature, see the <a href="%s">Custom Menus</a> article in the Codex.' ), _x ( 'http://codex.wordpress.org/Custom_Menus' , 'Custom Menus codex page' ) ) . '</p>' ;
echo '</div>' ;
2010-04-27 13:40:48 -04:00
endif ; ?>
2010-04-27 12:04:18 -04:00
</ div ><!-- / #post-body-content-->
</ div ><!--- / #post-body -->
</ form ><!--/ #update-nav-menu-->
</ div ><!-- /. menu - edit -->
</ div ><!-- / #menu-management -->
</ div ><!-- / #menu-management-liquid -->
2010-04-28 23:43:39 -04:00
</ div ><!-- / #nav-menus-frame-->
2010-02-24 19:03:42 -05:00
</ div ><!-- /. wrap -->
2010-02-23 15:48:50 -05:00
2010-04-26 21:05:58 -04:00
< ? php include ( 'admin-footer.php' ); ?>