Make WordPress Core


Ignore:
Timestamp:
03/22/2010 07:56:16 PM (17 years ago)
Author:
nacin
Message:

Various bug fixes and improvements to menu management. props ptahdunbar, see #11817.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/nav-menus.php

    r13748 r13802  
    1313require_once( 'admin.php' );
    1414
     15// Load all the nav menu interface functions
     16require_once( ABSPATH . 'wp-admin/includes/nav-menu.php' );
     17
    1518// Permissions Check
    1619if ( ! current_user_can('switch_themes') )
    … …  
    3841add_thickbox();
    3942
    40 // Load all the nav menu interface functions
    41 require_once( ABSPATH . 'wp-admin/includes/nav-menu.php' );
    42 
    4343// Container for any messages displayed to the user
    4444$messages_div = '';
    … …  
    5858
    5959                if ( is_nav_menu($nav_menu_selected_id) ) {
    60                         wp_delete_nav_menu( $nav_menu_selected_id );
    61                         $messages_div = '<div id="message" class="updated fade below-h2"><p>' . __('Menu successfully deleted.') . '</p></div>';
    62                         $nav_menu_selected_id = 0;
     60                        $delete_nav_menu = wp_delete_nav_menu( $nav_menu_selected_id );
     61                       
     62                        if ( is_wp_error($delete_nav_menu) ) {
     63                                $messages_div = '<div id="message" class="error"><p>' . $delete_nav_menu->get_error_message() . '</p></div>';
     64                        } else {
     65                                $messages_div = '<div id="message" class="updated"><p>' . __('The menu has been successfully deleted.') . '</p></div>';
     66                                $nav_menu_selected_id = 0; // Reset the selected menu
     67                        }
     68                        unset( $delete_nav_menu );
    6369                }
    6470                break;
    … …  
    7682
    7783                                        if ( is_wp_error( $add_nav_menu ) ) {
    78                                                 $messages_div = '<div id="message" class="error fade below-h2"><p>' . $add_nav_menu->get_error_message() . '</p></div>';
     84                                                $messages_div = '<div id="message" class="error"><p>' . $add_nav_menu->get_error_message() . '</p></div>';
    7985                                        } else {
    8086                                                $nav_menu_selected_id = $add_nav_menu->term_id;
    8187                                                $nav_menu_selected_title = $add_nav_menu->name;
    82                                                 $messages_div = '<div id="message" class="updated fade below-h2"><p>' . sprintf( __('The <strong>%s</strong> menu has been successfully created.'), esc_html( $add_nav_menu->name ) ) . '</p></div>';
     88                                                $messages_div = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been successfully created.'), $add_nav_menu->name ) . '</p></div>';
    8389                                        }
    8490                                } else {
    85                                         $messages_div = '<div id="message" class="error fade below-h2"><p>' . __('Please enter a valid menu name.') . '</p></div>';
     91                                        $messages_div = '<div id="message" class="error"><p>' . __('Please enter a valid menu name.') . '</p></div>';
    8692                                }
    87                                 unset($add_nav_menu);
     93                                unset( $add_nav_menu );
    8894                        }
    8995                } else {
     96                       
     97                        // @todo wrap this into wp_update_nav_menu_object();
    9098                        if ( isset($_POST['menu-name']) ) {
    9199                                $old_nav_menu = get_term( $nav_menu_selected_id, 'nav_menu', ARRAY_A );
    … …  
    93101                                $new_nav_menu = wp_update_term( $nav_menu_selected_id, 'nav_menu', $args );
    94102                        }
    95 
     103                       
    96104                        // Update menu items
    97                         $update_nav_items = isset( $_POST['li-count'] ) ? (int) $_POST['li-count'] : 0;
     105                       
     106                        // @todo: wrap update logic into wp_update_nav_menu();
     107                        $update_count = isset( $_POST['li-count'] ) ? (int) $_POST['li-count'] : 0;
    98108                        $update_nav_menu = is_nav_menu( $nav_menu_selected_id );
    99109
    100110                        if ( !is_wp_error($update_nav_menu) ) {
    101111                                $menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID') );
    102                                 $parent_menu_ids = array();
    103 
     112                               
    104113                                // Loop through all POST variables
    105                                 for ( $k = 0; $k < $update_nav_items; $k++ ) {
     114                                for ( $k = 0; $k < $update_count; $k++ ) {
     115                                       
     116                                        // Menu item title can't be blank
     117                                        if ( '' == $_POST['menu-item-title'][$k] )
     118                                                continue;
     119                                       
    106120                                        $menu_item_db_id       = isset( $_POST['menu-item-db-id'][$k] )       ? $_POST['menu-item-db-id'][$k]       : 0;
    107121                                        $menu_item_object_id   = isset( $_POST['menu-item-object-id'][$k] )   ? $_POST['menu-item-object-id'][$k]   : 0;
     122                                        $menu_item_object      = isset( $_POST['menu-item-object'][$k] )      ? $_POST['menu-item-object'][$k]      : '';
    108123                                        $menu_item_parent_id   = isset( $_POST['menu-item-parent-id'][$k] )   ? $_POST['menu-item-parent-id'][$k]   : 0;
    109124                                        $menu_item_position    = isset( $_POST['menu-item-position'][$k] )    ? $_POST['menu-item-position'][$k]    : 0;
    … …  
    114129                                        $menu_item_description = isset( $_POST['menu-item-description'][$k] ) ? $_POST['menu-item-description'][$k] : '';
    115130                                        $menu_item_attr_title  = isset( $_POST['menu-item-attr-title'][$k] )  ? $_POST['menu-item-attr-title'][$k]  : '';
    116                                         $menu_item_target      = isset( $_POST['menu-item-target'][$k] )      ? $_POST['menu-item-target'][$k]      : 0;
     131                                        $menu_item_target      = isset( $_POST['menu-item-target'][$k] )      ? $_POST['menu-item-target'][$k]      : '_self';
    117132                                        $menu_item_classes     = isset( $_POST['menu-item-classes'][$k] )     ? $_POST['menu-item-classes'][$k]     : '';
    118133                                        $menu_item_xfn         = isset( $_POST['menu-item-xfn'][$k] )         ? $_POST['menu-item-xfn'][$k]         : '';
    119134
    120                                         // Menu item title can't be blank
    121                                         if ( '' == $menu_item_title )
    122                                                 continue;
    123 
    124                                         // Populate the menu item
    125                                         $post = array( 'post_status' => 'publish', 'post_type' => 'nav_menu_item', 'post_author' => $user_ID,
    126                                                 'ping_status' => 0, 'post_parent' => $menu_item_parent_id, 'menu_order' => $menu_item_position,
    127                                                 'post_excerpt' => $menu_item_attr_title, 'tax_input' => array( 'nav_menu' => $update_nav_menu->name ),
    128                                                 'post_content' => $menu_item_description, 'post_title' => $menu_item_title );
    129 
     135                                        // Populate the menu item object
     136                                        $post = array(
     137                                                'post_status' => 'publish', 'post_type' => 'nav_menu_item', 'ping_status' => 0,
     138                                                'post_author' => $user_ID, 'tax_input' => array( 'nav_menu' => $update_nav_menu->name ),
     139                                                'post_title' => $menu_item_title, 'post_excerpt' => $menu_item_attr_title,
     140                                                'post_parent' => $menu_item_parent_id, 'menu_order' => $menu_item_position,
     141                                                'post_content' => $menu_item_description,
     142                                        );
     143                                       
    130144                                        // New menu item
    131145                                        if ( $menu_item_db_id == 0 ) {
    132146                                                $menu_item_db_id = wp_insert_post( $post );
    133                                         } elseif ( isset( $menu_items[$menu_item_db_id] ) ) {
     147                                       
     148                                        // Update existing menu item
     149                                        } elseif ( isset($menu_items[$menu_item_db_id]) || ( 'custom' == $menu_item_type && 0 != $menu_item_db_id ) ) {
    134150                                                $post['ID'] = $menu_item_db_id;
    135151                                                wp_update_post( $post );
    136152                                                unset( $menu_items[$menu_item_db_id] );
    137153                                        }
    138                                         $parent_menu_ids[$k] = $menu_item_db_id;
    139 
    140                                         // @todo sanitize type append and ID.
    141                                         update_post_meta( $menu_item_db_id, 'menu_item_type', $menu_item_type );
    142                                         update_post_meta( $menu_item_db_id, 'menu_item_append', $menu_item_append );
    143                                         update_post_meta( $menu_item_db_id, 'menu_item_object_id', $menu_item_object_id );
    144                                         update_post_meta( $menu_item_db_id, 'menu_item_target', sanitize_key($menu_item_target) );
     154
     155                                        update_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key($menu_item_type) );
     156                                        update_post_meta( $menu_item_db_id, '_menu_item_object_id', (int) $menu_item_object_id );
     157                                        update_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key($menu_item_object) );
     158                                        update_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key($menu_item_target) );
    145159                                        // @todo handle sanitizing multiple classes separated by whitespace.
    146                                         update_post_meta( $menu_item_db_id, 'menu_item_classes', sanitize_html_class($menu_item_classes) );
    147                                         update_post_meta( $menu_item_db_id, 'menu_item_xfn', sanitize_html_class($menu_item_xfn) );
     160                                        update_post_meta( $menu_item_db_id, '_menu_item_classes', sanitize_html_class($menu_item_classes) );
     161                                        update_post_meta( $menu_item_db_id, '_menu_item_xfn', sanitize_html_class($menu_item_xfn) );
    148162
    149163                                        // @todo: only save custom link urls.
    150                                         update_post_meta( $menu_item_db_id, 'menu_item_url', esc_url_raw( $menu_item_url ) );
     164                                        update_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($menu_item_url) );
    151165                                }
    152166
    … …  
    157171                                        }
    158172                                }
    159                                 $messages_div = '<div id="message" class="updated fade below-h2"><p>' . __('The menu has been updated.') . '</p></div>';
     173                               
     174                                do_action( 'wp_update_nav_menu', $nav_menu_selected_id );
     175                               
     176                                $messages_div = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been updated.'), $update_nav_menu->name ) . '</p></div>';
     177                                unset( $update_nav_menu, $update_count, $menu_items );
    160178                        }
    161179                }
    … …  
    191209}
    192210
     211// Create Menu Metabox
     212add_meta_box( 'create-menu', __('Create Menu'), 'wp_nav_menu_create_metabox', 'nav-menus', 'side', 'core' );
     213
    193214// The user has no menus.
    194215if ( !is_nav_menu( $nav_menu_selected_id ) ) {
    195         if ( current_theme_supports('nav-menus') ) {
    196                 $messages_div = '<div id="message" class="updated"><p>' . __('You do not have any menus. Create a new menu.') . '</p></div>';
    197         } else {
    198                 $messages_div = '<div id="message" class="error"><p>' . __('The current theme does not support menus.') . '</p></div>';
    199         }
     216        $messages_div = '<div id="message" class="updated"><p>' . __('You do not have any menus. Create a new menu.') . '</p></div>';
     217       
     218// The theme supports menus
     219} elseif ( current_theme_supports('nav-menus') ) {
     220       
     221        // Register nav menu metaboxes
     222        add_meta_box( 'manage-menu', __( 'Menu Settings' ), 'wp_nav_menu_manage_menu_metabox', 'nav-menus', 'side', 'high', array( $nav_menu_selected_id, $nav_menu_selected_title ) );
     223        wp_nav_menu_metaboxes_setup();
     224
     225// The theme does not support menus
    200226} else {
    201         add_meta_box( 'manage-menu', __( 'Menu Settings' ), 'wp_nav_menu_manage_menu_metabox', 'menus', 'side', 'high', array( $nav_menu_selected_id, $nav_menu_selected_title ) );
     227        remove_meta_box( 'create-menu', 'nav-menus', 'side' );
     228        $messages_div = '<div id="message" class="error"><p>' . __('The current theme does not support menus.') . '</p></div>';
    202229}
    203230
    … …  
    211238        <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>
    212239
    213         <?php if ( !empty($nav_menus) && count($nav_menus) > 1 ) : ?>
     240        <?php if ( !empty($nav_menus) && count($nav_menus) > 1 && current_theme_supports('nav-menus') ) : ?>
    214241        <ul class="subsubsub">
    215242                <?php
    … …  
    227254
    228255        <div id="menu-management" class="metabox-holder has-right-sidebar">
    229                 <form id="update-nav-menu" onsubmit="wp_update_post_data();" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data">
     256                <form id="update-nav-menu" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data">
    230257                        <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
    231258                        <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?>
    232259                        <?php wp_nonce_field( 'update-nav_menu' ); ?>
    233260                        <input type="hidden" name="action" value="update" />
    234                         <input type="hidden" name="li-count" id="li-count" value="0" />
     261                        <input type="hidden" name="li-count" id="li-count" value="-1" />
    235262                        <input type="hidden" name="menu" id="menu" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
    236 
     263                        <input type="hidden" id="hidden-metaboxes" value="<?php echo wp_initial_nav_menu_meta_boxes(); ?>" />
    237264                        <div id="post-body">
    238265                                <div id="post-body-content">
    239                                         <?php if ( is_nav_menu($nav_menu_selected_id) ) : ?>
     266                                        <?php if ( is_nav_menu($nav_menu_selected_id) && current_theme_supports('nav-menus') ) : ?>
    240267                                                <div id="menu-container" class="postbox">
    241268                                                        <h3 class="hndle"><?php echo esc_html( $nav_menu_selected_title ); ?></h3>
    242269                                                        <div class="inside">
    243 
    244270                                                                <?php echo wp_get_nav_menu( array( 'context' => 'backend', 'menu' => $nav_menu_selected_id ) ); ?>
    245 
    246271                                                        </div><!-- /.inside -->
    247272                                                <!-- /#nav-menu-canvas .postbox-->
    248273                                                </div>
    249                                                 <script type="text/javascript">
    250                                                         wp_update_post_data();
    251                                                 </script>
    252274                                        <?php endif; ?>
    253275                                </div><!-- /#post-body-content-->
    … …  
    255277                        <div id="menu-settings-column" class="inner-sidebar">
    256278
    257                                 <?php do_meta_boxes( 'menus', 'side', null ); ?>
     279                                <?php do_meta_boxes( 'nav-menus', 'side', null ); ?>
    258280
    259281                        </div><!-- /#menu-settings-column -->
Note: See TracChangeset for help on using the changeset viewer.