ed52a823cc
git-svn-id: https://develop.svn.wordpress.org/trunk@13473 602fd350-edb4-49c9-b593-d223f7449a82
467 lines
17 KiB
PHP
467 lines
17 KiB
PHP
<?php
|
|
/**
|
|
* WordPress Administration for Navigation Menus
|
|
* Interface functions
|
|
*
|
|
* @version 2.0.0
|
|
*
|
|
* @package WordPress
|
|
* @subpackage Administration
|
|
*/
|
|
|
|
require_once('admin.php');
|
|
|
|
/*
|
|
TODO
|
|
Add caps: edit_menus, delete_menus
|
|
*/
|
|
if ( ! current_user_can('switch_themes') )
|
|
wp_die( __( 'Cheatin’ uh?' ));
|
|
|
|
wp_admin_css( 'nav-menu' );
|
|
wp_enqueue_script( 'jquery' );
|
|
wp_enqueue_script( 'jquery-ui-draggable' );
|
|
wp_enqueue_script( 'jquery-ui-droppable' );
|
|
wp_enqueue_script( 'jquery-ui-sortable' );
|
|
wp_enqueue_script( 'jquery-ui-dialog' );
|
|
wp_enqueue_script( 'nav-menu-dynamic-functions' );
|
|
wp_enqueue_script( 'nav-menu-default-items' );
|
|
wp_enqueue_script( 'jquery-autocomplete' );
|
|
wp_enqueue_script( 'nav-menu-php-functions' );
|
|
add_thickbox();
|
|
|
|
require_once( 'admin-header.php' );
|
|
require_once( ABSPATH . 'wp-admin/includes/nav-menu.php' );
|
|
|
|
function wp_reset_nav_menu() {
|
|
wp_nav_menu_setup( true );
|
|
return true;
|
|
}
|
|
|
|
$messages_div = '';
|
|
$menu_id_in_edit = 0;
|
|
$updated = false;
|
|
$advanced_option_descriptions = 'no';
|
|
|
|
// Get all menu link items
|
|
$available_links = new WP_Query( array( 'post_status' => 'any', 'post_type' => 'nav_menu_item', 'meta_key' => 'menu_type', 'meta_value' => 'custom' ) );
|
|
|
|
// Check which menu is selected and if menu is in edit already
|
|
if ( isset( $_GET['edit-menu'] ) ) {
|
|
$menu_selected_id = (int) $_GET['edit-menu'];
|
|
$updated = true;
|
|
} elseif ( isset( $_POST[ 'menu-id-in-edit' ] ) ) {
|
|
$menu_selected_id = (int) $_POST[ 'menu-id-in-edit' ];
|
|
} else {
|
|
$menu_selected_id = 0;
|
|
}
|
|
|
|
// Delete a menu
|
|
if ( isset($_GET['delete-menu']) && $_GET['delete-menu'] > 0 ) {
|
|
// if ( ! current_user_can('delete_menus') )
|
|
// wp_die( __( 'Cheatin’ uh?' ));
|
|
|
|
$menu_id = (int) $_GET['delete-menu'];
|
|
check_admin_referer( 'delete_menu-' . $menu_id );
|
|
|
|
wp_delete_nav_menu( $menu_id );
|
|
$messages_div = '<div id="message" class="updated fade below-h2"><p>' . __('Menu successfully deleted.') . '</p></div>';
|
|
$menu_selected_id = 0;
|
|
$updated = true;
|
|
}
|
|
|
|
// Default Menu to show
|
|
$menus = wp_get_nav_menus();
|
|
|
|
if ( empty($menus) && empty($_POST) ) {
|
|
wp_create_default_nav_menu();
|
|
$menus = wp_get_nav_menus();
|
|
}
|
|
|
|
if ( ! $menu_selected_id && ! empty($menus) )
|
|
$menu_selected_id = $menus[0]->term_id;
|
|
|
|
// Get the name of the current Menu
|
|
$menu_title = '';
|
|
$valid_menu = false;
|
|
if ( $menu_selected_id > 0 ) {
|
|
foreach ( $menus as $menu ) {
|
|
if ( $menu->term_id == $menu_selected_id ) {
|
|
$menu_title = $menu->name;
|
|
$valid_menu = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( isset( $_POST['li-count'] ) )
|
|
$post_counter = $_POST['li-count'];
|
|
else
|
|
$post_counter = 0;
|
|
|
|
// Create a new menu. Menus are stored as terms in the 'menu' taxonomy.
|
|
if ( isset( $_POST['create-menu'] ) && ! $updated ) {
|
|
$insert_menu_name = $_POST['create-menu-name'];
|
|
|
|
if ( $insert_menu_name ) {
|
|
$menu = wp_create_nav_menu( $insert_menu_name );
|
|
if ( is_wp_error( $menu ) ) {
|
|
$messages_div = '<div id="message" class="error fade below-h2"><p>' . $menu->get_error_message() . '</p></div>';
|
|
} else {
|
|
$menus[$menu->term_id] = $menu;
|
|
$menu_selected_id = $menu->term_id;
|
|
$menu_id_in_edit = $menu_selected_id;
|
|
$menu_title = $menu->name;
|
|
$messages_div = '<div id="message" class="updated fade below-h2"><p>' . sprintf( __('“%s” menu has been created.'), esc_html( $menu->name ) ) . '</p></div>';
|
|
$post_counter = 0;
|
|
}
|
|
} else {
|
|
$messages_div = '<div id="message" class="error fade below-h2"><p>' . __('Please enter a valid menu name.') . '</p></div>';
|
|
}
|
|
$updated = true;
|
|
}
|
|
|
|
if ( $post_counter > 0 && $menu_selected_id > 0 && ! $updated ) {
|
|
$menu_items = wp_get_nav_menu_items( $menu_selected_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID') );
|
|
$parent_menu_ids = array();
|
|
|
|
// Loop through all POST variables
|
|
for ( $k = 1; $k <= $post_counter; $k++ ) {
|
|
$db_id = isset( $_POST['dbid'.$k] )? $_POST['dbid'.$k] : 0;
|
|
$object_id = isset( $_POST['postmenu'.$k] )? $_POST['postmenu'.$k] : 0;
|
|
$parent_id = isset( $_POST['parent'.$k] )? $_POST['parent'.$k] : 0;
|
|
$custom_title = isset( $_POST['item-title'.$k] )? $_POST['item-title'.$k] : '';
|
|
$custom_linkurl = ( isset( $_POST['item-url'.$k] ) && 'custom' == $_POST['linktype'.$k] ) ? $_POST['item-url'.$k] : '';
|
|
$custom_description = isset( $_POST['item-description'.$k] )? $_POST['item-description'.$k] : '';
|
|
// doesn't seem to be used by UI
|
|
$icon = isset( $_POST['icon'.$k] )? $_POST['icon'.$k] : 0;
|
|
$position = isset( $_POST['position'.$k] )? $_POST['position'.$k] : 0;
|
|
$linktype = isset( $_POST['linktype'.$k] )? $_POST['linktype'.$k] : 'custom';
|
|
$custom_anchor_title = isset( $_POST['item-attr-title'.$k] )? $_POST['item-attr-title'.$k] : $custom_title;
|
|
$new_window = isset( $_POST['item-target'.$k] )? $_POST['item-target'.$k] : 0;
|
|
|
|
$post = array( 'post_status' => 'publish', 'post_type' => 'nav_menu_item', 'post_author' => $user_ID,
|
|
'ping_status' => 0, 'post_parent' => 0, 'menu_order' => $position,
|
|
'post_excerpt' => $custom_anchor_title, 'tax_input' => array( 'nav_menu' => $menu_title ),
|
|
'post_content' => $custom_description, 'post_title' => $custom_title );
|
|
|
|
if ( $parent_id > 0 && isset( $parent_menu_ids[$parent_id] ) )
|
|
$post['post_parent'] = $parent_menu_ids[$parent_id];
|
|
|
|
// New menu item
|
|
if ( $db_id == 0 ) {
|
|
$db_id = wp_insert_post( $post );
|
|
} elseif ( isset( $menu_items[$db_id] ) ) {
|
|
$post['ID'] = $db_id;
|
|
wp_update_post( $post );
|
|
unset( $menu_items[$db_id] );
|
|
}
|
|
$parent_menu_ids[ $k ] = $db_id;
|
|
|
|
update_post_meta( $db_id, 'menu_type', $linktype );
|
|
update_post_meta( $db_id, 'object_id', $object_id );
|
|
if ( $new_window )
|
|
update_post_meta( $db_id, 'menu_new_window', 1 );
|
|
else
|
|
update_post_meta( $db_id, 'menu_new_window', 0 );
|
|
if ( $custom_linkurl )
|
|
update_post_meta( $db_id, 'menu_link', esc_url_raw( $custom_linkurl ) );
|
|
|
|
}
|
|
if ( !empty( $menu_items ) ) {
|
|
foreach ( array_keys( $menu_items ) as $menu_id ) {
|
|
wp_delete_post( $menu_id );
|
|
}
|
|
}
|
|
$messages_div = '<div id="message" class="updated fade below-h2"><p>' . __('The menu has been updated.') . '</p></div>';
|
|
}
|
|
|
|
?>
|
|
<div class="wrap">
|
|
<?php screen_icon(); ?>
|
|
<h2><?php esc_html_e('Menus'); ?></h2>
|
|
<?php echo $messages_div; ?>
|
|
<div class="hide-if-js error"><p><?php _e('You do not have JavaScript enabled in your browser. Please enable it to access the Menus functionality.'); ?></p></div>
|
|
|
|
<form onsubmit="wp_update_post_data();" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data">
|
|
<?php if ( !empty($menus) && count($menus) > 1 ) : ?>
|
|
<ul class="subsubsub">
|
|
<?php
|
|
foreach ( $menus as $menu ) {
|
|
$sep = end( $menus ) == $menu ? '' : ' | ';
|
|
if ( ( $menu_id_in_edit == $menu->term_id ) || ( $menu_selected_id == $menu->term_id ) ) { ?>
|
|
<li><a href='nav-menus.php?edit-menu=<?php echo esc_attr($menu->term_id); ?>' class="current"><?php echo esc_html( $menu->name ); ?></a><?php echo $sep; ?></li>
|
|
<?php } else { ?>
|
|
<li><a href='nav-menus.php?edit-menu=<?php echo esc_attr($menu->term_id); ?>'><?php echo esc_html( $menu->name ); ?></a><?php echo $sep; ?></li>
|
|
<?php }
|
|
}
|
|
?>
|
|
</ul>
|
|
<?php endif; ?>
|
|
|
|
<div id="menu-management" class="metabox-holder has-right-sidebar">
|
|
<div id="post-body">
|
|
<div id="post-body-content">
|
|
<div id="normal-sortables" class="meta-box-sortables ui-sortable">
|
|
<?php if ( $valid_menu and ! empty( $menus ) ) : ?>
|
|
<div id="menu-container" class="postbox">
|
|
<h3 class="hndle"><?php echo esc_html( $menu_title ); ?></h3>
|
|
<div class="inside">
|
|
<input type="hidden" name="li-count" id="li-count" value="0" />
|
|
<input type="hidden" name="menu-id-in-edit" id="menu-id-in-edit" value="<?php echo esc_attr( $menu_selected_id ); ?>" />
|
|
|
|
<ul id="menu">
|
|
<?php
|
|
if ( $menu_selected_id > 0 ) {
|
|
wp_print_nav_menu( array( 'type' => 'backend', 'name' => $menu_title, 'id' => $menu_selected_id ) );
|
|
}
|
|
?>
|
|
</ul><!-- /#menu-->
|
|
|
|
<div id="queue" class="hide">
|
|
</div><!--/#queue-->
|
|
</div><!-- /.inside -->
|
|
<!-- /#nav-menu-canvas .postbox-->
|
|
</div>
|
|
<p>
|
|
<script type="text/javascript">
|
|
wp_update_post_data();
|
|
</script>
|
|
<a class="submitdelete deletion" href="<?php echo wp_nonce_url( admin_url('nav-menus.php?delete-menu=' . $menu_selected_id), 'delete_menu-' . $menu_selected_id ); ?>"><?php _e('Delete Menu'); ?></a>
|
|
<input class="button-primary save" name="save_menu" type="submit" value="<?php esc_attr_e('Save All Changes'); ?>" />
|
|
<br class="clear" />
|
|
</p>
|
|
<?php endif; ?>
|
|
</div><!-- /#normal-sortables-->
|
|
</div><!-- /#post-body-content-->
|
|
</div><!--- /#post-body -->
|
|
<div id="menu-settings-column" class="inner-sidebar">
|
|
<div id="side-sortables" class="meta-box-sortables ui-sortable">
|
|
|
|
<div id="create-menu" class="postbox">
|
|
<h3 class="hndle"><?php esc_html_e('Create Menu'); ?></h3>
|
|
<div class="inside">
|
|
<p>
|
|
<input type="text" name="create-menu-name" id="create-menu-name" class="regular-text" value="" />
|
|
<input type="submit" name="create-menu" id="create-menu" class="button" value="<?php esc_attr_e('Create Menu'); ?>" />
|
|
</p>
|
|
</div><!-- /.inside-->
|
|
</div><!--END #create-menu-->
|
|
|
|
<div id="add-custom-link" class="postbox">
|
|
<h3 class="hndle"><?php esc_html_e('Add a Custom Link'); ?></h3>
|
|
<div class="inside">
|
|
<p id="menu-item-url-wrap">
|
|
<label class="howto" for="menu-item-url">
|
|
<span><?php _e('URL'); ?></span>
|
|
<input id="menu-item-url" name="menu-item-url" type="text" class="code" value="http://" />
|
|
</label>
|
|
</p>
|
|
<br class="clear" />
|
|
<p id="menu-item-name-wrap">
|
|
<label class="howto" for="custom-menu-item-name">
|
|
<span><?php _e('Text'); ?></span>
|
|
<input id="menu-item-name" type="text" class="regular-text" value="<?php echo esc_attr( __('Menu Item') ); ?>" />
|
|
</label>
|
|
</p>
|
|
|
|
<?php if ( $available_links->posts ) : ?>
|
|
<p class="button-controls">
|
|
<a class="show-all button"><?php _e('View All'); ?></a>
|
|
<a class="hide-all button"><?php _e('Hide All'); ?></a>
|
|
</p>
|
|
<div id="available-links" class="list-wrap">
|
|
<div class="list-container">
|
|
<ul class="list">
|
|
<?php
|
|
foreach ( $available_links->posts as $link ) :
|
|
$url = get_post_meta( $link->ID, 'menu_link' );
|
|
?>
|
|
<li>
|
|
<dl>
|
|
<dt>
|
|
<label class="item-title"><input type="checkbox" id="link-<?php echo esc_attr($link->ID); ?>" name="<?php echo esc_attr($link->post_title); ?>" value="<?php echo esc_attr($url[0]); ?>" /><?php echo esc_html($link->post_title); ?></label>
|
|
</dt>
|
|
</dl>
|
|
</li>
|
|
<?php
|
|
endforeach;
|
|
?>
|
|
</ul>
|
|
</div><!-- /.list-container-->
|
|
</div><!-- /#available-links-->
|
|
<?php endif; ?>
|
|
<p class="add-to-menu">
|
|
<a class="button"><?php _e('Add to Menu'); ?></a>
|
|
</p>
|
|
<br class="clear" />
|
|
</div><!-- /.inside-->
|
|
</div><!-- /#add-custom-link-->
|
|
|
|
<div id="add-pages" class="postbox">
|
|
<h3 class="hndle"><?php esc_html_e('Add an Existing Page'); ?></h3>
|
|
<div class="inside">
|
|
<?php
|
|
$pages_args = array(
|
|
'child_of' => 0, 'sort_order' => 'ASC', 'sort_column' => 'post_title', 'hierarchical' => 1,
|
|
'exclude' => '', 'include' => '', 'meta_key' => '', 'meta_value' => '', 'authors' => '',
|
|
'parent' => -1, 'exclude_tree' => '', 'number' => '', 'offset' => 0
|
|
);
|
|
$page_name = '';
|
|
$pages_array = get_pages( $pages_args );
|
|
if ( $pages_array ) {
|
|
foreach ( $pages_array as $post ) {
|
|
$page_name .= $post->post_title . '|';
|
|
}
|
|
} else {
|
|
$page_name = __('No pages available');
|
|
}
|
|
?>
|
|
<script type="text/javascript" charset="<?php bloginfo('charset'); ?>">
|
|
jQuery(document).ready(function(){
|
|
var posts = "<?php echo esc_js( $page_name ); ?>".split('|');
|
|
jQuery('#add-pages .quick-search').autocomplete(posts);
|
|
|
|
|
|
jQuery('#add-pages .quick-search').result(function(event, data, formatted) {
|
|
jQuery('#add-pages .list-wrap').css('display','block');
|
|
jQuery("#add-pages .list-wrap dt:contains('" + data + "')").css('display','block');
|
|
jQuery('#add-pages .show-all').hide();
|
|
jQuery('#add-pages .hide-all').show();
|
|
});
|
|
});
|
|
</script>
|
|
<p>
|
|
<input type="text" class="quick-search regular-text" value="" />
|
|
<a class="quick-search-submit button"><?php _e('Search'); ?></a>
|
|
</p>
|
|
|
|
<p class="button-controls">
|
|
<a class="show-all button"><?php _e('View All'); ?></a>
|
|
<a class="hide-all button"><?php _e('Hide All'); ?></a>
|
|
</p>
|
|
|
|
<div id="existing-pages" class="list-wrap">
|
|
<div class="list-container">
|
|
<ul class="list">
|
|
<?php $items_counter = wp_nav_menu_get_pages( 0, 'default' ); ?>
|
|
</ul>
|
|
</div><!-- /.list-container-->
|
|
</div><!-- /#existing-pages-->
|
|
<p class="add-to-menu enqueue">
|
|
<a class="button"><?php _e('Add to Menu'); ?></a>
|
|
</p>
|
|
<br class="clear" />
|
|
</div><!-- /.inside-->
|
|
</div><!--END #add-pages-->
|
|
|
|
<div id="add-categories" class="postbox">
|
|
<h3 class="hndle"><?php esc_html_e('Add an Existing Category'); ?></h3>
|
|
<div class="inside">
|
|
<?php
|
|
// Custom GET categories query
|
|
// @todo Use API
|
|
$categories = $wpdb->get_results("SELECT term_id FROM $wpdb->term_taxonomy WHERE taxonomy = 'category' ORDER BY term_id ASC");
|
|
$cat_name = '';
|
|
if ( $categories ) {
|
|
foreach ( $categories as $category ) {
|
|
$cat_id = $category->term_id;
|
|
$cat_args = array(
|
|
'orderby' => 'name',
|
|
'include' => $cat_id,
|
|
'hierarchical' => 1,
|
|
'order' => 'ASC',
|
|
);
|
|
$category_names = get_categories( $cat_args );
|
|
if ( isset( $category_names[0]->name ) ) {
|
|
$cat_name .= htmlentities( $category_names[0]->name ).'|';
|
|
}
|
|
}
|
|
} else {
|
|
$cat_name = __('No categories available');
|
|
}
|
|
?>
|
|
<script type="text/javascript" charset="<?php bloginfo('charset'); ?>">
|
|
jQuery(document).ready(function(){
|
|
var categories = "<?php echo esc_js($cat_name); ?>".split('|');
|
|
jQuery('#add-categories .quick-search').autocomplete(categories);
|
|
jQuery('#add-categories .quick-search').result(function(event, data, formatted) {
|
|
jQuery('#add-categories .list-wrap').css('display','block');
|
|
jQuery("#add-categories .list-wrap dt:contains('" + data + "')").css('display','block');
|
|
jQuery('#add-categories .show-all').hide();
|
|
jQuery('#add-categories .hide-all').show();
|
|
});
|
|
});
|
|
</script>
|
|
<p>
|
|
<input type="text" class="quick-search regular-text" value="" />
|
|
<a class="quick-search-submit button"><?php _e('Search'); ?></a>
|
|
</p>
|
|
|
|
<p class="button-controls">
|
|
<a class="show-all button"><?php _e('View All'); ?></a>
|
|
<a class="hide-all button"><?php _e('Hide All'); ?></a>
|
|
</p>
|
|
|
|
<div id="existing-categories" class="list-wrap">
|
|
<div class="list-container">
|
|
<ul class="list">
|
|
<?php $items_counter = wp_nav_menu_get_categories( $items_counter, 'default' ); ?>
|
|
</ul>
|
|
</div><!-- /.list-container-->
|
|
</div><!-- /#existing-categories-->
|
|
<p class="add-to-menu enqueue">
|
|
<a class="button"><?php _e('Add to Menu'); ?></a>
|
|
</p>
|
|
<br class="clear" />
|
|
</div><!-- /.inside-->
|
|
</div><!--END #add-categories-->
|
|
</div><!-- /#side-sortables-->
|
|
</div><!-- /#menu-settings-column -->
|
|
<br class="clear" />
|
|
</div><!-- /.metabox-holder has-right-sidebar-->
|
|
</form>
|
|
</div><!-- /.wrap-->
|
|
|
|
<div id="menu-item-settings">
|
|
<p class="description">
|
|
<label for="edit-item-title">
|
|
<?php _e( 'Menu Title' ); ?><br />
|
|
<input type="text" id="edit-item-title" class="widefat" name="edit-item-title" value="" tabindex="1" />
|
|
</label>
|
|
</p>
|
|
<p class="description">
|
|
<label for="edit-item-url">
|
|
<?php _e( 'URL' ); ?><br />
|
|
<input type="text" id="edit-item-url" class="widefat code" name="edit-item-url" value="" tabindex="2" />
|
|
</label>
|
|
</p>
|
|
<p class="description">
|
|
<label for="edit-item-attr-title">
|
|
<?php _e( 'Attribute Title' ); ?><br />
|
|
<input type="text" id="edit-item-attr-title" class="widefat" name="edit-item-attr-title" value="" tabindex="3" />
|
|
</label>
|
|
</p>
|
|
<p class="description">
|
|
<label for="edit-item-target">
|
|
<?php _e( 'Open Link in a new window' ); ?><br />
|
|
<select id="edit-item-target" class="widefat" name="edit-item-target">
|
|
<option value="1">Yes</option>
|
|
<option value="0">No</option>
|
|
</select>
|
|
</label>
|
|
</p>
|
|
<p class="description">
|
|
<label for="edit-item-description">
|
|
<?php _e( 'Description' ); ?><br />
|
|
<textarea id="edit-item-description" class="widefat" rows="3" name="edit-item-description" tabindex="4" /></textarea>
|
|
</label>
|
|
</p>
|
|
<p>
|
|
<a id="cancel-save" class="submitdelete deletion"><?php _e('Cancel'); ?></a>
|
|
<a id="update-menu-item" class="save button-primary" tabindex="5"><?php _e('Save Changes'); ?></a>
|
|
</p>
|
|
<input type="hidden" id="edit-item-id" name="edit-item-id" value="" />
|
|
</div><!-- /#menu-item-settings-->
|
|
|
|
<?php include( 'admin-footer.php' ); ?>
|